是否可以从全局或设备函数调用 CUDA CUBLAS 函数

Posted

技术标签:

【中文标题】是否可以从全局或设备函数调用 CUDA CUBLAS 函数【英文标题】:Is it possible to call a CUDA CUBLAS function from a global or device function 【发布时间】:2012-08-26 13:06:33 【问题描述】:

我正在尝试并行化现有应用程序,我已将大部分应用程序并行化并在 GPU 上运行,我在将一个功能迁移到 GPU 时遇到问题

该函数使用了一个函数 dtrsv,它属于 blas 库,见下文。

void dtrsv_call_N(double* B, double* A, int* n, int* lda, int* incx) 
  F77_CALL(dtrsv)("L","T","N", n, B, lda, A, incx);

我已经能够按照下面的方法调用等效的 cuda/cublas 函数,并且产生的结果等效于 fortran dtrsv 子例程。

status = cublasDtrsv(handle,CUBLAS_FILL_MODE_LOWER,CUBLAS_OP_T,CUBLAS_DIAG_NON_UNIT, x, dev_m1, x, dev_m2, c);

if (status != CUBLAS_STATUS_SUCCESS) 
        printf ( "!!!! kernel execution error.\n");
        return EXIT_FAILURE;
    

我的问题是我需要能够从设备或全局函数调用 cublasDtrsv,如下所示,

__global__ void Dtrsv__cm2(cublasHandle_t handle,cublasFillMode_t uplo,cublasOperation_t trans, cublasDiagType_t diag,int n, const double *A, int lda, double *x, int incx)
    cublasDtrsv(handle,uplo,trans,diag, n, A, lda, x, incx);

在 cuda 4.0 中,如果我尝试编译下面的代码,我会收到以下错误,有谁知道是否有一种方法可以从 __device____global__ 函数调用 cublas 函数?

错误:不允许从 __device__/__global__ function("Dtrsv__dev") 调用主机 function("cublasDtrsv_v2")

【问题讨论】:

不,这是不可能的。 Cublas 是一个主机 api 和库。 非常感谢您的快速回答,有谁知道是否有可以从设备函数或全局函数调用的等效函数? 【参考方案1】:

CUDA Toolkit 5.0 引入了一个设备链接器,可以链接单独编译的设备对象文件。我相信,现在可以从设备函数调用 CUDA Toolkit 5.0 中的 CUBLAS 函数(但我只查看了标题,我没有使用 CUBLAS 的经验)。

【讨论】:

我可以编译从设备代码中引用 CUBLAS 的 CU 文件,我正在尝试找出如何链接它:) 我不明白这怎么可能奏效。 CUBLAS 库仅作为 IA32/x86_64 二进制库提供,并且在内部例程调用主机端运行时 API 函数、启动内核。这样的代码怎么可能运行 GPU? @talonmies 单独编译。库本身包含可重定位的设备代码。 感谢大家的回复,从那以后我一直在尝试将netlib.org/clapack/cblas/dtrsv.c中的代码编译为设备函数,到目前为止似乎还可以,当我完成开发时我会确认它是否有效, 当然is possible 从设备代码中调用 CUBLAS 例程,这是 CUDA 5 中的一个新功能。我不确定为什么这个答案被否决。它使用动态并行功能,因此需要 cc 3.5 或更好的设备。赞成。请再次投票,以便我们将其从未答复列表中删除。

以上是关于是否可以从全局或设备函数调用 CUDA CUBLAS 函数的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在设备函数中调用 cufft 库调用?

全局函数和设备函数之间的区别

Cuda - 从设备全局内存复制到纹理内存

是否可以在Thrust仿函数中调用设备函数?

cuda 编 程简单CUDA程序的基本框架

如何在 CUDA 中指定全局设备变量的对齐方式