考虑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));
答案 0 :(得分:2)
我还没有在Windows上尝试过,但我在Linux上观察到无论是使用CUDA 6.5还是CUDA 7 RC都会发生编译错误。但是,如果我回到CUDA 6.0(链接的先前问题主要在视图中),那么编译错误就会消失。
在这方面,CUBLAS API发生了变化,特别是getriBatched
中的cublas_api.h
函数原型:
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标头一起使用。