我有一个程序我试图使用OpenMP并行化 - 它对一些数据进行了非常大的循环。由于递增一个共享变量(因此我可以报告进度)是一个问题,我认为我将循环分解为更小的块,循环多次,并在最后报告状态/ openmp循环外部。
问题是,在OpenMP for循环第3次启动之前,程序会锁定。只是坐在那里,什么都不做。除了最简单的代码之外,我已经删除了所有代码。这是:
some other variable declarations for removed code above here
int dbl = 0;
int lasttime = 0;
int seedbase = 0;
const char *pl = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const double mm = 62.0 / 2147483647.0;
for(dbl = 0; dbl < 2048 && !abort; dbl++) {
seedbase = dbl; //(dbl * 2097152) - 2147483648;
printf("Loop %d %d\n", dbl, abort);
#pragma omp parallel for private(seed) shared(dbl)
for(seed = 0; seed < 20971; seed++) { //52
if(dbl == 2)
printf("oo\n");
}
if(abort)
break;
lasttime = time();
hps = (double)((dbl*2097152) * clk_tck) / (double)((times(&tms) - start_time));
printf("So far: %0.2fsec (%0.2fhps) %0.2f sec left\n", (double)(times(&tms) - start_time) / (double)clk_tck, hps, (((long)1 << 32) - (dbl * 2097152)) / hps);
}
}
编译运行时,我得到:
Loop 0 0
So far: 0.02sec (0.00hps) inf sec left
Loop 1 0
So far: 0.02sec (104857600.00hps) 40.94 sec left
Loop 2 0
^C
循环0开始,openmp运行(并且什么都不做)然后退出,&#34;到目前为止:&#34;打印出来。
循环1开始,同样的事情。
循环2开始,一切都挂起。 printf(&#34; oo&#34;);永远不会发生如果我将行更改为if(dbl&lt; = 2),则当循环运行时,我的屏幕将填充循环&#34; oo&#34;&#34;&#39;
但在种子循环第三次发生之前 - 它已经死了。只是坐在那里咀嚼CPU时间无所事事。
你能不能快速循环一个openmp循环?这是问题吗?我觉得很奇怪它总是在第3次运行之前停止,不管种子循环中的代码有多复杂(我删除了200行代码 - 它没有效果)