我正在尝试编译、链接和运行netlib的Scalapackexample1.f程序。示例1.f代码
代码编译并链接OK,但在执行时它在结果中显示不稳定。有时残余物很低。其他时候,它是围绕10E+13。
我还看到,在执行IEEE_DENORMAL和其他scalapack测试程序(随scalapack源代码附带并与库libscalapack.a一起构建)时,我得到了很多example1和IEEE_UNDERFLOW标志。
我不得不编辑这一行的例子1.f:
DATA NPROW / 2 / , NPCOL / 3 /至
DATA NPROW / 2 / , NPCOL / 2 /因为我只有4个处理核心。
我的MPICH版本4.0.2 -构建自源scaLapack版本2.2.0LAPACKVersion3.10.1blas-参考实现的LAPACK3.10.1
这些库已经建立并进行了测试。
编译链接命令: mpif77 example1.f -o example1 libmpi.a libscalapack.a liblapack.a librefblas.a
运行/执行命令:
mpiexec -n 4 ./example1或mpirun -n 4 ./example1 1
有时结果是:
According to the normalized residual the solution is correct.
||A*x - b|| / ( ||x||*||A||*eps*N ) = 1.47973536-253但其他时候,我得到了一个不正确的结果:根据归一化的残差,解决方案是不正确的。\x-b/( ||x||||A||_eps_N )= 1.87065413E+13
example1的输出非常不稳定。
程序example1使用PDGESV函数来获得结果。我在测试文件夹中的scalapack测试函数中搜索了该函数的使用情况,发现xdsvd程序使用它。我测试了xdsvd,发现函数通过了测试,结果非常健壮,即输出中显示的数字总是相同的。
谢谢你给出解决这个问题的方法。
发布于 2022-07-24 03:47:11
我克服了困难。
真正的问题是,没有必要在example1.f代码中更改流程网格。
我认为进程的数量仅限于物理处理器中的核的实际数量。不,不是这样的。因此,当我构建并执行example1.f的原始代码时:
mpif77 example1.f -o example1 libscalapack.a liblapack.a librefblas.a然后是mpirun -n 6 ./example1
我得到了正确的答案和零信息代码,表明在标尺程序PDGESV中没有任何问题。
INFO code returned by PDGESV = 0值得一提的是,IEEE浮点标志消失了。
我还注意到,我不需要在build命令中提供libmpi.a。
这不是一个完整的答案,因为我仍然不知道流程网格的变化会把整个事情搞砸。我尝试改变块子矩阵的维数。在进程网格1x3和其他组合中尝试了NB=3和MB=3,但没有成功。
这就是我现在要调查的。也许我将不得不回答另一个问题,关于如何检查标量计算参数的有效性。
https://stackoverflow.com/questions/73083303
复制相似问题