我想用cublasSgetrsBatched函数用CuBLAS求解线性方程。 这是我的计划:
__global__ void invokeDeviceCublasSgemm(cublasStatus_t *returnValue,
int n,
const float *d_alpha,
float *d_A,
float *d_B,
const float *d_beta,
float *d_C)
{
cublasHandle_t cnpHandle;
cublasStatus_t status = cublasCreate(&cnpHandle);
if (status != CUBLAS_STATUS_SUCCESS)
{
*returnValue = status;
return;
}
int indice = 0;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(i==j)
{
d_A[i*5+j] = 1;
}else
{
d_A[i*5+j] = 0;
}
d_A[i*5+j] = indice++ +1;
}
d_B[i] = i*i+2;
}
//A*At
float alpha = 1.0;
float beta = 0;
int devIpiv = 5;
int info;
cublasSgetrsBatched(cnpHandle,
CUBLAS_OP_N,
5,
1,
&d_A,
5*5,
(&devIpiv),
&d_B,
(#VERSION1)5, or (#VERSION2)1,
&info,
1);
printf("info %d ",info);
cublasDestroy(cnpHandle);
*returnValue = status;
}
此函数为cublasSgetrsBatched#VERSION1
的第一个版本生成 info 0 !!!! device to host memory copy error
我无法复制数据,但没有信息错误。
在版本2#VERSION2中:
info -8
我不明白如何使这个功能适用于简单的线性方程式。
有人可以帮助我吗?
答案 0 :(得分:1)
你可能有几个问题。
根据the doc of cublasSgetrsBatched
,d_A
和d_B
的类型应为const float* []
和float*[]
,但您使用的是float*
}。
条件ldb>=max(1,n)
对#VERSION2失败。
devIpiv
应该是一个数组而不是标量。
d_A
中的矩阵应该是LU因子,但是你给出了一个任意的矩阵。您可以在此函数之前调用cublasSgetrfBatched
来进行LU分解。以下an example code (with performance issue but working)解决AX=I
,您可以将其用作解决AX=B
的参考。您可以阅读this以了解为何需要LU分解。
与示例代码相同的性能问题。