diff --git a/benchmarks/bench-argsort.hpp b/benchmarks/bench-argsort.hpp index 0546d7c4..419bed13 100644 --- a/benchmarks/bench-argsort.hpp +++ b/benchmarks/bench-argsort.hpp @@ -45,8 +45,30 @@ static void simdargsort(benchmark::State &state, Args &&...args) } } +template +static void simd_ordern_argsort(benchmark::State &state, Args &&...args) +{ + // get args + auto args_tuple = std::make_tuple(std::move(args)...); + size_t arrsize = std::get<0>(args_tuple); + std::string arrtype = std::get<1>(args_tuple); + // set up array + std::vector arr = get_array(arrtype, arrsize); + std::vector arg(arrsize); + std::iota(arg.begin(), arg.end(), 0); + // benchmark + for (auto _ : state) { + std::vector arr_bkp = arr; + x86simdsort::keyvalue_qsort(arr_bkp.data(), arg.data(), arrsize); + state.PauseTiming(); + std::iota(arg.begin(), arg.end(), 0); + state.ResumeTiming(); + } +} + #define BENCH_BOTH(type) \ BENCH_SORT(simdargsort, type) \ + BENCH_SORT(simd_ordern_argsort, type) \ BENCH_SORT(scalarargsort, type) BENCH_BOTH(int64_t) diff --git a/benchmarks/bench-ipp.cpp b/benchmarks/bench-ipp.cpp new file mode 100644 index 00000000..d9d2abe1 --- /dev/null +++ b/benchmarks/bench-ipp.cpp @@ -0,0 +1,85 @@ +#include "bench.h" +#include "ipp.h" + +template +static void ippsort(benchmark::State &state, Args &&...args) +{ + auto args_tuple = std::make_tuple(std::move(args)...); + size_t arrsize = std::get<0>(args_tuple); + /* IPP set up */ + int bufsize = 10; + if constexpr (std::is_same_v) { + ippsSortRadixGetBufferSize(arrsize, ipp32f, &bufsize); + } + else if constexpr (std::is_same_v) { + ippsSortRadixGetBufferSize(arrsize, ipp64f, &bufsize); + } + unsigned char *temp = new unsigned char[bufsize]; + + // Get args + std::string arrtype = std::get<1>(args_tuple); + // set up array + std::vector arr = get_array(arrtype, arrsize); + std::vector arr_bkp = arr; + // benchmark + for (auto _ : state) { + if constexpr (std::is_same_v) { + ippsSortRadixAscend_32f_I(arr.data(), arrsize, temp); + } + else if constexpr (std::is_same_v) { + ippsSortRadixAscend_64f_I(arr.data(), arrsize, temp); + } + state.PauseTiming(); + arr = arr_bkp; + state.ResumeTiming(); + } +} + +template +static void ippargsort(benchmark::State &state, Args &&...args) +{ + auto args_tuple = std::make_tuple(std::move(args)...); + size_t arrsize = std::get<0>(args_tuple); + /* IPP set up */ + int bufsize = 10; + if constexpr (std::is_same_v) { + ippsSortRadixIndexGetBufferSize(arrsize, ipp32f, &bufsize); + } + else if constexpr (std::is_same_v) { + ippsSortRadixIndexGetBufferSize(arrsize, ipp64f, &bufsize); + } + else if constexpr (std::is_same_v) { + ippsSortRadixIndexGetBufferSize(arrsize, ipp32s, &bufsize); + } + unsigned char *temp = new unsigned char[bufsize]; + + // set up array + std::string arrtype = std::get<1>(args_tuple); + std::vector arr = get_array(arrtype, arrsize); + std::vector arr_bkp = arr; + std::vector arg(arrsize); + std::iota(arg.begin(), arg.end(), 0); + + // benchmark + for (auto _ : state) { + if constexpr (std::is_same_v) { + ippsSortRadixIndexAscend_32f(arr.data(), 4, arg.data(), arrsize, temp); + } + else if constexpr (std::is_same_v) { + ippsSortRadixIndexAscend_64f(arr.data(), 8, arg.data(), arrsize, temp); + } + else if constexpr (std::is_same_v) { + ippsSortRadixIndexAscend_32s(arr.data(), 4, arg.data(), arrsize, temp); + } + state.PauseTiming(); + arr = arr_bkp; + std::iota(arg.begin(), arg.end(), 0); + state.ResumeTiming(); + } +} + +BENCH_SORT(ippsort, double) +BENCH_SORT(ippsort, float) +BENCH_SORT(ippargsort, double) +BENCH_SORT(ippargsort, float) +BENCH_SORT(ippargsort, int32_t) diff --git a/benchmarks/bench-qsort.hpp b/benchmarks/bench-qsort.hpp index f95b05ba..4d974929 100644 --- a/benchmarks/bench-qsort.hpp +++ b/benchmarks/bench-qsort.hpp @@ -36,9 +36,10 @@ static void simdsort(benchmark::State &state, Args &&...args) } } + #define BENCH_BOTH_QSORT(type) \ BENCH_SORT(simdsort, type) \ - BENCH_SORT(scalarsort, type) + BENCH_SORT(scalarsort, type) \ BENCH_BOTH_QSORT(uint64_t) BENCH_BOTH_QSORT(int64_t) diff --git a/benchmarks/bench.h b/benchmarks/bench.h index 6e160078..076e919d 100644 --- a/benchmarks/bench.h +++ b/benchmarks/bench.h @@ -27,6 +27,8 @@ func, type, random_1m, 1000000, std::string("random")); \ MY_BENCHMARK_CAPTURE( \ func, type, random_10m, 10000000, std::string("random")); \ + MY_BENCHMARK_CAPTURE( \ + func, type, random_100m, 100000000, std::string("random")); \ MY_BENCHMARK_CAPTURE( \ func, type, smallrange_128, 128, std::string("smallrange")); \ MY_BENCHMARK_CAPTURE( \ diff --git a/benchmarks/meson.build b/benchmarks/meson.build index 65022395..34e9ca71 100644 --- a/benchmarks/meson.build +++ b/benchmarks/meson.build @@ -9,8 +9,8 @@ libbench += static_library('bench_qsort', cpp_args : ['-O3'], ) -if fs.is_file('highway/hwy/contrib/sort/vqsort-inl.h') - hwy = include_directories('highway') +if benchvq and fs.is_file('../highway/hwy/contrib/sort/vqsort-inl.h') + hwy = include_directories('../highway') libbench += static_library('bench_vqsort', files( 'bench-vqsort.cpp', @@ -20,3 +20,14 @@ if fs.is_file('highway/hwy/contrib/sort/vqsort-inl.h') cpp_args : ['-O3', '-march=native'], ) endif + +if benchipp + libbench += static_library('bench_ippsort', + files( + 'bench-ipp.cpp', + ), + dependencies: gbench_dep, + include_directories : [src, lib, utils], + cpp_args : ['-O3', '-march=native'], + ) +endif diff --git a/meson.build b/meson.build index ab53f218..873094ba 100644 --- a/meson.build +++ b/meson.build @@ -10,6 +10,20 @@ bench = include_directories('benchmarks') utils = include_directories('utils') tests = include_directories('tests') +# Add IPP sort to benchmarks: +benchipp = false +ipplink = [] +if get_option('build_ippbench') + benchipp = true + ipplink = ['-lipps', '-lippcore'] +endif + +# Add google vqsort to benchmarks: +benchvq = false +if get_option('build_vqsortbench') + benchvq = true +endif + fp16code = '''#include int main() { __m512h temp = _mm512_set1_ph(1.0f); @@ -50,13 +64,14 @@ if get_option('build_tests') endif # Build benchmarking suite if option build_benchmarks is set to true + if get_option('build_benchmarks') gbench_dep = dependency('benchmark', required : true, static: false) subdir('benchmarks') benchexe = executable('benchexe', include_directories : [src, lib, utils, bench], dependencies : [gbench_dep], - link_args: ['-lbenchmark_main'], + link_args: ['-lbenchmark_main', ipplink], link_whole : [libbench], link_with : libsimdsort, ) diff --git a/meson_options.txt b/meson_options.txt index e15c1fcb..6bf19447 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -2,3 +2,7 @@ option('build_tests', type : 'boolean', value : false, description : 'Build test suite (default: "false").') option('build_benchmarks', type : 'boolean', value : false, description : 'Build benchmarking suite (default: "false").') +option('build_ippbench', type : 'boolean', value : false, + description : 'Add IPP sort to benchmarks (default: "false").') +option('build_vqsortbench', type : 'boolean', value : false, + description : 'Add google vqsort to benchmarks (default: "false").') diff --git a/run-bench.py b/run-bench.py index 86c40e01..64f2d02e 100644 --- a/run-bench.py +++ b/run-bench.py @@ -23,7 +23,13 @@ if args.benchcompare: baseline = "" contender = "" - if "vqsort" in args.benchcompare: + if "ippsort" in args.benchcompare: + baseline = "ippsort.*" + filterb + contender = "simdsort.*" + filterb + elif "ippargsort" in args.benchcompare: + baseline = "ippargsort.*" + filterb + contender = "simd_ordern_argsort.*" + filterb + elif "vqsort" in args.benchcompare: baseline = "vqsort.*" + filterb contender = "simdsort.*" + filterb elif "qsort" in args.benchcompare: diff --git a/scripts/bench-compare.sh b/scripts/bench-compare.sh index 106e0afc..a224acd0 100755 --- a/scripts/bench-compare.sh +++ b/scripts/bench-compare.sh @@ -11,7 +11,7 @@ if [ ! -d .bench/google-benchmark ]; then fi compare=$(realpath .bench/google-benchmark/tools/compare.py) -meson setup -Dbuild_benchmarks=true --warnlevel 0 --buildtype release builddir-${branch} +meson setup -Dbuild_benchmarks=true -Dbuild_ippbench=true --warnlevel 0 --buildtype release builddir-${branch} cd builddir-${branch} ninja $compare filters ./benchexe $1 $2 --benchmark_repetitions=$3