Matrix multiplication 高效的复矩阵乘法:矩阵形状与记忆

Matrix multiplication 高效的复矩阵乘法:矩阵形状与记忆,matrix-multiplication,complex-numbers,lapack,blas,scalapack,Matrix Multiplication,Complex Numbers,Lapack,Blas,Scalapack,在我的代码中,最深的循环层包含一个用于矩阵乘法的BLAS例程。由于此操作是最昂贵的操作(关于计算时间),我想知道,尽可能快地使用复杂矩阵元素进行矩阵乘法的重要性是什么 我使用Fortran和ScaLAPACK。我将使用CGEMM例程 我有以下具体问题: 矩阵如何存储在内存中很重要吗?目前,我使用的是一个三维数组,其中每个循环周期中有一个索引是固定的,这样三维数组就可以简化为二维矩阵。但我觉得这是效率不高的,因为从那时起,矩阵元素在内存中并不是物理上紧密相连的。那么,将我的矩阵元素复制到一个临时

在我的代码中,最深的循环层包含一个用于矩阵乘法的BLAS例程。由于此操作是最昂贵的操作(关于计算时间),我想知道,尽可能快地使用复杂矩阵元素进行矩阵乘法的重要性是什么

我使用Fortran和ScaLAPACK。我将使用CGEMM例程

我有以下具体问题:

  • 矩阵如何存储在内存中很重要吗?目前,我使用的是一个三维数组,其中每个循环周期中有一个索引是固定的,这样三维数组就可以简化为二维矩阵。但我觉得这是效率不高的,因为从那时起,矩阵元素在内存中并不是物理上紧密相连的。那么,将我的矩阵元素复制到一个临时的二维数组中,并将其传递给CGEMM,是否更好
  • 在Fortran中,第一个数组索引是最快的索引。为了实现快速矩阵乘法,是否有一种优化阵列(矩阵)形状的方法?例如,我必须执行矩阵乘法A*B,其中A是复杂的200x4000矩阵,B是复杂的4000x50矩阵。那么,我是否应该更好地创建一个4000x200数组,因为“大”索引就是fastes索引?当然,我必须告诉CGEMM,为了得到正确的结果,A需要被转置
  • 在取消BLAS例程中的矩阵乘法是否存在众所周知的缺陷?我知道这是一个非常笼统的问题,但也许有人知道一个很好的文档,其中总结了一些应该做和不应该做的事情