首先,我知道这个例子并没有比单线程执行有明显的改进。我正在学习OpenMP的基础,我不知道为什么它不能像我预期的那样工作。
因此,我正在并行化传统的矩阵乘法算法,并找出哪些循环可以并行化,哪些不可以。算法是:
for (i = 0; i < SIZE; i++)
for (j = 0; j < SIZE; j++)
for (k = 0; k < SIZE; k = k + 1)
C[i][j] = C[i][j] + A[i][k] * B[k][j];
我知道在k循环中放置一个并行的for会导致意想不到的结果,所以我想使用一个关键部分来修复它,如下所示:
for (i = 0; i < SIZE; i++)
for (j = 0; j < SIZE; j++)
#pragma omp parallel for shared(C)
for (k = 0; k < SIZE; k = k + 1)
{
int tmp = A[i][k] * B[k][j];
#pragma omp critical
{
C[i][j] += tmp;
}
}
}
但是,当比较结果与下面的代码正确给我0。D是矩阵没有omp。我知道有更好的方法来做到这一点与减少,但我正在学习的关键部分,并想知道为什么这不工作。
int correct = 1;
for (i = 0; i < SIZE && correct; i++)
for (j = 0; j < SIZE && correct; j++)
if (C[i][j] != D[i][j])
correct = 0;
1条答案
按热度按时间snvhrwxg1#
我的代码中有两个相当基本的bug。