优化的并行例程X'WXX′WX对角线_WW

计算科学 线性代数 矩阵 表现 拉帕克 布拉斯
2021-11-29 06:03:11

X是实数双精度数的密集矩阵,通常大小为 2000 万行和 500 列,是存储为向量的实数非负双精度数的对角矩阵。我正在使用 C 语言并查看了 BLAS 的文档,但找不到一个似乎非常适合此的例程。W

这台机器有超过 20 个 CPU 内核,如果可能的话,我想利用它们。有足够的容量完全在内存中,但我想避免复制数据,除非真的有必要,因为它是共享计算资源。XW

我计算数百次。在每次迭代是恒定的,但会发生变化。XWXXW

我很乐意用 OpenMP 用 C 语言为此编写自己的代码,但理想情况下,如果速度最快的话,我会使用现有的优化例程。

2个回答

您还没有说明您有多少存储空间可用于此计算。一个 2000 万乘 500 的双精度浮点数组需要 80 GB 的 RAM 来存储。

如果您没有那么多 RAM,那么您将需要组织计算以使用从磁盘一次带入的较小阵列条带。例如,您可以一次使用 25 列的条,并且您只需要 4 GB 的 RAM 来存储每个条。您将计算每组 25 列的结果,并将生成的 500 x 500 矩阵相加以获得最终结果。

如果您的权重是非负的,那么您可以简单地取它们的平方根并将 W 写W那么你的产品是进行缩放,然后调用 BLAS 例程 DGEMM 来执行实际的矩阵乘法。 WWW=D2(DX)T(DX)D

如果您的权重是正负混合的,那么我会复制缩放它,然后再通过 DGEMM 执行矩阵乘法。同样,如果矩阵太大而无法放入内存,您可以手动阻止计算。 WXW

Intel 的 MKL 和 AMD 的 ACML 等库提供了高度优化的 DGEMM 例程实现。您绝对应该利用在此类库中优化 DGEMM 所付出的努力。

只是对布赖恩的回答有所改进。您可以使用 DSYRK 将矩阵与其转置相乘,而不是使用 DGEMM。