我正在嘗試對快速反平方根進行基準測驗。完整代碼在這里:
#include <benchmark/benchmark.h>
#include <math.h>
float number = 30942;
static void BM_FastInverseSqrRoot(benchmark::State &state) {
for (auto _ : state) {
// from wikipedia:
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
// y = y * ( threehalfs - ( x2 * y * y ) );
float result = y;
benchmark::DoNotOptimize(result);
}
}
static void BM_InverseSqrRoot(benchmark::State &state) {
for (auto _ : state) {
float result = 1 / sqrt(number);
benchmark::DoNotOptimize(result);
}
}
BENCHMARK(BM_FastInverseSqrRoot);
BENCHMARK(BM_InverseSqrRoot);
如果您想自己運行,這里是 quick-bench 中的代碼。
使用 GCC 11.2 和 -O3 編譯,BM_FastInverseSqrRoot 比 Noop 慢大約 31 倍(當我在我的機器上本地運行它時大約 10 ns)。使用 Clang 13.0 和 -O3 編譯,它比 Noop 慢大約 3.6 倍(當我在我的機器上本地運行它時大約 1 ns)。這是 10 倍的速度差異。
這是相關的程式集(取自快速作業臺)。
使用 GCC:
push %rbp
mov %rdi,%rbp
push %rbx
sub $0x18,%rsp
cmpb $0x0,0x1a(%rdi)
je 408c98 <BM_FastInverseSqrRoot(benchmark::State&) 0x28>
callq 40a770 <benchmark::State::StartKeepRunning()>
408c84 add $0x18,%rsp
mov %rbp,%rdi
pop %rbx
pop %rbp
jmpq 40aa20 <benchmark::State::FinishKeepRunning()>
nopw 0x0(%rax,%rax,1)
408c98 mov 0x10(%rdi),%rbx
callq 40a770 <benchmark::State::StartKeepRunning()>
test %rbx,%rbx
je 408c84 <BM_FastInverseSqrRoot(benchmark::State&) 0x14>
movss 0x1b386(%rip),%xmm4 # 424034 <_IO_stdin_used 0x34>
movss 0x1b382(%rip),%xmm3 # 424038 <_IO_stdin_used 0x38>
mov $0x5f3759df,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479741.html
