- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过 pdpotrf() 进行 Cholesky 分解MKL-Intel 的库,它使用 ScaLAPACK。我正在读取主节点中的整个矩阵,然后像在这个 example 中一样分发它.当 SPD 矩阵的维度是偶数时,一切正常。但是,当它是奇数时,pdpotrf()
认为矩阵不是正定的。
会不会是因为子矩阵不是SPD?我正在使用这个矩阵:
子矩阵是(有 4 个进程和大小为 2x2 的 block ):
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}: On entry to { 0, 1}: On entry to PDPOTR{ 1, 0}: On entry to PDPOTRF parameter number 605 had an illegal value { 1, 1}: On entry to PDPOTRF parameter number 605 had an illegal value F parameter number 605 had an illegal value
PDPOTRF parameter number 605 had an illegal value info < 0: If the i-th argument is an array and the j-entry had an illegal value, then INFO = -(i*100+j), if the i-th argument is a scalar and had an illegal value, then INFO = -i. info = -605
来 self 的 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
最后,它会解释该程序在偶数维度上运行良好而在奇数维度上失败!
关于c++ - Cholesky 与 ScaLAPACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231428/
我正在尝试编写一些 C 代码来使用 scalapack 中的 pzheevd 例程查找大型矩阵的所有特征值。我有下面的简单示例,它硬编码了一个简单的 4x4 矩阵。使用单个进程、2 个进程或 4 个进
我正在尝试从 http://acts.nersc.gov/scalapack/hands-on/etc/pddttrdrv/pddttrdrv.c.html 运行一个简单的 Hello World (
我正在尝试通过 pdpotrf() 进行 Cholesky 分解MKL-Intel 的库,它使用 ScaLAPACK。我正在读取主节点中的整个矩阵,然后像在这个 example 中一样分发它.当 SP
我正在使用 ScaLAPACK 的分而治之算法编写并行矩阵对角化的小测试代码 PDSYEVD在 C 中。但是,我是 ScaLAPACK 的新手,查看源代码时,要设置的变量数量相当多,我找不到任何好的示
您好,谁能给我提供一个从 C++ 调用 ScaLAPACK 的 Makefile 示例,我遇到了困难。 我已经正确编译了最新版本并通过了所有测试。我在 Fedora 上用 GCC 和 OpenMPI
我收到以下错误,我不知道为什么。 { 1, 1}: On entry to PDPOTRF parameter number 2 had an illegal value {
我正在尝试翻译这个 CODE从 Fortran 到 C。 这是我目前所拥有的: #include #include #include #include #include "mpi.h" #de
我有一个深度嵌入 GNU 科学库 (GSL) 矩阵算法的代码,该代码的主要计算是求解一个大型线性方程组,该方程组需要很长时间串行处理,并且具有 GSL 和 BLAS 函数,是否有一种并行化此计算或将其
我正在尝试编译python包https://github.com/jrs65/scalapy它包装了 mkl scalapack 和 blacs 库。编译成功,但是当我尝试执行测试程序时,我得到: I
我是一名优秀的程序员,十分优秀!