我正在通过 Stampede 使用 Xeon Phi 解决 Collatz 猜想问题。我已经测试了我的代码已经过测试并且对于高达 100,000 的值可以正常工作,但是测试高达 100 万的值时,我几乎立即收到了分段错误(“SIGSEV”)。几天来我一直在用头撞墙,但根本无法弄清楚这个错误。任何帮助都非常感谢。
typedef unsigned long long bigInt;
// Number to test to (starting from 1)
#define bigSize 100000
typedef struct {
int numSteps;
bigInt stopPoint;
} batcher;
typedef struct {
bigInt num;
batcher to_batch;
} to_ret;
int main () {
//Stores values as [num][#steps to smaller val][smaller val]
to_ret retlist[bigSize];
//Stores values as [#steps to smaller val][smaller val], sorted by num
batcher results[bigSize];
...
#pragma offload target(mic:0) inout(retlist) shared(retlist)
{
#pragma omp parallel for
for(i = 1; i < bigSize; i++){
retlist[i].num = i + 1;
bigInt next = retlist[i].num;
int count = 0;
do {
count++;
if (next%2 == 1)
next=(3*next+1)/2;
else
next/=2;
} while(next > retlist[i].num);
retlist[i].to_batch.numSteps = count;
retlist[i].to_batch.stopPoint = next;
}
}
///Organizes data into a sorted array
#pragma omp parallel for
for (i = 0; i < bigSize; i++){
results[retlist[i].num - 1] = retlist[i].to_batch;
}
...
}
我非常有信心问题会出现在上面的代码段中。