用于线性代数运算的 GPU 库

计算科学 并行计算 显卡
2021-12-16 07:21:55

我正在寻找 GPU 库来加速我拥有的代码,其主要“高性能”区域具有奇异值分解、QR 分解和特征值、特征向量计算。我浏览了 Nvidia 的网站上的 CuBLAS、Magma 等工具,但我不想在 Cuda 中编写代码。

如果那里有任何库,我可以从我的主要 C 代码中“调用”诸如 SVD、QR 等之类的东西,并且计算将在 GPU 上完成,那就太好了。所以总而言之,我有一个普通的 C 代码,其中加速了密集的线性代数运算。有谁知道可以做到这一点的开源(最好)库?

谢谢。

3个回答

对于 [CU]BLAS,在 CUDA 工具包 (src/fortran_thunking.{c,h}) 中有一个名为“thunking”的包装器,它从 CPU 内存中获取指针并为您执行所有 GPU 分配/复制。您可以使用预处理器语句将其插入代码中,例如

#define ZGEMV CUBLAS_ZGEMV
#define ZGEMM CUBLAS_ZGEMM
...

对于 LAPACK,Magma 的大部分(如果不是全部)功能都具有 CPU 端接口(它们往往首先被实现),因此,与 thunking 一样,您只需交换调用。在某些情况下,接口或工作空间要求可能会有所不同,因此您需要比使用 thunking 更加小心。

必要的免责声明是没有免费的午餐:如果您不愿意至少明确地处理内存副本,那么您的性能将仅限于具有高计算强度(触发器/字节)的大问题。如果您的问题很小和/或批处理,我强烈建议您编写一些控制代码来流式传输内存副本和库调用以重叠内存副本和计算。这不是真正的 CUDA,而是一个 API,因为您不需要编写内核。CUBLAS 和 Magma 都提供用于指定流的 API 调用。

编写 ViennaCL ( http://viennacl.sourceforge.net/ ) 并且在 Computational Sci StackEx 上的 Karl Rupp 可能会在这里插话 - 他们的库有多个矩阵分解,包括 SVD、LU、eigendecomp 等。它也是一个只有头文件的库,应该可以很好地与 C++(不确定 C)代码配合使用。

与 LU 分解一起使用的示例 - http://viennacl.sourceforge.net/viennacl-examples-dense-matrix.html

您可能想看看CULA 库,它以单精度(免费版)和双精度(完整版,即付费版)实现了许多最常见的 LAPACK/BLAS 操作。

该库可作为 LAPACK/BLAS 的直接替代品,因此如果您已经在原始代码中使用了这些函数,则无需更改任何内容。