【问题标题】:pragma omp for/parallel not working?pragma omp for/parallel 不起作用?
【发布时间】:2016-10-24 13:37:36
【问题描述】:

我有这个代码

#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

【问题讨论】:

  • 您是否使用支持 OpenMP 的编译器开关进行编译?例如,GCC 需要-fopenmp 才能使用 OpenMP 编译指示。同样,在运行代码之前,您是否将 OMP_NUM_THREADS 环境变量设置为任何值?
  • 是的,我使用 -fopenmp 编译,但没有设置 OMP_NUM_THREADS
  • 能否请您提供一个MCVE 来举例说明您的问题,以及您的编译命令行和执行命令?
  • 当然,我需要一些时间...只是一个问题,我必须编辑我的帖子还是发布答案?
  • 编辑帖子。答案是为了答案;)

标签: c parallel-processing openmp


【解决方案1】:

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

  • 并行使用全局随机数生成器。这本身就是一个充满问题的世界,但快速解决方法可能是使用像 rand_r() 这样的每线程 RND 而不是全局 rand(),或者使用 #pragma omp critical RNG 保护对 rand() 的调用(这可能是性能杀手)。无论如何,rand() 不适合从事严肃的工作。
  • 尝试关闭并行区域中的输出文件。

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

【讨论】:

  • 谢谢!哦,我的上帝,我不敢相信我整天都在试图找出错误。
  • 但这对编译器来说不是问题吗?他甚至没有警告我这件事。它如何解释#pragma omp shared(mfield) parallel
  • 来自 gcc 的手册页:“-w 禁止所有警告消息。”。只需尝试使用-Wall 进行编译,就会得到“mcve.c:130:0: warning: ignoring #pragma omp shared [-Wunknown-pragmas]”
【解决方案2】:

这似乎是与代码的 fprintf 部分有关的问题。如果我只并行化 k 循环,事情就很好了。 OpenMP and File I/O 显然也是这么说的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2021-08-20
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多