在我的代码中,最深的循环级别包含用于矩阵 - 矩阵乘法的BLAS例程。由于此操作是最昂贵的操作(关于计算时间),我想知道尽可能快地使用复杂矩阵元素进行矩阵 - 矩阵乘法的重要性吗?
我使用Fortran和ScaLAPACK。我将使用CGEMM例程。
我有以下具体问题:
- 矩阵如何存储在内存中是否重要?目前,我使用三维数组,其中在每个循环周期中固定一个索引,使得三维数组缩减为二维矩阵。但我觉得这是无效的,因为矩阵元素在内存中并没有物理上靠近在一起。那么,将矩阵元素复制到临时二维数组中以将其传递给CGEMM会更好吗?
- 在Fortran中,第一个数组索引是最快的索引。是否有一种最佳的方法应该如何对阵列(矩阵)进行整形以实现快速矩阵乘法?例如,我必须执行矩阵乘法A * B,其中A是复数200x4000矩阵,B是复数4000x50矩阵。因此,我应该更好地创建A作为4000x200阵列,从那时起#34;大" index是fastes指数?当然,我必须告诉CGEMM需要转换A才能获得正确的结果。
- 对于矩阵 - 矩阵乘法的无效BLAS例程,是否有任何众所周知的陷阱?我知道这是一个非常普遍的问题,但也许有人知道一个好的文件,其中总结了一些DO和DONT。