-rw-r--r-- 3509 djbsort-20260127/sortbench/bench.cc raw
#include <unistd.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <math.h> #include <assert.h> #include <algorithm> #include "cpucycles.h" @ @aspas: #include "aspas.h" @ @djbsort: #include "djbsort.h" @ @far: #include "avx2sort.h" @ @herf: #include "herf.h" @ @vqsort: #include "hwy/contrib/sort/algo-inl.h" @vqsort: #include "hwy/contrib/sort/vqsort.h" @ @vxsort: #include "vxsort_targets_enable_avx2.h" @vxsort: #include "vxsort.h" @vxsort: #include "vxsort.avx2.h" @vxsort: #include "machine_traits.avx2.h" @vxsort: #include "smallsort/bitonic_sort.avx2.h" @ @x86simdsort: #include "x86simdsort.h" @ @32: typedef int32_t sorttype; @64: typedef int64_t sorttype; @ #define N 131072 #define TIMINGS 64 typedef long long num; sorttype r[N] __attribute__((aligned(4096))); sorttype perm[TIMINGS+1][N] __attribute__((aligned(4096))); sorttype x[(TIMINGS+1)*(N+1)] __attribute__((aligned(4096))); sorttype y[N] __attribute__((aligned(4096))); num t[TIMINGS+1] __attribute__((aligned(4096))); int main() { @ @vqsort: auto s = hwy::Sorter(); @vqsort: hwy::SortAscending order; @vxsort: auto sorter = vxsort::vxsort<sorttype, vxsort::vector_machine::AVX2, 8>(); @ printf("cpucycles_version %s\n",cpucycles_version()); printf("cpucycles_implementation %s\n",cpucycles_implementation()); srandom(getpid()); for (num loop = 0;loop < 2;++loop) for (num j = 0;j <= TIMINGS;++j) t[j] = cpucycles(); printf("overhead"); for (num i = 0;i < TIMINGS;++i) printf(" %lld",t[i+1]-t[i]); printf("\n"); for (num j = 0;j <= TIMINGS;++j) for (num i = 0;i < N;++i) perm[j][i] = i; num randomized = 0; for (num npos = 0;;++npos) { num nposlow = npos%24; num nposhigh = npos/24; num n = round(exp2(nposhigh+round(27.75001*nposlow)/665)); if (n > N) break; num npad = n+!(n&1); @ @aspas: if (n < 16) continue; @herf: if (n < 64) continue; @ for (;randomized < n;++randomized) for (num j = 0;j <= TIMINGS;++j) { num pos = random()%(randomized+1); sorttype tmp = perm[j][pos]; perm[j][pos] = perm[j][randomized]; perm[j][randomized] = tmp; } for (num i = 0;i < n;++i) { r[i] = 0; for (num loop = 0;loop < 8;++loop) r[i] = (r[i]^(r[i]<<15))+random(); } for (num j = 0;j <= TIMINGS;++j) for (num i = 0;i < n;++i) x[j*npad+i] = r[perm[j][i]]; num sum = 0; for (num j = 0;j <= TIMINGS;++j) for (num i = 0;i < n;++i) sum += x[j*npad+i]; for (num j = 0;j <= TIMINGS;++j) t[j] = cpucycles(); for (num j = 0;j <= TIMINGS;++j) { sorttype *y; t[j] = cpucycles(); y = x+j*npad; @ @aspas: aspas::sort(y,n); @32: @djbsort: djbsort_int32(y,n); @64: @djbsort: djbsort_int64(y,n); @far: avx2::quicksort(y,n); @herf: herf_sort(y,n); @stdsort: std::sort(y,y+n); @vqsort: s(y,n,order); @vxsort: sorter.sort(y,y+n-1); @x86simdsort: x86simdsort::qsort(y,n,0); @ } for (num i = 0;i < n;++i) y[i] = r[i]; std::sort(y,y+n); for (num j = 0;j <= TIMINGS;++j) for (num i = 0;i < n;++i) assert(y[i] == x[j*npad+i]); for (num j = 0;j <= TIMINGS;++j) for (num i = 0;i < n;++i) sum -= x[j*npad+i]; assert(sum == 0); printf("%lld",n); for (num i = 0;i < TIMINGS;++i) printf(" %lld",t[i+1]-t[i]); printf("\n"); } return 0; } @ @vxsort: #include "vxsort_targets_disable.h" @