0

我正在尝试使用 OpenMP 任务将两个矩阵相乘。这是一个基本代码:

long i, j, k;

   for (i = 0; i < N; i ++)
      for (j = 0; j < N; j ++)
         for (k = 0; k < N; k ++)
            c[i * N + j] += a[i * N + k] * b[k * N + j];

所以,我想在列级别使用任务,然后我修改了这样的代码:

   long i, j, k;
#pragma omp parallel 
{
   #pragma omp single
   {
   for (i = 0; i < N; i ++)
     #pragma omp task private(i, j, k)
     {
      for (j = 0; j < N; j ++)
         for (k = 0; k < N; k ++)

            c[i * N + j] += a[i * N + k] * b[k * N + j];
      }
    }
  }

当我运行一个程序时,我收到这样的消息:

分段错误(核心转储)

现在,我知道我错过了一些东西,但不知道是什么。任何想法?

4

1 回答 1

1

privateOpenMP 中的变量未初始化并且具有随机初始值。当任务执行时,i将具有随机值,因此可能导致 and 的越界c[]访问a[]

firstprivatevariables 类似于private,但它们的初始值设置为在输入构造时引用的变量所具有的值。在你的情况下i必须是firstprivate而不是private

此外,建议iprivate并行区域中进行小幅性能提升。因此最终代码应如下所示(所有变量共享类都显式编写,私有变量在其使用范围内声明):

#pragma omp parallel shared(a, b, c)
{
   #pragma omp single
   {
      long i;
      for (i = 0; i < N; i++)
         #pragma omp task shared(a, b, c) firstprivate(i)
         {
            int j, k;
            for (j = 0; j < N; j++)
               for (k = 0; k < N; k++)
                  c[i * N + j] += a[i * N + k] * b[k * N + j];
         }
   }
}
于 2013-11-02T12:30:35.027 回答