From 645bc19f19cf8791bcb483dfeb1e1e75292ab2e1 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Fri, 17 Dec 2021 22:48:38 +0100 Subject: [PATCH] Manual occurence unrolling --- magyarsort.h | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/magyarsort.h b/magyarsort.h index ab098a0..5efb391 100644 --- a/magyarsort.h +++ b/magyarsort.h @@ -93,12 +93,80 @@ namespace MagyarSort { template static inline void countOccurences(uint32_t arr[], COUNTER_TYP size, COUNTER_TYP *radicsOut) noexcept { - #pragma GCC unroll 64 - for(COUNTER_TYP i = 0; i < size; ++i) { + // #pragma GCC unroll 64 + COUNTER_TYP i = 0; + for(; i < size - 64; i += 64) { // Prefetch caches //__builtin_prefetch(&arr[i + 64]); // Creates no object, struct is empty OccurenceMagic(arr, i, radicsOut); + OccurenceMagic(arr, i + 1, radicsOut); + OccurenceMagic(arr, i + 2, radicsOut); + OccurenceMagic(arr, i + 3, radicsOut); + OccurenceMagic(arr, i + 4, radicsOut); + OccurenceMagic(arr, i + 5, radicsOut); + OccurenceMagic(arr, i + 6, radicsOut); + OccurenceMagic(arr, i + 7, radicsOut); + OccurenceMagic(arr, i + 8, radicsOut); + OccurenceMagic(arr, i + 9, radicsOut); + OccurenceMagic(arr, i + 10, radicsOut); + OccurenceMagic(arr, i + 11, radicsOut); + OccurenceMagic(arr, i + 12, radicsOut); + OccurenceMagic(arr, i + 13, radicsOut); + OccurenceMagic(arr, i + 14, radicsOut); + OccurenceMagic(arr, i + 15, radicsOut); + OccurenceMagic(arr, i + 16, radicsOut); + OccurenceMagic(arr, i + 17, radicsOut); + OccurenceMagic(arr, i + 18, radicsOut); + OccurenceMagic(arr, i + 19, radicsOut); + OccurenceMagic(arr, i + 20, radicsOut); + OccurenceMagic(arr, i + 21, radicsOut); + OccurenceMagic(arr, i + 22, radicsOut); + OccurenceMagic(arr, i + 23, radicsOut); + OccurenceMagic(arr, i + 24, radicsOut); + OccurenceMagic(arr, i + 25, radicsOut); + OccurenceMagic(arr, i + 26, radicsOut); + OccurenceMagic(arr, i + 27, radicsOut); + OccurenceMagic(arr, i + 28, radicsOut); + OccurenceMagic(arr, i + 29, radicsOut); + OccurenceMagic(arr, i + 30, radicsOut); + OccurenceMagic(arr, i + 31, radicsOut); + OccurenceMagic(arr, i + 32, radicsOut); + OccurenceMagic(arr, i + 33, radicsOut); + OccurenceMagic(arr, i + 34, radicsOut); + OccurenceMagic(arr, i + 35, radicsOut); + OccurenceMagic(arr, i + 36, radicsOut); + OccurenceMagic(arr, i + 37, radicsOut); + OccurenceMagic(arr, i + 38, radicsOut); + OccurenceMagic(arr, i + 39, radicsOut); + OccurenceMagic(arr, i + 40, radicsOut); + OccurenceMagic(arr, i + 41, radicsOut); + OccurenceMagic(arr, i + 42, radicsOut); + OccurenceMagic(arr, i + 43, radicsOut); + OccurenceMagic(arr, i + 44, radicsOut); + OccurenceMagic(arr, i + 45, radicsOut); + OccurenceMagic(arr, i + 46, radicsOut); + OccurenceMagic(arr, i + 47, radicsOut); + OccurenceMagic(arr, i + 48, radicsOut); + OccurenceMagic(arr, i + 49, radicsOut); + OccurenceMagic(arr, i + 50, radicsOut); + OccurenceMagic(arr, i + 51, radicsOut); + OccurenceMagic(arr, i + 52, radicsOut); + OccurenceMagic(arr, i + 53, radicsOut); + OccurenceMagic(arr, i + 54, radicsOut); + OccurenceMagic(arr, i + 55, radicsOut); + OccurenceMagic(arr, i + 56, radicsOut); + OccurenceMagic(arr, i + 57, radicsOut); + OccurenceMagic(arr, i + 58, radicsOut); + OccurenceMagic(arr, i + 59, radicsOut); + OccurenceMagic(arr, i + 60, radicsOut); + OccurenceMagic(arr, i + 61, radicsOut); + OccurenceMagic(arr, i + 62, radicsOut); + OccurenceMagic(arr, i + 63, radicsOut); + } + + for(; i < size; ++i) { + OccurenceMagic(arr, i, radicsOut); } }