我正在尝试通过MKL-Intel的库pdpotrf()进行Cholesky分解,该库使用ScaLAPACK。我正在读取主节点中的整个矩阵,然后像在example中一样分发它。当SPD矩阵的维数是偶数时,一切正常。但是,如果它是奇数,pdpotrf()
认为矩阵不是正定的。
可能是因为子矩阵不是SPD吗?我正在使用此矩阵:
和子矩阵(有4个进程和大小为2x2的块):
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(已通过1个进程运行检查)。我该怎么办?或者我无能为力,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具有非法值信息< 0:如果 第i个参数是一个数组,并且j-entry具有非法值 INFO = - (i * 100 + j),如果第i个参数是标量并且具有非法 值,然后INFO = -i。 info = -605
从我的answer,您可以看到该函数的参数意味着什么。
代码基于此question。输出:
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
答案 0 :(得分:2)
问题可能来自:
MPI_Bcast(&lda, 1, MPI_INT, 0, MPI_COMM_WORLD);
在此行之前,如果矩阵的维度为奇数,则lda
在每个进程上都不同。两个进程处理2行,两个进程处理3行。但在MPI_Bcast()
之后,lda
在任何地方都是相同的(3)。
问题是子例程DESCINIT
的参数lda
必须是本地数组的前导维度,即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
最后,它解释了该程序适用于均匀尺寸,并且对于奇数尺寸而言失败!