我有这段代码
#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
答案 0 :(得分:1)
您的代码有两个我可以看到的问题:
rand_r()
,或者保护对rand()
的调用。 rand()
(可能是性能杀手)。无论如何,#pragma omp critical RNG
不适合认真工作。现在,并行性不起作用的原因是您编写了rand()
而不是#pragma omp shared(mfield) parallel
。
一旦修复,代码就会按预期生成线程。
答案 1 :(得分:0)
这似乎是与代码的fprintf部分相关的问题。如果我只对k-loop进行并行化就可以了。 OpenMP and File I/O显然也是这样说的。