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

是否可以从全局函数或设备函数调用CUDA CUBLAS函数,cuda,cublas,Cuda,Cublas,我正在尝试并行化一个现有的应用程序,我已经将大部分应用程序并行化并在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函数,生成的结果与

我正在尝试并行化一个现有的应用程序,我已经将大部分应用程序并行化并在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中,如果我试图编译下面的代码,我会得到下面的错误,有人知道是否有一种方法可以从
\uuuuuuu设备\uuuuuuuu
\uuuu全局\uuuu
函数调用cublas函数吗

错误:不允许从
\uuuuu设备\uuuuu>/
\uuuu全局\uuu
调用主机
函数(“cublasDtrsv\uv2”)


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

不,这是不可能的。Cublas是一个主机api和库。非常感谢您的快速回答,有人知道是否存在可以从设备函数或全局函数调用的等效函数吗?我可以从设备代码编译引用Cublas的CU文件,我正在试图找出如何链接它:)我不明白这是如何工作的。CUBLAS库作为IA32/x86_64纯二进制库提供,例程在内部调用主机端运行时API函数、启动内核。这样的代码怎么可能运行GPU?@talonmies单独编译。库本身包含可重定位的设备代码。感谢大家的回复,我一直在尝试将代码编译到设备函数中,到目前为止似乎还可以,当我完成开发后,我将确认它是否有效,当然可以从设备代码调用CUBLAS例程,这是CUDA 5中的一项新功能。我不知道为什么这个答案被否决了。它使用动态并行功能,因此需要cc 3.5或更好的设备。向上投票。请再次投票,这样我们就可以把这个问题从未答复的名单上删除。