pragma omp for / parallel不工作?

时间:2016-10-24 13:37:36

标签: c parallel-processing openmp

我有这段代码

#define N 2048
int main(void)
{
    FILE *fp1;
    fp1=fopen("myfile.txt", "a");
    for(int i=0;i<N;i++)
    {
        #pragma omp parallel
        {
            int *x=malloc(sizeof(int)*N);
            int *xtemp=malloc(sizeof(int)*N);
            int (*adj)[N];
            adj=malloc(sizeof *adj *N);
            ...//other declarations
            #pragma omp for
            for(int k=0;k<100;k++)
            {
                /* do things involving x,xtemp, adj...*/
            }
            fprintf(fp1,"things \n");
            ... //free vectors part...
        }
    }
    fclose(fp1);
    return 0;
}

代码似乎运行良好,但是当我用htop检查我的cpu(带有超线程的i3双核)的使用情况时,我发现只有一个线程正在以100%运行。

所以我在我的代码中放了一些printf,看看我在终端上写了多少次,比如说:

#pragma omp parallel
 {
   printf("Hey, I'm inside the par zone!\n"); 
    .... 
 }

但似乎我每次只得到一个printf,所以我认为只有一个核心正在运行。我在pragma omp for部分之后尝试了同样的事情,但仍然遇到了同样的问题。

为什么pragma omp parallel似乎没有并行化?我尝试了一个更简单的程序(一个简单的hello world的并行化版本!)并且它可以工作,我得到的核心数字和我的核心数字一样多。

我试图将所有内容放在#pragma omp parallel for循环中,但是我遇到了分段错误 - 核心转储错误......

..............................

Here这是我的MCVE代码,它给出了同样的问题。 (对不起,缩进,但文件上传程序搞砸了)。 main之前的函数只是进行一些计算,使用rand(),没什么特别的。

我的编译行是:gcc -w -std=c99 MC.c -o try -lm -fopenmp -lquadmath -O3

2 个答案:

答案 0 :(得分:1)

您的代码有两个我可以看到的问题:

  • 并行使用全局随机数生成器。这本身就是问题的全部,但快速修复可能是使用每个线程的RND而不是全局rand_r(),或者保护对rand()的调用。 rand()(可能是性能杀手)。无论如何,#pragma omp critical RNG不适合认真工作。
  • 尝试在并行区域中关闭输出文件。

现在,并行性不起作用的原因是您编写了rand()而不是#pragma omp shared(mfield) parallel。 一旦修复,代码就会按预期生成线程。

答案 1 :(得分:0)

这似乎是与代码的fprintf部分相关的问题。如果我只对k-loop进行并行化就可以了。 OpenMP and File I/O显然也是这样说的。