C OpenMP中矩阵的计算项
我对openMP非常陌生,但我正试图编写一个简单的程序来并行生成矩阵条目,即对于N×M矩阵a,让a(I,j)=I*j。下面是一个简单的例子:C OpenMP中矩阵的计算项,c,openmp,C,Openmp,我对openMP非常陌生,但我正试图编写一个简单的程序来并行生成矩阵条目,即对于N×M矩阵a,让a(I,j)=I*j。下面是一个简单的例子: #include <stdio.h> #include <stdlib.h> #include <omp.h> int main(int argc, char **argv) { int i, j, N, M; N = 20; M = 20; int* A;
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main(int argc,
char **argv)
{
int i, j, N, M;
N = 20;
M = 20;
int* A;
A = (int*) calloc(N*M, sizeof(int));
// compute entries of A in parallel
#pragma omp parallel for shared(A)
for (i = 0; i < N; ++i){
for (j = 0; j < M; ++j){
A[i*M + j] = i*j;
}
}
// print parallel results
for (i = 0; i < N; ++i){
for (j = 0; j < M; ++j){
printf("%d ", A[i*M + j]);
}
printf("\n");
}
free(A);
return 0;
}
#包括
#包括
#包括
int main(int argc,
字符**argv)
{
int i,j,N,M;
N=20;
M=20;
int*A;
A=(int*)calloc(N*M,sizeof(int));
//并行计算
#用于共享的pragma omp并行(A)
对于(i=0;i
结果并不总是正确的。理论上,我只是并行化外部循环,for循环的每次迭代都不会修改其他迭代将修改的条目。但我不知道如何将其转换为openMP。当对向量数组执行类似的过程时(即循环只有一个),似乎没有问题,例如
#pragma omp parallel for
for (i = 0; i < N; ++i)
{
v[i] = i*i;
}
#pragma omp parallel for
对于(i=0;i
有人能给我解释一下如何解决这个问题吗?根据例如这个在并行部分之外声明变量是危险的。
它可以通过显式地将内部循环的循环变量设置为私有来消除 为此,改变这个
#pragma omp parallel for shared(A)
到
这种情况下的问题是
j
在线程之间共享,这会干扰内部循环的控制流。默认情况下,在并行区域外部声明的变量是共享的,而在并行区域内部声明的变量是私有的
遵循一般规则,尽可能在本地声明变量。在for循环中,这意味着:
#pragma omp parallel for
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
#pragma omp parallel for
对于(int i=0;i
这使得关于代码的推理变得更加容易——OpenMP代码在默认情况下基本正确。(注意A
在默认情况下是共享的,因为它是在外部定义的)
或者,您可以手动指定
private(i,j)shared(A)
-这更明确,可以帮助初学者。但是它会造成冗余,也可能是危险的:私有的
变量是未初始化的,即使它们在并行区域之外有一个有效值。因此,我强烈推荐隐式默认方法,除非高级使用需要。这个问题仅仅是ccur与并行?或者它在一个简单的程序中也有错误的结果?这个博客似乎是对的。我想知道嵌套循环是如何同步的,但还没有到private(j)
部分。(我从一篇很长很长的文章开始——很好的历史文章:)
#pragma omp parallel for
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {