OpenMP(C ++で)の使用について簡単な質問があります。誰かが私を助けてくれることを望んでいました。私の問題を説明するために、以下に小さな例を含めました。
#include<iostream>
#include<vector>
#include<ctime>
#include<omp.h>
using namespace std;
int main(){
srand(time(NULL));//Seed random number generator
vector<int>v;//Create vector to hold random numbers in interval [0,9]
vector<int>d(10,0);//Vector to hold counts of each integer initialized to 0
for(int i=0;i<1e9;++i)
v.push_back(rand()%10);//Push back random numbers [0,9]
clock_t c=clock();
#pragma omp parallel for
for(int i=0;i<v.size();++i)
d[v[i]]+=1;//Count number stored at v[i]
cout<<"Seconds: "<<(clock()-c)/CLOCKS_PER_SEC<<endl;
for(vector<int>::iterator i=d.begin();i!=d.end();++i)
cout<<*i<<endl;
return 0;
}
上記のコードはv
、範囲内に10億個のランダムな整数を含むベクトルを作成します[0,9]
。次に、コードv
は、それぞれの異なる整数のインスタンスの数をカウントすることでループします(つまり、vで見つかったインスタンスの数、2の数など)。
特定の整数が検出されるたびに、ベクトルの適切な要素をインクリメントすることによってカウントされますd
。したがって、d[0]
ゼロの数、6の数などd[6]
をカウントします。これまでのところ意味がありますか?
私の問題は、カウントループを並列にしようとしたときです。ステートメントがない#pragma OpenMP
場合、私のコードは20秒かかりますが、ステートメントがある場合は60秒pragma
以上かかります。
明らかに、私はOpenMPに関連するいくつかの概念を誤解しました(おそらくデータの共有/アクセス方法は?)。誰かが私のエラーを説明してくれませんか、または私の検索に役立つ適切なキーワードを含む洞察に満ちた文献の方向に私を向けてもらえますか?