奇怪的并行循环行为 int v long int
Strange parallel loop behaviour int v long int
我有一些代码,我正在使用OMP for loop并行运行,最多很多。代码(删除了不重要的位)如下(如果一团糟/难以遵循,请道歉):
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
因为它很大,比搜索 primeFactor
在 PrimeDataT
中的位置的 for 循环中定义的那样大得多。通过将primePos
从 int
更改为 long int
来纠正(好吧,它可以编译和运行,对于 n 的低值,我可以在数学中验证它是否正确),但我不知道为什么会这样,我想知道在我继续之前,以防我错过了一些重要的东西。
tl;dr = 如果 primePos 被声明为 int
而不是 long int
,它怎么能取大于 PrimeDatL 的值?提前感谢!
一旦int
达到大于 2,147,483,647 的值,它将开始从 -2,147,483,648 开始计数"向上",int
只是 32 位,不能大于负值的一半。
如果您遇到的问题是您的 primePos 被设置为类似 2^33 的数字,您可能需要创建一种新的方法来查找位置。
希望有帮助-J
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ vector::size_type:有符号与无符号;int vs. long
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 函数参数可以是char*、long或int.可能吗
- unsigned int/signed int/long-long:无法解释的输出
- 如何在C++中将二进制文件上下文转换为 int/long 值
- <int> <long> 当它们的大小相同时,将矢量转换为矢量?
- " long unsigned typedef int long ullong; "是什么意思?
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 使用非固定整数(int, long)而不是固定大小的整数(int64_t, int32_t)有什么优势吗?