我记得OpenMp在并行写入文件时遇到一些麻烦,因此我编写了一个简单的测试程序,该程序为每次迭代创建文件,并在文件中计数到零。令人惊讶的是,它似乎有效! 如果我用top打开任务管理器,我总是看到只有一个cpu负载约为90%,而其他cpu约为1%-5%。是因为任务不是CPU繁重还是有问题(有时2-3 cpus上升到40%)?
测试程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<omp.h>
void print2file(char filename[],int i){
FILE *fp;
int j;
fp=fopen(strcat(filename,".txt"),"w");
for(j=i;j>=0;j--)
fprintf(fp,"%d\n",j);
fclose(fp);
}
int main(){
int i;
char test[12];
#pragma omp for
for(i=0;i<1000000000;i++){
sprintf(test,"%d",i);
//printf("test %d",i);
print2file(test,i);
}
}
答案 0 :(得分:2)
#pragma omp for
必须位于平行区域。在内部使用#pragma omp parallel
后接#pragma omp for
,或使用快捷方式#pragma omp parallel for
。
请注意,您需要i
和test
是线程局部变量,而不是共享变量,以防止数据争用。有很多方法可以实现此目的,例如在并行区域内声明这些变量,在OpenMP子句中将它们设置为private
/ firstprivate
,将它们设置为threadprivate
,等等。