我正在使用OpenMP线程函数运行程序。它适用于较小的问题大小,但在我增加问题大小时会在某个时刻出现段错误。
我读过这与堆栈溢出有关,但我的静态变量是固定大小的,所以我不会看到堆栈大小随问题大小而变化。示例代码如下:
float myfunc(float *bigArray1FromMain, float *bigArray2FromMain, int N)
{
// bigArray1FromMain has been malloc'd to accommodate N floats
#pragma omp parallel
{
int localArray[2];
int i;
#pragma omp for
for(i = 0; i < N; i++)
{
localArray[0] = someIndex(i);
localArray[1] = someIndex(i);
bigArray1FromMain[i] = bigArray2FromMain(localArray[0])
+ bigArray2FromMain(localArray[1]);
}
}
}
为什么此代码在N
增加时中断?我的理解是每个线程都有自己的localArray
和i
副本,这些副本需要3个整数。这不应随着问题的大小而改变。
如果localArray[0] or [1]
包含不同线程的相同整数,则两个线程可能同时访问bigArray2FromMain
的相同元素。但由于它没有被修改,我认为不应该是一个问题。这是否需要包含在atomic
或critical
条款中?
另一种可能性是someIndex()
是错误的,但我认为并非如此。
我错过了什么吗? 感谢。