私は奇妙な出来事があり、それを実際に説明することはできません。私はいくつかの数値コードを書こうとしているので、いくつかの実装をベンチマークしています。私はちょうどSSEとAVXとベクトル自動追加といくつかのベクトル追加をベンチマークしたかった。これをテストするために、私は以下のコードを使用して修正しました。AVX、SSEの合計はgccの自動ベクトル化よりも遅い
コード:タイミングや計算GFLOP/Sの場合
#include <iostream>
#include <immintrin.h>
#include "../../time/timer.hpp"
void ser(double* a, double* b, double* res, int size){
for(int i(0); i < size; i++)
{
res[i] = a[i] + b[i];
}
}
void sse(double* a, double* b, double* res, int size){
for (int i(0); i < (size & ~0x1); i += 2)
{
const __m128d kA2 = _mm_load_pd(&a[i]);
const __m128d kB2 = _mm_load_pd(&b[i]);
const __m128d kRes = _mm_add_pd(kA2, kB2);
_mm_store_pd(&res[i], kRes);
}
}
void avx(double* a, double* b, double* res, int size){
for (int i(0); i < (size & ~0x3); i += 4)
{
const __m256d kA4 = _mm256_load_pd(&a[i]);
const __m256d kB4 = _mm256_load_pd(&b[i]);
const __m256d kRes = _mm256_add_pd(kA4, kB4);
_mm256_store_pd(&res[i], kRes);
}
}
#define N 1e7*64
int main(int argc, char const *argv[])
{
double* a = (double*)_mm_malloc(N*sizeof(double), 64);
double* b = (double*)_mm_malloc(N*sizeof(double), 64);
double* res = (double*)_mm_malloc(N*sizeof(double), 64);
Timer tm;
tm.start();
avx(a,b,res,N);
tm.stop();
std::cout<<"AVX\t"<<tm.elapsed()<<" ms\t"
<<1e-6*N/tm.elapsed() <<" GFLOP/s"<<std::endl;
tm.start();
sse(a,b,res,N);
tm.stop();
std::cout<<"SSE\t"<<tm.elapsed()<<" ms\t"
<<1e-6*N/tm.elapsed() <<" GFLOP/s"<<std::endl;
tm.start();
ser(a,b,res,N);
tm.stop();
std::cout<<"SER\t"<<tm.elapsed()<<" ms\t"
<<1e-6*N/tm.elapsed() <<" GFLOP/s"<<std::endl;
return 0;
}
、私が取得:はっきり本当に約170 GFLOP /秒ののpeak performanceに比べて遅い
./test3
AVX 1892 ms 0.338266 GFLOP/s
SSE 408 ms 1.56863 GFLOP/s
SER 396 ms 1.61616 GFLOP/s
私のi5 6600K。
ここで重要な情報がありません。私は、CPU上でのベクトルの追加は最善の考えではないことを知っていますが、これらの結果は実際には悪いことです。どんな手がかりもありがとう。
あなたは非常に一般的な(ただし明白ではない)ベンチマークミスをしました。あなたは 'malloc()'からメモリを初期化するのを忘れていました。 AVXテスト(最初に実行される)は実際にはページ違反です。 – Mysticial
これを修正すると、この問題が発生します。http://stackoverflow.com/questions/18159455/why-vectorizing-the-loop-does-not-have-performance-improvement – Mysticial
@ミスチカルな権利!私は今ホットメモリでベンチマークを行い、すべてのベクトル化でほぼ同じパフォーマンスを得ます!ありがとう。 –