#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个相同的答案,或者随机值非常接近的较大块,以及一些非常接近的答案。
答案 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];
}
}
现在因为只有内部循环并行化,所以没有竞争条件。