1

我在 Linux 上使用了一个商业模拟软件,它可以进行密集的矩阵操作。该软件默认使用英特尔 MKL,但它允许我将其替换为自定义 BLAS/LAPACK 库。此库必须是共享对象 (.so) 库,并且必须导出 BLAS 和 LAPACK 标准例程。该软件都需要标准的 Fortran 接口。

为了验证我是否可以使用自定义库,我编译了 ATLAS 并在其中链接了 LAPACK(来自 netlib)。该软件能够毫无问题地使用我编译的 ATLAS 版本。

现在,我想让软件使用 cuBLAS 以提高仿真速度。我遇到了 cuBLAS 不导出标准 BLAS 函数名称(它们有cublas前缀)的问题。此外,库 cuBLAS 库不包含 LAPACK 例程。我readelf -a用来检查导出的函数。

另一方面,我尝试使用MAGMA来解决这个问题。我成功编译并链接到所有 ATLAS、LAPACK 和 cuBLAS。但它仍然没有导出正确的函数,也没有在最终的共享对象中包含 LAPACK。我不确定这是应该的方式还是我在构建过程中做错了什么。

我也找到了CULA,但我不确定这是否能解决问题。

是否有人试图将 cuBLAS/LAPACK(或适当的包装器)链接到一个(.so)导出具有正确函数名称的标准 Fortran 接口?我相信这在概念上是可能的,但我不知道该怎么做!

4

1 回答 1

2

更新

正如@talonmies 所指出的,CUDA 提供了一个 fortran thunking 包装器接口。

http://docs.nvidia.com/cuda/cublas/index.html#appendix-b-cublas-fortran-bindings

您应该能够使用它运行您的应用程序。但是由于下面描述的内存分配/复制问题,您可能不会获得任何性能改进。

老的

这可能并不容易。CUBLAS 和其他 CUDA 库接口假定所有数据都已存储在设备内存中,但是在您的情况下,所有数据在调用之前仍在 CPU RAM 中。

您可能必须编写自己的包装器来处理它

void dgemm(...) {
  copy_data_from_cpu_ram_to_gpu_mem();
  cublas_dgemm(...);
  copy_data_from_gpu_mem_to_cpu_ram();
}

另一方面,您可能已经注意到,每个 BLAS 调用都需要 2 个数据副本。这可能会引入巨大的开销并降低整体性能,除非您的大多数调用都是 BLAS 3 操作。

于 2013-09-16T03:57:47.453 回答