gpt4 book ai didi

c++ - 使用 OpenMP 得到错误的结果

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:16 26 4
gpt4 key购买 nike

我编写了一个将 vector 乘以矩阵的程序。矩阵具有周期性重复的单元格,因此我使用一个临时变量在乘法之前对 vector 元素求和。相邻行的周期相同。我为每个线程创建一个单独的临时变量。 sizeof(InnerVector) == 400 并且我不想在每次迭代(= 600 次)时为其分配内存。

代码看起来像这样:

tempsSize = omp_get_max_threads();
InnerVector temps = new InnerVector[tempsSize];

for(int k = 0; k < tempsSize; k++)
InnerVector_init(temps[k]);

for(int jmin = 1, jmax = 2; jmax < matrixSize/2; jmin *= 2, jmax *= 2)
{
int period = getPeriod(jmax);

#pragma omp parallel
{
int threadNum = omp_get_thread_num();
// printf("\n threadNum = %i", threadNum);

#pragma omp for
for(int j = jmin; j < jmax; j++)
{
InnerVector_reset(temps[threadNum]);
for(int i = jmin; i < jmax; i++)
{
InnerMatrix cell = getCell(i, j);
if(temps[threadNum].IsZero)
for(int k = j; k < matrixSize; k += period)
InnerVector_add(temps[threadNum], temps[threadNum], v[k]);
InnerVector_add_mul(v_res[i], cell, temps[threadNum]);
}
}
}
}

代码看起来是正确的,但我得到了错误的结果。事实上,我在不同的运行中得到不同的结果......有时结果是正确的。

当我在 Debug模式下编译时,结果总是正确的。当我取消注释带有“printf”的行时,结果总是正确的。

附注我使用 Visual Studio 2010。

最佳答案

我怀疑可能存在数据竞争
InnerVector_add_mul(v_res[i], cell, temps[threadNum]);

因为 v_res 似乎是一个结果 vector ,并且 i 在每次迭代中从 jmin 变为 jmax在并行循环中,多个线程可能会为 i 的相同值写入 v_res[i],结果不可预测。

关于c++ - 使用 OpenMP 得到错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5846189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com