1 #include "benchmarks/gpu/LibcGpuBenchmark.h" 2 3 #include "src/__support/CPP/array.h" 4 #include "src/__support/CPP/bit.h" 5 #include "src/__support/CPP/functional.h" 6 #include "src/__support/FPUtil/FPBits.h" 7 #include "src/math/sin.h" 8 #include "src/math/sinf.h" 9 #include "src/stdlib/rand.h" 10 11 #ifdef NVPTX_MATH_FOUND 12 #include "src/math/nvptx/declarations.h" 13 #endif 14 15 #ifdef AMDGPU_MATH_FOUND 16 #include "src/math/amdgpu/declarations.h" 17 #endif 18 19 // BENCHMARK() expects a function that with no parameters that returns a 20 // uint64_t representing the latency. Defining each benchmark using macro that 21 // expands to a lambda to allow us to switch the implementation of `sin()` to 22 // easily register NVPTX benchmarks. 23 #define BM_RANDOM_INPUT(T, Func, MIN_EXP, MAX_EXP, N) \ 24 []() { \ 25 return LIBC_NAMESPACE::benchmarks::MathPerf<T>::run_throughput_in_range< \ 26 N>(Func, MIN_EXP, MAX_EXP); \ 27 } 28 29 #define BENCH(T, Name, Func, MIN_EXP, MAX_EXP) \ 30 SINGLE_WAVE_BENCHMARK(LlvmLibcSinGpuBenchmark, Name##_1, \ 31 BM_RANDOM_INPUT(T, Func, MIN_EXP, MAX_EXP, 1)); \ 32 SINGLE_WAVE_BENCHMARK(LlvmLibcSinGpuBenchmark, Name##_128, \ 33 BM_RANDOM_INPUT(T, Func, MIN_EXP, MAX_EXP, 128)); \ 34 SINGLE_WAVE_BENCHMARK(LlvmLibcSinGpuBenchmark, Name##_1024, \ 35 BM_RANDOM_INPUT(T, Func, MIN_EXP, MAX_EXP, 1024)); \ 36 SINGLE_WAVE_BENCHMARK(LlvmLibcSinGpuBenchmark, Name##_4096, \ 37 BM_RANDOM_INPUT(T, Func, MIN_EXP, MAX_EXP, 4096)) 38 39 BENCH(double, Sin, LIBC_NAMESPACE::sin, -1023, 1023); 40 BENCH(double, SinTwoPi, LIBC_NAMESPACE::sin, -10, 3); 41 BENCH(double, SinTwoPow30, LIBC_NAMESPACE::sin, 0, 30); 42 BENCH(double, SinVeryLarge, LIBC_NAMESPACE::sin, 30, 1000); 43 44 #ifdef NVPTX_MATH_FOUND 45 BENCH(double, NvSin, LIBC_NAMESPACE::__nv_sin, -1023, 1023); 46 BENCH(double, NvSinTwoPi, LIBC_NAMESPACE::__nv_sin, -10, 3); 47 BENCH(double, NvSinTwoPow30, LIBC_NAMESPACE::__nv_sin, 0, 30); 48 BENCH(double, NvSinVeryLarge, LIBC_NAMESPACE::__nv_sin, 30, 1000); 49 #endif 50 51 #ifdef AMDGPU_MATH_FOUND 52 BENCH(double, AmdSin, LIBC_NAMESPACE::__ocml_sin_f64, -1023, 1023); 53 BENCH(double, AmdSinTwoPi, LIBC_NAMESPACE::__ocml_sin_f64, -10, 3); 54 BENCH(double, AmdSinTwoPow30, LIBC_NAMESPACE::__ocml_sin_f64, 0, 30); 55 BENCH(double, AmdSinVeryLarge, LIBC_NAMESPACE::__ocml_sin_f64, 30, 1000); 56 #endif 57 58 BENCH(float, Sinf, LIBC_NAMESPACE::sinf, -127, 128); 59 BENCH(float, SinfTwoPi, LIBC_NAMESPACE::sinf, -10, 3); 60 BENCH(float, SinfTwoPow30, LIBC_NAMESPACE::sinf, 0, 30); 61 BENCH(float, SinfVeryLarge, LIBC_NAMESPACE::sinf, 30, 120); 62 63 #ifdef NVPTX_MATH_FOUND 64 BENCH(float, NvSinf, LIBC_NAMESPACE::__nv_sinf, -127, 128); 65 BENCH(float, NvSinfTwoPi, LIBC_NAMESPACE::__nv_sinf, -10, 3); 66 BENCH(float, NvSinfTwoPow30, LIBC_NAMESPACE::__nv_sinf, 0, 30); 67 BENCH(float, NvSinfVeryLarge, LIBC_NAMESPACE::__nv_sinf, 30, 120); 68 #endif 69 70 #ifdef AMDGPU_MATH_FOUND 71 BENCH(float, AmdSinf, LIBC_NAMESPACE::__ocml_sin_f32, -127, 128); 72 BENCH(float, AmdSinfTwoPi, LIBC_NAMESPACE::__ocml_sin_f32, -10, 3); 73 BENCH(float, AmdSinfTwoPow30, LIBC_NAMESPACE::__ocml_sin_f32, 0, 30); 74 BENCH(float, AmdSinfVeryLarge, LIBC_NAMESPACE::__ocml_sin_f32, 30, 120); 75 #endif 76