【问题标题】:Standard Fortran interface for cuBLAScuBLAS 的标准 Fortran 接口
【发布时间】:2013-09-20 02:43:25
【问题描述】:

我正在使用 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 接口?我相信这在概念上是可能的,但我不知道该怎么做!

【问题讨论】:

  • 请参阅stackoverflow.com/q/11576073/681865,讨论为什么您想做的事情不是一个好主意。
  • 有关在使用 BLAS 库的应用程序 (Octave) 中使用 cublas thunking 接口的有限示例(替换单个 BLAS 函数 -- Dgemm),请参阅here。在这种特殊情况下,对于大型矩阵乘法,将数据传输到 GPU 的开销/成本被减少的计算时间所抵消。

标签: cuda lapack blas cublas magma


【解决方案1】:

更新

正如@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 操作。

【讨论】:

  • CUBLAS 已经带有一组内置的 Fortran 绑定和一个“thunking”包装接口 - 请参阅 docs.nvidia.com/cuda/cublas/…
  • 太棒了。那么唯一的问题是 mem alloc/copy,这可能会使这种包装器比 MKL 慢。
  • thunking 接口包括内存分配和传输 - 文档包含有关负面性能影响的警告
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2014-06-15
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多