繁体   English   中英

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

[英]Strange parallel loop behaviour int v long int

我有一些代码是使用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类型。

但是,对于较大的primePos值,我发现InsertElement()引发异常,因为primePos很大,比可能在for循环中定义的可能大得多,for循环在PrimeDataT搜索primeFactor的位置。 通过将primePosint更改为long int ,可以纠正此问题(嗯,它可以编译并运行,并且对于低的ni值可以在mathematica中进行验证),但是我不知道为什么会这样,我想在继续之前知道些什么,以防万一我错过了重要的事情。

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

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

如果您遇到的问题是您的primePos设置为2 ^ 33之类的数字,则可能必须创建一种新方法来查找位置。

希望有帮助-J

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM