我有一个关于使用OpenMP(使用C)的简单问题,我希望有人可以帮助我.我在下面添加了一个小例子来说明我的问题.
#include
#include
#include
#include
using namespace std;
int main(){
srand(time(NULL));//Seed random number generator
vectorv;//Create vector to hold random numbers in interval [0,9]
vectord(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
d[v[i]]+=1;//Count number stored at v[i]
cout<
for(vector::iterator i=d.begin();i!=d.end();++i)
cout<
return 0;
}
上面的代码创建了一个向量v,它包含[0,9]范围内的10亿个随机整数.然后,代码循环通过v计算每个不同整数的实例数(即,在v中找到多少个,有多少两个,等等)
每次遇到特定整数时,通过递增向量d的适当元素来计算它.因此,d [0]计算多少个零,d [6]计算多少个六,依此类推.到目前为止有道理吗?
我的问题是当我尝试使计数循环并行时.如果没有#pragma OpenMP语句,我的代码需要20秒,但是使用pragma需要60秒.
很明显,我误解了一些与OpenMP相关的概念(也许是如何共享/访问数据的?).有人可以解释我的错误,或者指点我用一些有见识的文献和适当的关键词来帮我搜索?