我有一个简单的关于使用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
,其中包含范围在[0,9]
内的10亿个随机整数。然后,代码循环遍历v
,计算每个不同整数的实例数量(即,在v中找到多少个1、多少个2等)。每次遇到特定整数时,通过递增向量
d
的相应元素来进行计数。因此,d[0]
计算有多少个零,d[6]
计算有多少个六,以此类推。到目前为止还清楚吗?我的问题是当我尝试将计数循环并行化时。没有
#pragma OpenMP
语句,我的代码需要20秒,但使用pragma
则需要超过60秒。显然,我误解了与OpenMP相关的某些概念(也许是数据共享/访问方式?)。请问有人能解释我的错误或指点一些关键字和有见地的文献来帮助我的搜索吗?