首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cholesky与ScaLAPACK

Cholesky与ScaLAPACK
EN

Stack Overflow用户
提问于 2015-07-05 14:34:42
回答 1查看 1.2K关注 0票数 3

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

难道是因为子矩阵不是SPD吗?我正在使用这个矩阵:

子矩阵是(具有大小为2x2的4个进程和块):

代码语言:javascript
复制
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()不适用于奇数大小的矩阵?

下面是我称之为例行公事的方法:

代码语言:javascript
复制
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);

我也试过这个:

代码语言:javascript
复制
// 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

从我的回答中,您可以看到函数的参数是什么意思。

代码是基于这个问题的。输出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-07 17:47:29

这一问题可能来自:

代码语言:javascript
复制
MPI_Bcast(&lda, 1, MPI_INT, 0, MPI_COMM_WORLD);

在这条线之前,如果矩阵的维数是奇数,则每个过程的lda是不同的。两个进程处理2行,两个进程处理3行。但是在MPI_Bcast()之后,lda在任何地方都是一样的。

问题是子例程lda的参数DESCINIT必须是本地数组的主导维度,即2或3。

通过评论MPI_Bcast(),我得到了:

代码语言:javascript
复制
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 

最后,解释了该程序对于偶数维和奇数维都是有效的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31231428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档