奇怪的并行循环行为int v long int

时间:2013-11-13 01:38:26

标签: c++ types integer openmp

我有一些代码我使用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循环中定义的大得多,后者搜索位置primeFactor中的PrimeDataT。通过将primePosint更改为long int,这已得到纠正(好吧,它编译并运行并且对于ni的低值可以在mathematica中验证它是正确的),但我不知道为什么会出现这种情况,我想在继续之前知道,如果我遗漏了一些重要的事情。

tl; dr =如果primePos被声明为int而不是long int,那么primePos如何获取大于PrimeDatL的值? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

一旦int达到大于2,147,483,647的值,它将从-2,147,483,648开始计数“上升”int只是32位,并且不能大于负值的一半

如果你遇到的问题是你的primePos被设置为2 ^ 33这样的数字,你可能需要创建一种新的方法来找到这个位置。

希望有所帮助 -J