【问题标题】:cublasSgetriBatched compilation error with CUDA 7.0 Release CandidateCUDA 7.0 Release Candidate 的 cublasSgetriBatched 编译错误
【发布时间】:2015-05-02 12:42:15
【问题描述】:

考虑 sgarizvi 在

上发布的代码

CUBLAS: Incorrect inversion for matrix with zero pivot

我正在使用该代码作为我的问题的现成复制器。

如果我用 CUDA 6.0 编译它,一切正常。与此相反,如果我使用 CUDA 6.5 或 CUDA 7.0 Release Candidate 编译它,我会收到:

Error   13  error C2664: 'cublasSgetriBatched' : cannot convert parameter 3 from 'float **' to 'const float *[]'    C:\Users\user\Documents\Project\StackOverflow15\StackOverflow15\kernel.cu   70  1   StackOverflow15

这是一个错误还是我做错了什么?

我的配置:Windows 7、Microsoft Visual Studio 2010、发布模式、x64、compute_20、sm_21。

编辑

根据 Robert Crovella 的回答和 Park Young-Bae 的评论,可以通过更改行将指出的示例修复为与 CUDA 6.5 或 7.0 一起使用

cublascall(cublasSgetriBatched(handle,n,A_d,lda,P,C_d,lda,INFO,batchSize));

到

cublascall(cublasSgetriBatched(handle,n,(const float **)A_d,lda,P,C_d,lda,INFO,batchSize));

【问题讨论】:

    标签: cuda cublas


    【解决方案1】:

    我没有在 Windows 上尝试过,但我在 Linux 上观察到无论我使用 CUDA 6.5 还是 CUDA 7 RC 都会出现编译错误。但是,如果我回到 CUDA 6.0(链接的上一个问题主要考虑),那么编译错误就会消失。

    CUBLAS API 在这方面发生了变化,尤其是cublas_api.h 中的getriBatched 函数原型:

    CUDA 6.0:

    /* Batched inversion based on LU factorization from getrf */
    CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgetriBatched(cublasHandle_t handle,
                                                      int n,
                                                      float *A[],                     /*Device pointer*/
                                                      int lda,
                                                      int *P,                         /*Device pointer*/
                                                      float *C[],                     /*Device pointer*/
                                                      int ldc,
                                                      int *INFO,
                                                      int batchSize);
    

    CUDA 6.5/7RC:

    /* Batched inversion based on LU factorization from getrf */
    CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgetriBatched(cublasHandle_t handle,
                                                      int n,
                                                      const float *A[],               /*Device pointer*/
                                                      int lda,
                                                      const int *P,                   /*Device pointer*/
                                                      float *C[],                     /*Device pointer*/
                                                      int ldc,
                                                      int *info,
                                                      int batchSize);
    

    注意在第三个参数上添加了const 限定符。这基本上是导致观察到的差异的原因。至于实际错误本身,根据 C++ 规则这是正确的,如 cmets 中的@ParkYoungBae 所示。

    应修改上一个链接问题中的原始代码以用于更新的 CUBLAS API 标头。

    【讨论】:

    • 谢谢罗伯特。根据您的回答和 Park Young-Bae 的评论,我编辑了我的帖子,提供了一条关于如何解决我的问题的简单说明。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2016-12-16
    • 2015-09-26
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多