【发布时间】:2021-07-25 22:36:00
【问题描述】:
我正在研究 OpenMP,我有一些问题我相信会澄清我的想法。
我有一个矩阵乘法 A*B 的小例子,其中 A、B、C 是全局变量。我知道我们如何可以一次并行化 for 循环或同时并行化折叠,但我的问题是:
如果我使用 #pragma omp for 在哪个循环中,我应该忽略 check1 中的关键部分,因为 C 是一个全局变量,并且我应该在哪个循环中使用关键字 nowait 避免循环中的障碍,因为我知道#pragma omp for 它自动拥有它。当我试图编程这个嵌套的 for 循环时,我正在这样做:my_approach
int i,j,sum;
for(int i=0;i<N;i++) # loop1
for(j=0;j<N;j++){ #loop2
for(k=sum=0;k<N;k++) #loop3
sum += A[i][j]*B[k][J]
C[i][j] = sum # check1
};
我的方法
#pragma omp parallel num_threads(4)
{
#pragma omp for schedule(static) nowait // **one**
for(int i=0;i<N;i++) # loop1
for(j=0;j<N;j++){ #loop2
for(k=sum=0;k<N;k++) #loop3
sum += A[i][j]*B[k][J]
#pragma omp critical // **two**
C[i][j] = sum # check1
};
}
- 一个:我把“nowait”放在那里是因为代码运行得更快,我不知道原因或者我是否做出了正确的决定
- 两个:我使用关键部分来思考如何使用线程构建它。
所以让我们说这是正确的,如果并行化第二个 for 循环或第三个循环,我是否需要这些东西?如果有人可以在我需要添加关键部分时向我解释,或者如果我一次并行化这个嵌套的 for 循环,我将不胜感激!
【问题讨论】:
标签: c multithreading performance parallel-processing openmp