我正在尝试通过pdpotrf()进行Cholesky分解-英特尔的库,它使用ScaLAPACK。我在主节点中读取整个矩阵,然后像在这个示例中那样分发它。当SPD矩阵的维数为偶数时,一切正常工作。然而,当它是奇数时,pdpotrf()认为矩阵不是正定的。
难道是因为子矩阵不是SPD吗?我正在使用这个矩阵:

子矩阵是(具有大小为2x2的4个进程和块):
A_loc on node 0
4 1 2
1 0.5 0
2 0 16
nrows = 3, ncols = 2
A_loc on node 1
2 0.5
0 0
0 0
nrows = 2, ncols = 3
A_loc on node 2
2 0 0
0.5 0 0
nrows = 2, ncols = 2
A_loc on node 3
3 0
0 0.625在这里,每个子矩阵都不是SPD,但是总体矩阵是SPD (已与一个进程一起运行)。我该怎么办?或者我什么也做不了,而pdpotrf()不适用于奇数大小的矩阵?
下面是我称之为例行公事的方法:
int iZERO = 0;
int descA[9];
// N, M dimensions of matrix. lda = N
// Nb, Mb dimensions of block
descinit_(descA, &N, &M, &Nb, &Mb, &iZERO, &iZERO, &ctxt, &lda, &info);
...
pdpotrf((char*)"L", &ord, A_loc, &IA, &JA, descA, &info);我也试过这个:
// nrows/ncols is the number of rows/columns a submatrix has
descinit_(descA, &N, &M, &nrows, &ncols, &iZERO, &iZERO, &ctxt, &lda, &info);但我发现了一个错误:
{ 0,0}:在输入到{ 0,1}:在进入PDPOTR{ 1,0}:在进入PDPOTRF参数号605有一个非法值{ 1,1}:在进入PDPOTRF参数号605有一个非法值F参数号605有一个非法值 PDPOTRF参数编号605有一个非法值info < 0:如果第一个参数是一个数组,而j-条目有一个非法值,那么INFO = -(i*100+j),如果第一个参数是标量并且有一个非法值,那么INFO = -i。info = -605
从我的回答中,您可以看到函数的参数是什么意思。
代码是基于这个问题的。输出:
gsamaras@pythagoras:~/konstantis/check_examples$ ../../mpich-install/bin/mpic++ -o test minor.cpp -I../../intel/mkl/include ../../intel/mkl/lib/intel64/libmkl_scalapack_lp64.a -Wl,--start-group ../../intel/mkl/lib/intel64/libmkl_intel_lp64.a ../../intel/mkl/lib/intel64/libmkl_core.a ../../intel/mkl/lib/intel64/libmkl_sequential.a -Wl,--end-group ../../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.a -lpthread -lm -ldl
gsamaras@pythagoras:~/konstantis/check_examples$ mpiexec -n 4 ./test
Processes grid pattern:
0 1
2 3
nrows = 3, ncols = 3
A_loc on node 0
4 1 2
1 0.5 0
2 0 16
nrows = 3, ncols = 2
A_loc on node 1
2 0.5
0 0
0 0
nrows = 2, ncols = 3
A_loc on node 2
2 0 0
0.5 0 0
nrows = 2, ncols = 2
A_loc on node 3
3 0
0 0.625
Description init sucesss!
matrix is not positive definte
Matrix A result:
2 1 2 0.5 2
0.5 0.5 0 0 0
1 0 1 0 -0.25
0.25 -1 -0.5 0.625 0
1 -1 -2 -0.5 14发布于 2015-07-07 17:47:29
这一问题可能来自:
MPI_Bcast(&lda, 1, MPI_INT, 0, MPI_COMM_WORLD);在这条线之前,如果矩阵的维数是奇数,则每个过程的lda是不同的。两个进程处理2行,两个进程处理3行。但是在MPI_Bcast()之后,lda在任何地方都是一样的。
问题是子例程lda的参数DESCINIT必须是本地数组的主导维度,即2或3。
通过评论MPI_Bcast(),我得到了:
Description init sucesss!
SUCCESS
Matrix A result:
2 1 2 0.5 2
0.5 0.5 0 0 0
1 -1 1 0 0
0.25 -0.25 -0.5 0.5 0
1 -1 -2 -3 1 最后,解释了该程序对于偶数维和奇数维都是有效的。
https://stackoverflow.com/questions/31231428
复制相似问题