0

我正在尝试在大量迭代中运行 openmp for 循环,当它循环的元素数量达到某个值(特别是 2147483647)时,它似乎死了。

在这个数量的元素上进行串行循环没有问题,所以我只能假设它与一些内部 openmp 索引有关。

示例代码:

int n = 33;
int tau = 0;
long long int maxVal = floor((pow(2,n)-2)/2);
#pragma omp parallel for shared(tau)
for(int i=2;i<=maxVal;i++){
    tau++;  
}

随着 n = 33 tau 不变,表明循环没有运行(并且没有 cpu 使用)。对于 n <33,它运行。

提前致谢!

4

1 回答 1

0

你所经历的是整数溢出。

2147483647是 32 位有符号 的最大值int。因此,对于任何nn < 33真的,floor((pow(2,n)-2)/2);评估为小于 的某个正值2147483647

从 开始n = 33,您将获得整数溢出,并且在 的特定实例中n = 33,结果是您将负值保存到maxValue

因此for(int i=2;i<=/*some negative value*/;i++),您永远不会进入循环体,因为2(i的第一个值) 大于所有负值。(在第一次检查i<=maxVal时返回。)false

您可以使用long long unsigned int在您可以处理的值上获得更大的高端。如果你溢出这个,你将不得不想出一些其他的解决方案。

于 2013-11-08T01:22:07.283 回答