我有一个关于使用 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 亿个随机整数 range [0,9]
。然后,代码循环v
计算每个不同整数有多少个实例(即,在v中找到多少个,有多少个二等)
每次遇到特定整数时,都会通过增加 vector 的适当元素来对其进行计数d
。所以,d[0]
计算有多少个零,d[6]
有多少个六,等等。到目前为止有意义吗?
我的问题是当我尝试使计数循环并行时。没有该#pragma OpenMP
语句,我的代码需要20秒,而使用60 多秒。pragma
显然,我误解了一些与 OpenMP 相关的概念(也许数据是如何共享/访问的?)。有人可以解释我的错误,或者用适当的关键字为我指明一些有见地的文献的方向来帮助我的搜索吗?