【发布时间】:2017-05-10 16:36:16
【问题描述】:
请考虑使用以下简单代码对 parallel for 循环中的值求和:
int nMaxThreads = omp_get_max_threads();
int nTotalSum = 0;
#pragma omp parallel for num_threads(nMaxThreads) \
reduction(+:nTotalSum)
for (int i = 0; i < 4; i++)
{
nTotalSum += i;
cout << omp_get_thread_num() << ": nTotalSum is " << nTotalSum << endl;
}
当我在双核机器上运行它时,我得到的输出是
0: nTotalSum is 0
0: nTotalSum is 1
1: nTotalSum is 2
1: nTotalSum is 5
这向我表明关键部分,即nTotalSum 的更新,正在每个循环中执行。这似乎是一种浪费,因为每个线程所要做的就是计算它添加的值的“本地”总和,然后在它完成后用这个“本地总和”更新nTotalSum。
我对输出的解释是否正确,如果正确,我怎样才能使其更有效率?注意我尝试了以下方法:
#pragma omp parallel for num_threads(nMaxThreads) \
reduction(+:nTotalSum)
int nLocalSum = 0;
for (int i = 0; i < 4; i++)
{
nLocalSum += i;
}
nTotalSum += nLocalSum;
...但是编译器抱怨说它期望在pragma omp parallel for 语句之后出现for 循环...
【问题讨论】: