【问题标题】:Multiplication matrix per Vector每个向量的乘法矩阵
【发布时间】:2021-01-08 14:14:51
【问题描述】:

知道如何使用 OpenMP 并行这个函数吗?

/*______ prod_matrix_vector __________ */

void dot(double matrix[], double vector[],int n, double result[]){
      
      for(int i=0,k=0;i<n*n,k<n;i=i+n,k++)
            for(int j=i,l=0;j<i+n,l<n;j++,l++)
                result[k]+=matrix[j]*vector[l];
}

【问题讨论】:

    标签: c multithreading matrix parallel-processing openmp


    【解决方案1】:

    并行性的自然候选者是外循环,但是,因为它有两个用于迭代的变量(ik),我们不能像它一样简单地并行化正在使用 OpenMP。

    因此,我们首先需要重新安排外循环,使其只包含一个变量。让我们选择变量k,因为它用于迭代数组result。作为用于迭代数组result 的变量很重要,因为它是唯一被写入的数组。因此,将迭代分布在线程之间的数组上更有意义。

    如果运行双循环(n=4)而不是result[k]+=matrix[j]*vector[l]; 打印i, k and j 的值,则会得到以下结果:

    i=0 k=0 j=0
    i=0 k=0 j=1
    i=0 k=0 j=2
    i=0 k=0 j=3
    i=4 k=1 j=4
    i=4 k=1 j=5
    i=4 k=1 j=6
    i=4 k=1 j=7
    i=8 k=2 j=8
    i=8 k=2 j=9
    i=8 k=2 j=10
    i=8 k=2 j=11
    i=12 k=3 j=12
    i=12 k=3 j=13
    i=12 k=3 j=14
    i=12 k=3 j=15
    

    所以i = k * n;

    所以你的双循环相当于:

      for(int k=0; k<n; k++){
        int i = k * n;
        for(int j=i, l=0; j <i+n, l<n; j++,l++)
             result[k]+=matrix[j]*vector[l];
      }
    

    现在外循环可以与OpenMP并行化,即:

      #pragma omp parallel for
      for(int k=0; k<n; k++){
          for(int j= k * n, l=0; l<n; j++,l++)
             result[k] += matrix[j] * vector[l];
      }
    

    【讨论】:

    • 非常感谢您的回答
    • 我认为这是一个家庭作业问题。生产代码的真正答案是“使用 BLAS 库”(但这可能不是问题制定者想要的,即使它是更好的答案!)
    • @JimCownie 是的,我完全同意,一个人不应该尝试重新发明轮子,特别是一个较慢的轮子;)
    猜你喜欢
    • 2020-03-16
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2016-01-23
    相关资源
    最近更新 更多