Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenMP中矩阵的计算项_C_Openmp - Fatal编程技术网

C OpenMP中矩阵的计算项

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;

我对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;
    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) {