我正在尝试通过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);

但我得到一个错误:



从我的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

最佳答案

问题可能来自:

MPI_Bcast(&lda, 1, MPI_INT, 0, MPI_COMM_WORLD);

在此行之前,如果矩阵的维数为奇数,则每个进程的lda均不同。两个进程处理2行,两个进程处理3行。但是在MPI_Bcast()之后,lda在所有地方都是相同的(3)。

问题在于子例程 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

最后,它将说明该程序对于偶数维均适用,而对于奇数维则无效!

08-17 12:01