首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cuBLAS的标准Fortran接口

cuBLAS的标准Fortran接口
EN

Stack Overflow用户
提问于 2013-09-16 10:42:30
回答 1查看 1.3K关注 0票数 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接口?我相信这在概念上是可能的,但我不知道怎么做!

EN

回答 1

Stack Overflow用户

发布于 2013-09-16 11:57:47

已更新

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

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

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

年长的

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

您可能需要编写自己的包装器来处理它,例如

代码语言:javascript
复制
void dgemm(...) {
  copy_data_from_cpu_ram_to_gpu_mem();
  cublas_dgemm(...);
  copy_data_from_gpu_mem_to_cpu_ram();
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18819725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档