我在使用OpenMP的C代码中遇到了一种奇怪的行为。以下代码段经常崩溃:
#define XLEN (5)
#define YLEN (5)
int do_something(void)
{
int c,d;
double data[YLEN][XLEN];
#pragma omp parallel for
for(c=0;c<XLEN;c++)
{
for(d=0;d<YLEN;d++)
{
/*
In the real code here I calculate a result which is a function of c and d, save it in a temporary variable and then write it in the critical section. However this is not necessary for this minimal example.
*/
#pragma omp critical
{
data[d][c]=0.0f;
}
}
}
return 0;
}
int main(void)
{
do_something();
}
我使用的是Mac OS X,我的代码是使用GCC(版本6,来自MacPorts)或Clang(版本3.8,也来自MacPorts)编译的。
答案 0 :(得分:0)
在发布后一分钟找到解决方案,d变量应在最外层循环内声明,如
int do_something(void)
{
int c;
double data[YLEN][XLEN];
#pragma omp parallel for
for(c=0;c<XLEN;c++)
{
int d;
for(d=0;d<YLEN;d++)
{
等...