如果我有一个函数而不是矩阵,是否可以使用 BLAS?

计算科学 线性代数 布拉斯
2021-12-12 19:31:46

我的矩阵大小已经超出了 RAM 所能容纳的范围,但我有一个函数可以廉价地定义每个元素。

在这种情况下是否可以使用 BLAS(在 Fortran 甚至 MATLAB 中)?

如果我在内存中有一个矩阵,我可以使用dgemvordgemm或其他任何东西并将我的矩阵作为参数之一传递。现在,我没有矩阵。我该如何解决?

我可以编写自己的代码,但无论我做什么,我都怀疑我的编程是否会像英特尔 MKL 的那些人一样彻底。在这种编程中,要跟踪的东西太多了。

编辑:我的矩阵很密集。几乎全密。我在索引方面有一个功能(i,j)和一个106×1向量。喜欢 :

f(i,j)=|a(i)+a(j)|(ij)2

另外,我并不是说我必须使用 BLAS。只要能完成我的工作,我就可以使用任何类似的东西。但据我所知,没有任何其他图书馆。

3个回答

你想用这个矩阵做什么?如果您只想与向量或另一个矩阵相乘,您应该自己编写该代码。如果要分解矩阵,则必须找到存储它的内存。如果您想解决系统或特征值问题,您可以使用 PETSc 和MatShell. 根据问题,您可能需要一个预处理器(如果您愿意,您也可以在不组装的情况下实现它)。

一句话:不。MKL 和其他优化库如此出色的原因是它们经过优化以平衡计算与内存使用(即您的矩阵完全存储在 RAM 中)。如果您的矩阵确实如此之大,我唯一真正的建议是自己将其屏蔽,以便每个单独的块适合,并按顺序在块上使用 BLAS(在块矩阵乘法中根据需要累积结果)。

当然,您可以像您提到的那样编写自己的例程。明智的编程可能会更快。

然后考虑尝试分解您的矩阵。

一个著名的例子是密集的 DFT(离散傅里叶变换)矩阵,但是如果将它们分解,您可以获得 FFT(快速傅里叶变换)的矩阵表示,其中每个因子理想情况下每行只有 2 个非零元素,并且只有log(N)这样的矩阵N是数据大小。