OpenMPでSIMD指令をテストするためにこれらのコードを試しました。なぜ私のOpenMP simdディレクティブは何も使用していませんか?
#include <iostream>
#include <sys/time.h>
#include <cmath>
#define N 4096
#define M 1000
using namespace std;
int main()
{
timeval start,end;
float a[N],b[N];
for(int i=0;i<N;i++)
b[i]=i;
gettimeofday(&start,NULL);
for(int j=0;j<M;j++)
{
#pragma omp simd
for(int i=0;i<N;i++)
a[i]=pow(b[i],2.1);
}
gettimeofday(&end,NULL);
int time_used=1000000*(end.tv_sec-start.tv_sec)+(end.tv_usec-start.tv_usec);
cout<<"time_used="<<time_used<<endl;
return 1;
}
しかし、どちらか、私は
g++ -fopenmp simd.cpp
または
g++ simd.cpp
で私が使用したSIMDディレクティブがないように、ほぼsame.Itが見えている "time_used" のための彼らの報告書を、それをコンパイル何か使いますか? ありがとう!
追加質問: 私は
a[i]=b[i]+2.1;
によって
a[i]=pow(b[i],2.1);
を交換し、私は
g++ -fopenmp simd.cpp
することによって、それらをコンパイルするときに "time_used" の出力を約12000 ときです私はそれらをコンパイルします
g++ simd.cpp
「time_used」の出力は、以前とほぼ同じ12000です。
マイコンピュータ:ハスウェルi5,8g RAM、Ubuntuのは、GCC 5.4.0
関数呼び出しは、関数がSIMD呼び出しのために明示的にコンパイルされるまでベクトル化されません。そして、 'std :: pow'はおそらくその複雑さが単純な加算/乗算のレベルではないからではありません。... Btw:測定時間を"ほぼ同じ "と非常に曖昧にしてください。 – Shadow
これまでのコメントのヒントとして、このような場合にはベクトル化の利点を得るために、Intel C++によって提供されるsimd mathライブラリが必要です。 – tim18
@Shadow私はfuncion "pow"を単純な追加に変更しますが、以前のように加速はしません。 – manus7