任务是执行操作 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倍。所以我想我在这里做错了。