Matrix 尖点CG收敛

Matrix 尖点CG收敛,matrix,cuda,linear-algebra,cusp-library,Matrix,Cuda,Linear Algebra,Cusp Library,我用尖点共轭梯度法来解对称稀疏矩阵。我不知道为什么它不收敛。我使用的矩阵的维数没有那么大(1K到100K)。同样的线性系统很容易用MKL求解,因此矩阵不是病态的。但是,我尝试添加预条件,但没有结果: 对角线预处理剂和AINV(不完全Cholesky)使残余物无限增长(只要cg和bicgstab) 这是我的密码: cusp::csr_matrix <int, float, cusp::device_memory> A (n, n, nnz); for (i = 0; i < n

我用尖点共轭梯度法来解对称稀疏矩阵。我不知道为什么它不收敛。我使用的矩阵的维数没有那么大(1K到100K)。同样的线性系统很容易用MKL求解,因此矩阵不是病态的。但是,我尝试添加预条件,但没有结果:

对角线预处理剂和AINV(不完全Cholesky)使残余物无限增长(只要cg和bicgstab)

这是我的密码:

cusp::csr_matrix <int, float, cusp::device_memory> A (n, n, nnz);

for (i = 0; i < n + 1; i++)
    A.row_offsets[i] = csrRowPtr[i] - 1;
for (i = 0; i < nnz; i++)
    A.values[i] = csrVal[i];
for (i = 0; i < nnz; i++)
    A.column_indices[i] = csrColInd[i] - 1;

cusp::array1d <float, cusp::device_memory> x (A.num_rows, 0);
cusp::array1d <float, cusp::device_memory> b (A.num_rows, 1);

for (i = 0; i < n; i++)
    b[i] = b_host[i];

cusp::verbose_monitor<float> monitor(b, 100, 1e-3);
cusp::identity_operator<float, MemorySpace> M(A.num_rows, A.num_rows);
    /*
    cusp::precond::diagonal<float, MemorySpace> M(A);
    cusp::precond::scaled_bridson_ainv<float, MemorySpace> M(A, .1);
    */
cusp::krylov::cg(A, x, b, monitor, M);

for (i = 0; i < n; i++)
    x_host[i] = x[i];
cusp::csr_矩阵A(n,n,nnz);
对于(i=0;i
为什么它不能正常工作


另外,据我所知,CUSP假设指数为零,这就是我减少csrRowPtr和csrColInd的原因。当我使用nvidiacusparse库时,有一个选项可以设置其他参数,比如矩阵类型和填充模式。如何确保在CUSP中正确设置这些元素?

只有上三角形中的元素以MKL的CSR格式存储,但即使求解对称线性系统,所有元素也必须以CUSP的CSR格式存储

我也认为

for (i = 0; i < n; i++)
    x_host[i] = x[i];
(i=0;i x_host[i]=x[i]; 这不是一个好主意;首先将其传输回主机内存

cusp::array1d<float, cusp::host_memory> _x = x;
cusp::array1d\ux=x;
然后将其复制回x_主机或任何结果数组

for (i = 0; i < n; i++)
    x_host[i] = _x[i];
(i=0;i x_主机[i]=_x[i];
MKL中的哪种方法成功解决了系统问题?预处理CG。但我也用CUDASDK中的共轭梯度解决了这些系统(40K以下)。你确定你在尖点方面没有做错什么吗?因为您使用的是MKL和CUDA SDK,并且两者都是converge,所以我假设您知道解决方案。如果从已有的解决方案点开始使用cusp的cg,会发生什么情况(我不是cusp用户,所以我不知道这是否可行)?尖点是否会卡在起点,这是我们应该期待的?这是一个一致性测试,我通常用来检查我的优化算法中的错误。有什么原因不能提供完整的可编译示例代码来说明问题吗?您的建议似乎是cg解算器在您尝试的各种示例问题上都失败了,那么cusp示例或cg SDK示例中给出的合成案例如何?你有记忆空间的typedef吗?请提供一个完整的示例,如cusp或SDK CG示例。我怀疑您的
a
矩阵组件中存在问题。尝试使用
cusp/verify.h
中提供的CSR矩阵验证。下面是一个使用cuda SDK示例中的例程组装
a
矩阵的示例。对我来说,它似乎很快收敛。