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。
考虑 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。