C = AA'B的快速矩阵乘法循环

时间:2019-02-25 22:51:23

标签: fortran matrix-multiplication blas

任务是执行操作 C = AA'B ,其中 A,B C 是矩形数组。这可以通过BLAS通过使用中间矩阵 T 的gemm调用序列来实现。 T = A'B C = AT'。我想知道是否存在“更智能”的方法,因为 AA'B 可以重新表示为外部向量积的序列。因此,Fortran中的裸露循环如下所示:

    allocate(xxx(size(A,1)),source=0.0)
    Do i=1,size(B,2)
      !$OMP PARALLEL PRIVATE(tmp) FIRSTPRIVATE(xxx) REDUCTION(+:C)
      xxx=0.0
      !$OMP DO
      Do j=1,size(A,2)
        tmp=0.0D0;
        Do k=1,size(A,1)
          tmp=tmp+A(k,j)*B(k,i)
        End Do
        if(j==1) Then
          Do k=1,size(A,1)
            xxx(k)=tmp*A(k,j)
          end Do
        Else
          Do k=1,size(A,1)
            xxx(k)=xxx(k)+tmp*A(k,j)
          end Do
        End if
      End Do
      !$OMP END DO
      C(:,i)=C(:,i)+xxx
      !$OMP END PARALLEL
    end Do

就内存访问模式而言,这是最佳布局吗?如果是这样,如何使用OpenMP对其进行线程化。
我所有的线程尝试比通过MKL进行两次连续的gemm操作要慢大约15倍。所以我想我在这里做错了。

0 个答案:

没有答案