0

我有一些使用 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() 抛出异常,因为它非常大,比搜索inprimePos位置的 for 循环中定义的可能大得多。这已通过从更改为纠正(好吧,它编译并运行,并且 ni 的低值可以在数学中验证它是正确的),但我不知道为什么会这样,我想知道在我之前继续,以防我遗漏了一些重要的东西。primeFactorPrimeDataTprimePosintlong int

inttl;dr = 如果将 primePos 声明为 an而不是,如何取大于 PrimeDatL 的值long int?提前致谢!

4

1 回答 1

0

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

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

希望有帮助-J

于 2013-11-13T02:01:14.157 回答