并行化时的不同答案

时间:2017-12-04 02:30:58

标签: c++ parallel-processing openmp

#pragma omp parallel for    
for (int i = 0; i <500; i++)
   for (j=i; j < 102342; j++)
    {
      Output[j] += staticConstant[i] * data[j-i];
    }
}

一些矢量答案是相同的,有些是不同的。这可能是什么原因?起初我以为它可能是浮动的,所以我将所有东西都转换为双打。将会有5-6个相同的答案,或者随机值非常接近的较大块,以及一些非常接近的答案。

2 个答案:

答案 0 :(得分:1)

您有多个线程写入Output[j]。这会导致竞争状况。一个线程写入的值被另一个具有不同值的线程替换。

答案 1 :(得分:1)

问题是你的内部循环有写入竞争条件,因此,例如,以下两个语句可以并行发生:

Output[42] = Output[42] + staticConstant[9] * data[42-9];
Output[42] = Output[42] + staticConstant[19] * data[42-19];

每行代码归结为:

Load O[42] to R1
Load C[] to R2
Add R2 to R1
Store R1 to O[42]

但是,并行程序可能会导致代码运行如下:

Load O[42] to R1
Load O[42] to R3
Load C[9] to R2
Load C[19] to R4
Add R2 to R1
Add R4 to R3
Store R1 to O[42]
Store R3 to O[42]

正如您可能看到的那样,在添加Load O[42]C[9]之前,两条C[19]行加载了该值,因此有效地忽略了第一个计算。

最简单的解决方法是:

for (int i = 0; i <500; i++)
{
#pragma omp parallel for    
   for (j=i; j < 102342; j++)
    {
      Output[j] += staticConstant[i] * data[j-i];
    }
}

现在因为只有内部循环并行化,所以没有竞争条件。