1

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

我将 Fortran 与 ScaLAPACK 一起使用。我将使用 CGEMM 例程。

我有以下具体问题:

  • 矩阵如何存储在内存中重要吗?目前,我使用一个三维数组,其中一个索引在每个循环周期中固定,以便三维数组简化为二维矩阵。但我觉得这是低效的,因为从那时起矩阵元素在内存中并没有物理上靠近在一起。那么,将我的矩阵元素复制到一个临时二维数组中以将其传递给 CGEMM 是否更好?
  • 在 Fortran 中,第一个数组索引是最快的索引。为了实现快速矩阵乘法,是否有一种最佳方式应该如何塑造数组(矩阵)?例如,我必须执行矩阵乘法 A*B,其中 A 是一个复杂的 200x4000 矩阵,B 是一个复杂的 4000x50 矩阵。那么我是否应该更好地将 A 创建为 4000x200 数组,因为那时“大”索引是 fastes 索引?当然,我必须告诉 CGEMM 需要转置 A 才能获得正确的结果。
  • 在取消矩阵矩阵乘法的 BLAS 例程中是否有任何众所周知的陷阱?我知道这是一个非常普遍的问题,但也许有人知道一个很好的文档,其中总结了一些 DO 和 DONT。
4

0 回答 0