C语言 OpenMP Segfault



我正试图将OpenMP并行化添加到工作代码中(仅添加到单个for循环中),但我无法消除分段错误。问题来自这条线:

pos += sprintf(com + pos, "%d ", i);

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

当我不添加-fopenmp时,一切都很好,但使用-fopenmp会产生segfault。我错过了什么?

分段错误来自多个线程同时更新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);
   }
}

CCD_ 17结构确保了适当的同步,因此不需要CCD_。为了保证每个线程处理迭代空间的单个连续部分,schedule(static)的使用是重要的。

相关内容

  • 没有找到相关文章