Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在OpenMP中使用任务指令的正确方法是什么_C_Openmp - Fatal编程技术网

C 在OpenMP中使用任务指令的正确方法是什么

C 在OpenMP中使用任务指令的正确方法是什么,c,openmp,C,Openmp,我正在尝试使用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]; 长i,j,k; 对于(i=0;i

我正在尝试使用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];
长i,j,k;
对于(i=0;i
所以,我想在列级别使用task,然后我修改了如下代码:

   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];
      }
    }
  }
长i,j,k;
#pragma-omp并行
{
#布拉格omp单曲
{
对于(i=0;i
当我运行一个程序时,我得到如下消息:

   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];
      }
    }
  }
分段故障(堆芯转储)


现在,我知道我遗漏了一些东西,但我想不出是什么。有什么想法吗?

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

firstprivate
变量类似于
private
,但其初始值设置为输入构造时引用变量的值。在您的情况下,
i
必须是
firstprivate
而不是
private

此外,建议将并行区域中的
i
设为
private
,以获得较小的性能提升。因此,最终的代码应该是这样的(所有变量共享类都显式编写,私有变量在其使用范围内声明):

#pragma omp并行共享(a、b、c)
{
#布拉格omp单曲
{
龙我;
对于(i=0;i