【发布时间】: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