CUDA 7.0 Release Candidate 的 cublasSgetriBatched 编译错误

cublasSgetriBatched compilation error with CUDA 7.0 Release Candidate

考虑 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\Whosebug15\Whosebug15\kernel.cu   70  1   Whosebug15

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

我的配置:Windows7,微软Visual Studio2010,发布模式,x64,compute_20,sm_21。

编辑

根据 Robert Crovella 的回答和 Park Young-Bae 的评论,通过更改行

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));

我没有在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);

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

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