【问题标题】:Strange parallel loop behaviour int v long int奇怪的并行循环行为 int v long int
【发布时间】: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。通过将primePosint 更改为long int,这已得到纠正(嗯,它编译并运行并且对于低值 n 我可以在数学中验证它是正确的),但我不知道为什么会这样在我继续之前我想知道,以防我遗漏了一些重要的东西。

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

【问题讨论】:

  • 2^33 在大多数系统上不适合 int。可能存在溢出问题。
  • 你在什么平台上。在某些情况下 int 与 long int 有时不一样

标签: c++ types integer openmp


【解决方案1】:

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

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

希望有所帮助 -J

【讨论】:

  • 嗨 J(和其他人)对不起,我应该澄清变量:赔率将是非常大的数字 primePos
  • 你能碰巧链接到那个算法吗,听起来你正在尝试使用 Eratosthenes 算法来寻找素数。 Here
  • 我正在使用这篇文章中的代码:tinyurl.com/kcdckmy 我怀疑这是问题所在(除非它引起一些复杂的连锁效应),因为 Mathematica 为 n = 提供了相同数量的素数33 作为我的代码,所以我认为 PrimeData 数组是正确的,PrimePos 计数器本身(它仅计算PrimeData 中的元素)很有趣。基本上问题是当我设置primePos = j时,它有时仍然返回primePos>PrimeDatL,尽管j只循环到PrimeDatL(除非我使用long int而不是int,这真的应该没有区别)
猜你喜欢
  • 2016-06-28
  • 2011-08-25
  • 2012-02-10
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多