C语言 OpenMP临界区矩阵乘法

rdrgkggo  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(124)

首先,我知道这个例子并没有比单线程执行有明显的改进。我正在学习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;
snvhrwxg

snvhrwxg1#

我的代码中有两个相当基本的bug。

  • tmp变量在应该是double的时候是int。
  • 将tmp改为double后,两个double之间的比较不是关联的,比较时应考虑epsilon。

相关问题