【发布时间】:2013-11-13 01:38:25
【问题描述】:
我有一些代码正在使用 OMP for 循环并行运行,最多可运行大量代码。代码(删除了不重要的部分)如下(如果它是一团糟/难以理解,请道歉):
long int primePos=-1;
unsigned long long int odd;
int primeFactor;
while(fileNumber<=nFiles)
{
percPrev=0;
compCounter=0;
#pragma omp parallel for shared(numberElements, iStart, iEnd,tau, wall0) schedule (guided) private(primePos,odd,primeFactor)
for(unsigned long long int i=iStart;i<=iEnd;i++){
#pragma omp atomic
tau++;
odd=2*i-1;
if(!IsPrime(odd)){
primeFactor = getPrimeFactor(odd);
for(long int j=0;j<PrimeDatL;j++){
if(PrimeDataT[j]==primeFactor){
primePos=j;
break;
}
}
#pragma omp critical
{
if(compCounter+1>numberElements){
cout<<"Array overflow, exiting."<<endl;
exit(0);
}
InsertElement(odd,primeFactor,pHVector,primePos);
compCounter++;
}
}
}
iStart=iEnd+1;
iEnd=min(iEnd+numberElements,maxVal);
fileNumber++;
}
我的想法是我遍历所有赔率直到2^n,如果它们不是素数,我会取最小的素数并将它与奇数一起放入以特定方式排列的向量中.变量primePos 只是表示它进入这个向量中的哪个点,并不是一个特别大的数字,所以它最初只是一个int 类型。
但是,对于较大的 n ~33 值,我发现 InsertElement() 会引发异常,因为 primePos 很大,比搜索 @ 位置的 for 循环中定义的可能大得多987654326@ 在PrimeDataT。通过将primePos 从int 更改为long int,这已得到纠正(嗯,它编译并运行并且对于低值 n 我可以在数学中验证它是正确的),但我不知道为什么会这样在我继续之前我想知道,以防我遗漏了一些重要的东西。
tl;dr = 如果将 primePos 声明为 int 而不是 long int,它如何取大于 PrimeDatL 的值?
提前致谢!
【问题讨论】:
-
2^33在大多数系统上不适合int。可能存在溢出问题。 -
你在什么平台上。在某些情况下 int 与 long int 有时不一样