fixed thiersort2

This commit is contained in:
Richard Thier 2025-09-12 01:42:11 +02:00
parent a3643eba9b
commit 5a8f34efa0
3 changed files with 19 additions and 13 deletions

View File

@ -531,6 +531,7 @@ static inline TSU8 ts_radixi(
/* Should never happen */ /* Should never happen */
assert(false); assert(false);
return 0;
} }
/* Forward decl. */ /* Forward decl. */

View File

@ -46,24 +46,25 @@ static inline void thiersort2(uint32_t *arr, uint32_t *temparr, int n, sch_rand_
} }
/* Count */ /* Count */
#pragma GCC unroll 4 #pragma GCC unroll 64
for(int i = 0; i < 256; ++i) { for(int i = 0; i < 256; ++i) {
bucket[i] = 0; bucket[i] = 0;
} }
#pragma GCC unroll 4 #pragma GCC unroll 64
for(int i = 0; i < n; ++i) { for(int i = 0; i < n; ++i) {
++bucket[witch_bucket(arr[i])]; ++bucket[witch_bucket(arr[i])];
} }
/* Prefix sum (like in Magyarsort) */ /* Prefix sum (like in Magyarsort) */
uint32_t prev = 0; uint32_t prev = 0;
#pragma GCC unroll 4
for (int i = 0; i < 256; i++) { for (int i = 0; i < 256; i++) {
bucket[i] += prev; bucket[i] += prev;
prev = bucket[i]; prev = bucket[i];
} }
/* Save end-offsets */ /* Save end-offsets */
#pragma GCC unroll 4 #pragma GCC unroll 64
for(int i = 0; i < 256; ++i) { for(int i = 0; i < 256; ++i) {
bucket_end[i] = bucket[i]; bucket_end[i] = bucket[i];
} }
@ -98,13 +99,13 @@ static inline void thiersort2(uint32_t *arr, uint32_t *temparr, int n, sch_rand_
uint32_t pivot = temparr[i]; uint32_t pivot = temparr[i];
#pragma GCC unroll 4 #pragma GCC unroll 4
for(int j = begin + 1; j < end; ++j) { for(int j = begin + 1; j < end; ++j) {
if(temparr[j] == b) { if(temparr[j] == pivot) {
/* swap to front partition */ /* swap to front partition */
++i; ++i;
uint32_t tmp = temparr[i]; uint32_t tmp = temparr[i];
temparr[i] = temparr[j]; temparr[i] = temparr[j];
temparr[j] = tmp; temparr[j] = tmp;
} else if(temparr[j] < b) { } else if(temparr[j] < pivot) {
/* copy to left */ /* copy to left */
arr[smalli++] = temparr[j]; arr[smalli++] = temparr[j];
} else { } else {
@ -113,13 +114,15 @@ static inline void thiersort2(uint32_t *arr, uint32_t *temparr, int n, sch_rand_
} }
} }
/* Copy the mid elements back */ /* Copy the mid elements back */
#pragma GCC unroll 4 int target = smalli;
#pragma GCC unroll 64
for(int j = begin; j < i + 1; ++j) { for(int j = begin; j < i + 1; ++j) {
arr[smalli++] = temparr[j]; arr[target++] = temparr[j];
} }
/* Call schwabsort */ /* Call schwabsort - only to [begin..smalli) and (biggie..end) */
schwab_sort(arr, begin, end - 1, rstate); schwab_sort(arr, begin, smalli - 1, rstate);
schwab_sort(arr, biggi + 1, end - 1, rstate);
} }
} }

View File

@ -862,6 +862,7 @@ int main(void) {
//int n = 5000000; //int n = 5000000;
int n = 1000000; int n = 1000000;
//int n = 100000; //int n = 100000;
//int n = 20001;
//int n = 20000; //int n = 20000;
//int n = 1000; //int n = 1000;
//int n = 200; //int n = 200;
@ -889,6 +890,7 @@ int main(void) {
/* /*
w = v; w = v;
measure(inputtype, "ska", [&] { ska_sort(std::begin(w), std::end(w)); }); measure(inputtype, "ska", [&] { ska_sort(std::begin(w), std::end(w)); });
*/
w = v; w = v;
measure(inputtype, "ska_copy", [&] { measure(inputtype, "ska_copy", [&] {
std::vector<uint32_t> buf(w.size()); std::vector<uint32_t> buf(w.size());
@ -896,11 +898,14 @@ int main(void) {
w.swap(buf); w.swap(buf);
} }
}); });
*/
w = v; w = v;
measure(inputtype, "magyar", [&] { MagyarSort::sort<uint32_t>(&w[0], w.size()); }); measure(inputtype, "magyar", [&] { MagyarSort::sort<uint32_t>(&w[0], w.size()); });
assert(w == expected); assert(w == expected);
w = v;
measure(inputtype, "gptbuck", [&] { gpt_bucket_sort(&w[0], w.size()); });
assert(w == expected);
/* /*
w = v; w = v;
measure(inputtype, "mormord", [&] { mormord_sort(&w[0], w.size()); }); measure(inputtype, "mormord", [&] { mormord_sort(&w[0], w.size()); });
@ -925,9 +930,6 @@ int main(void) {
measure(inputtype, "sp", [&] { spsort(&w[0], w.size()); }); measure(inputtype, "sp", [&] { spsort(&w[0], w.size()); });
assert(w == expected); assert(w == expected);
w = v; w = v;
measure(inputtype, "gptbuck", [&] { gpt_bucket_sort(&w[0], w.size()); });
assert(w == expected);
w = v;
measure(inputtype, "gpt_qsort", [&] { gpt_quicksort(w); }); measure(inputtype, "gpt_qsort", [&] { gpt_quicksort(w); });
assert(w == expected); assert(w == expected);
w = v; w = v;