[英]Why is std::inner_product slower than the naive implementation?
這是我對dot產品的天真實現:
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
)是int
。 將浮點數累積到int中不僅需要比累積到浮點數更長的時間,而且還會產生不同的結果。
原始循環代碼的等價物是使用初始值0.0f
,或等效float{}
。
(注意std::accumulate
在這方面非常相似。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.