OpenMP Segfault

sen*_*cer 2 c malloc char openmp

我试图将OpenMP并行化添加到工作代码(只是一个for循环),但我无法摆脱分段错误.问题来自这条线:

pos += sprintf(com + pos, "%d ", i);
Run Code Online (Sandbox Code Playgroud)

com是一个字符数组,我尝试将其定义为char com[255]char *com = malloc(255*sizeof(char))for循环内部和之前.我在循环之前定义的时候添加private(com)#pragma omp parallel for指令com.我也尝试过初始化和使用firstprivate.(pos是一个整数,初始化为0)

当我不添加-fopenmp一切工作正常,但与-fopenmp它给出segfault.我错过了什么?

Hri*_*iev 5

分段错误来自多个线程同时更新值pos,因此将其设置为某个值,该值变为com + pos指向分配的内存之外或之前的指针com.并行化这种循环的正确方法是将私有字符串中的值连接起来,然后以有序的方式连接私有字符串:

char com[255];
int pos = 0;

#pragma omp parallel
{
   char mycom[255];
   int mypos = 0;

   #pragma omp for schedule(static) nowait
   for (int i = 0; i < N; i++)
      mypos += sprintf(mycom + mypos, "%d ", i);

   // Concatenate the strings in an ordered fashion
   #pragma omp for schedule(static) ordered
   for (int i = 0; i < omp_get_num_threads(); i++)
   {
      #pragma omp ordered
      pos += sprintf(com + pos, "%s", mycom);
   }
}
Run Code Online (Sandbox Code Playgroud)

ordered构造确保了正确的同步,因此不需要critical.使用schedule(static)很重要,以保证每个线程处理迭代空间的单个连续部分.