请教关于CUDA矩阵LU分解的算法。请各路神人指点一二。
cuda吧
全部回复
仅看楼主
level 7
Abstract_cai 楼主
我刚入门,想写一个LU分解来熟悉CUDA,但是我卡住了。。。
我知道CUblas中有关于线性方程组的解的程序,但是我是想自己了解自己怎么写。
for(int i=0;i<n-1;i++)
{
int blockweith=n-i-1;
lu_decomp<<<blockweith,THREAD_NUM>>>(a_gpu,d,n,i);
}
__global__ void lu_decomp(double *a,double *d,int nn,int ii)
{int i=ii,n=nn;
int tid=threadIdx.x;
int bid=blockIdx.x;
int j=bid+i+1;double temp;
for(int k=i+tid;k<n;k+=THREAD_NUM)
{
if(i==k) a[j*n+i]=a[j*n+i]/a[i*n+i];__syncthreads();
if(i!=k) a[j*n+k]-=a[j*n+i]*a[i*n+k];__syncthreads();
}
}
这样会有问题吗。 如果目标是对称正定阵。
结果很是不对,希望得到帮助。I
2013年10月11日 13点10分 1
level 7
Abstract_cai 楼主
@尘埃之影 吧主 [委屈]
I
2013年10月11日 14点10分 2
正定矩阵LU分解不是cholesky吗?我没有看到开方?
2013年10月12日 10点10分
回复 尘埃之影 :原本是CHOLESKY分解 但是现在写的就是LU的 因为我没有选主元 测试代码正确性 还是用正定的矩阵希望保证能分解。
2013年10月12日 13点10分
回复 Abstract_cai :你百度下cholesky分解,CSDN有人已经给出GPU代码了,你可以参考一下
2013年10月13日 09点10分
level 7
Abstract_cai 楼主
for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++){ for(int k=i;k<n;k++){if(i==k) a[j*n+i]=a[j*n+ i ]/a[i*n+i];else a[j*n+k]=a[j*n+k]-a[j*n+i]*a[i*n+k];}}}
串行代码 也看看LU分解的串行代码应该是这样的吧
我是以此为基础改的 CUDA的
看看 串并行是否对应呢I
2013年10月12日 14点10分 3
level 7
Abstract_cai 楼主
for(int i=0;i<n-1;i++)
{ for(int j=i+1;j<n;j++)
{ for(int k=i;k<n;k++)
{
if(i==k) a[j*n+i]=a[j*n+k]/a[i*n+i];
else a[j*n+k]=a[j*n+k]-a[j*n+i]*a[i*n+k];
}}}
楼上代码看不清I
2013年10月12日 14点10分 4
LU分解的话,至少要输出两个矩阵L和U吧?可是你这个只是对原来的输入矩阵变形是不行的吧?
2013年10月13日 09点10分
1