使用矩阵乘法任务的OpenMP

OpenMP using tasks for matrix multiplication

本文关键字:任务 OpenMP      更新时间:2023-10-16

因此,为了在C++中练习一些openMP,我尝试在不使用#的pragma omp并行

这是我的矩阵乘法骨架,我正试图将任务添加到其中。

#include <omp.h>
#include <cstdio>
void process(double **a, double **b, double **c, int i) {
  for(int j=0;j<1024;j++)
    for(int k=0;k<1024;k++)
      c[i][j] += a[i][k]*b[k][j];
}
void matrix_mult(double **a, double **b, double **c) {
  omp_set_num_threads(4);
  /* do I need to modify some storage attributes here? shared, private etc? */
  #pragma omp parallel 
  {  
    for(int i=0;i<1024;i++) {
      #pragma omp task 
      {
        process(a,b,c,i);
      }
    }
  }
}

我一直在研究一些openMP概述和示例,但在这里很难将概念应用到我的代码中。当我使用超过1个线程时,我总是得到不正确的矩阵结果。我能做些什么来解决这个问题?谢谢

您有一个逻辑错误:您不会生成1024个任务,而是生成(#threads)*1024个任务,因为每个线程都在并行区域内运行for-循环。只需将-循环的放在单个区域内。

我现在没有OpenMP 3.0编译器,但我认为你遇到的大部分问题都来自c[I][j]上的累积问题。

在执行+=之前,每个线程堆栈可能存储了不同的c[i][j]值,从而导致错误的累积。

SO上有类似问题的答案,包括:矩阵乘矢量OpenMP C

从本质上讲,您需要更改累积,以便获得某些行的副本,然后将结果组合在一个关键部分中。