这是我天真的点积实现方式:
我运行了一些基准测试(代码在这里https://github.com/ijklr/sse),发现库的版本要慢得多。我的编译器标志是
float simple_dot(int N, float *A, float *B) {
float dot = 0;
for(int i = 0; i < N; ++i) {
dot += A[i] * B[i];
}
return dot;
}
这是使用C++库的代码:
float library_dot(int N, float *A, float *B) {
return std::inner_product(A, A+N, B, 0);
}
我运行了一些基准测试(代码在这里https://github.com/ijklr/sse),发现库的版本要慢得多。我的编译器标志是
-Ofast -march=native
。
0.0f
作为初始值。 - Kerrek SBstd::transform_reduce
吗?你甚至可以使用非顺序执行策略来进行向量化处理。 - wcochran