问题标签 [scalapack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
65 浏览

fortran - ScaLAPACK 中的小矩阵:如何处理空块

我有一个描述物理系统的大矩阵。最后两行与其他行根本不同,因此需要单独设置。此外,将这些行中的每一行分配到不同的进程是没有意义的。我想在第 0 个进程上设置两条线,然后将它们复制到全局矩阵中。

我有什么?- 一个分布式 M x N 矩阵,其中上部 (M-2) x N 块已被填充。

我想做什么?- 计算第 0 个进程的最后 2 x N 个元素,然后使用PDGEMR2D

问题是什么?- 我需要调用PDGEMR2D所有进程。a因此,需要分配要复制的矩阵(我认为它通常称为)并在所有进程上都有一个 scalapack 描述符。在第 0 个进程中,局部矩阵为 2 x N,在所有其他进程中为 0 x N。

如何处理空子矩阵? 通常,要获取 scalapack 描述符,我会调用descinit本地行数为LLD. 然而,这个数字需要 >= 1,但在具有空矩阵的进程上,它是 0。

(请注意,fortran 允许您分配具有 0 个元素的数组 - 这纯粹是一个 ScaLAPACK 问题。)

0 投票
0 回答
129 浏览

mpi - 使用 scalapack PDGESV 求解大型线性方程组时出现分段错误

使用 scalapack 例程 PDGESV 求解一组线性联立方程 Ax = b 的并行 fortran 代码失败(退出时出现分段错误)。方程组 N 变大。我还没有确定出现问题的 N 的确切值,但是,例如,该代码对于我测试过的所有值都可以完美运行,直到 N=50000,但在 N=94423 时失败。

特别是在调用 scalapack PDGESV 例程期间发生故障(即不是在分配/释放内存时);它进入例程 PDGESV,但不离开此例程。

我正在使用 Intel(R) Xeon(R) CPU E5-1660 v4 @ 3.20GHz 处理器开发具有 148 GB 内存的 Linux Mint 18.3 Sylvia 系统。我正在使用使用 gfortran 的 mpifortran。

有点相信fortran代码本身没有问题,因为该代码对于N的每个值和进程配置都可以完美运行,我尝试了N = 50000,并以INFO = 0代码退出,表明没有错误有发生了。(我还运行了一个稍微修改过的程序版本,它明确地检查了解矩阵 x* 的残差,即计算的 Ax* - b 并正确地找到了接近零的最大绝对值)。如果矩阵是奇异的存在一些问题,我们当然会观察到从 PDGESV 例程中退出并带有非零 INFO 代码。

机器的内存似乎也足够了;对于问题案例 N=94423,我们只需要 65 GB 内存,而可用的 148 GB 内存,在分配时没有问题(此外,解决相同问题的串行代码,使用 65 GB 内存,运行没有错误)。

我的感觉是,在 mpi 中单个进程可用的内存可能超出默认限制可能会出现一些问题?即也许我只是在编译/运行时缺少一些适当的标志?

我曾尝试使用 'ulimit -s unlimited' 命令,但这并没有解决问题。

我复制下面的fortran代码;这是一个简单的测试程序,1) 为矩阵 A 和向量 b 分配空间,2) 用随机条目填充它们的条目 3) 调用 PDGESV,然后 4) 释放内存。

我在下面列出了我使用的编译/执行命令(使用 mpifortran/gfortran)。

注意我也尝试使用 PGI fortran 编译器,并观察到相同测试用例的相同错误(请参阅下面的错误输出)。

Fortran 代码:


我用以下代码编译上面的代码: mpifort -Wall -mcmodel=medium -static-libgfortran -m64 /opt/openblas/lib/libopenblas.a /usr/local/lib/libscalapack.a /opt/openblas/lib/libopenblas.a -lm -lpthread -lgfortran -lm -lpthread -lgfortran -o para.exe solve_by_lu_parallelmpi_simple_light.for /opt/openblas/lib/libopenblas.a /usr/local/lib/libscalapack.a /opt/openblas/lib/libopenblas.a -lm -lpthread -lgfortran -lm -lpthread -lgfortran

它不会产生错误或警告,并使用(例如)运行它:

mpirun -n 4 ./para.exe 944 2 2 32 > DUMP05

在这里,我们使用块大小为 32 的 2x2 BLACS 进程阵列来求解 944 个 eqns 的系统。

对于这个小 N 案例,我们得到(成功运行)输出:

我们正在求解一个由 944 个线性方程组成的系统

过程:0 0 有 MLOC,NLOC = 480 480

过程:0 0 分配空间...

过程:1 0 具有 MLOC,NLOC = 464 480

过程:1 0 分配空间...

PROC: 0 0 构造矩阵 A 和 RHS 向量 B ...

PROC: 1 0 构造矩阵 A 和 RHS 向量 B ...

过程:1 1 具有 MLOC,NLOC = 464 464

PROC: 1 1 分配空间...

PROC: 1 1 构造矩阵 A 和 RHS 向量 B ...

过程:0 1 有 MLOC,NLOC = 480 464

PROC: 0 1 分配空间...

PROC: 0 1 构造矩阵 A 和 RHS 向量 B ...

PROC: 0 0 现在解决系统 AX = B 使用 SCALAPACK PDGESV

.. PROC: 1 0 现在解决系统 AX = B 使用 SCALAPACK PDGESV

.. PROC: 1 1 现在解决系统 AX = B 使用 SCALAPACK PDGESV

.. PROC: 0 1 现在解决系统 AX = B 使用 SCALAPACK PDGESV

..

PDGESV 返回的 INFO 代码 = 0

到目前为止,一切都很好。但是,改为运行:

mpirun -n 4 ./para.exe 94423 2 2 32 > DUMP06

产生以下错误(注意这样的执行需要 65 GB 内存,在我的机器上大约需要 45 分钟):

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。

此错误的回溯:

此错误的回溯:

此错误的回溯:

此错误的回溯:

此错误的回溯:

此错误的回溯:

此错误的回溯:

此错误的回溯:

出于某种原因,没有打印回溯信息,但是使用 PGI fortran 编译器(在运行 red hat linux 7.3 的不同机器上)运行相同的代码会产生以下输出失败:

[sca1993:113193] * 处理接收到的信号 *

[sca1993:113193] 信号:分段错误 (11)

[sca1993:113193] 信号代码:地址未映射 (1)

[sca1993:113193] 地址失败:0x2b8c5a036390

[sca1993:113193] [0] /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../.. /lib64/libpthread.so.0(+0xf5d0)[0x2b900528c5d0 ]

[sca1993:113193] [1] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(+0x280c950)[0x2b9003acc950]

[sca1993:113193] [2] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(daxpy_k_HASWELL+0x7f)[0x2b9003acc54f]

[sca1993:113193] [3] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(dger_k_HASWELL+0xd5)[0x2b9003ad6635]

[sca1993:113193] [4] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(dger_+0x21f)[0x2b90013d9f5f]

[sca1993:113193] [5] ./para_try.exe[0x446e70]

[sca1993:113193] [6] ./para_try.exe[0x41b4ad]

[sca1993:113193] [7] ./para_try.exe[0x4071e1]

[sca1993:113193] [8] ./para_try.exe[0x406b39]

[sca1993:113193] [9] ./para_try.exe[0x404ba6]

[sca1993:113193] [10] ./para_try.exe[0x403654]

[sca1993:113193] [11] /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libc.so.6(__libc_start_main+0xf5)[ 0x2b9005cb83d5]

[sca1993:113193] [12] ./para_try.exe[0x403549]

[sca1993:113193] * 错误消息结束 *

如果有人有任何建议,我将不胜感激。非常感谢,丹。

0 投票
1 回答
316 浏览

c - 使用 MPI_Type_create_subarray 做二维循环分布的例子

我想举一个例子,展示如何使用MPI_Type_create_subarray为大型矩阵构建二维循环分布。

我知道这MPI_Type_create_darray会给我二维循环分布,但它与SCALAPACK过程网格不兼容。

我会使用MPI_Type_create_subarray矩阵进行二维块循环分布并将其传递给SCALAPACK例程。

我可以举个例子吗?

0 投票
0 回答
101 浏览

fortran - 如何自定义makefile文件来编译BLACS库

我有一个 makefile 文件可以在 Fortran 中编译我的代码。这个 makefile 也已经编译了 Lapack 库。鉴于我的系统中已经安装了 BLACS 库,如何修改这个 makefile 以编译 BLACS 库。

我的生成文件:

0 投票
1 回答
61 浏览

makefile - 编译 ScaLapack 的第一个示例

我正在尝试编译 ScaLapack 的第一个示例。为此,我正在使用 makefile 进行编译,并且收到以下错误消息:

在此处输入图像描述

我已经完成了安装 ScaLapack 的所有过程,但我认为我必须在 Makefile 中进行一些修改才能编译示例。要使用 makefile 编译程序,只需在终端上键入“make”。

这是我的 makefile 和 ScaLapack 示例:

在此处输入链接描述

0 投票
1 回答
513 浏览

python - 无法使用 intel MKL ScaLapack 和 Blacs 编译包

我正在尝试编译包装和库的python包https://github.com/jrs65/scalapy 。编译成功但是当我尝试执行测试程序时,我得到:mkl scalapackblacs

英特尔 MKL 致命错误:无法加载符号 MKLMPI_Get_wrappers

我试图用来mkl_link_tool获取链接线。这就是幕后发生的事情distutils

我还尝试使用-Wl,-Bstatic -Wl,--start-groupand进行静态链接-Wl,--end-group -Wl,-Bdynamic

没有成功。可能是什么问题呢?

0 投票
0 回答
98 浏览

io - 将块循环分布式矩阵写入二进制文件

我正在使用 Scalapack 对矩阵(25k × 25k)进行对角化,并且需要特征向量。我正在使用 pzlawrite 将分布式矩阵写入文件。但是对于这么大的文件,ASCII 的写入速度相当慢。我想将输出写入二进制文件会快得多,但我无法获得将分布式矩阵写入 Fortran 中的二进制文件的任何示例。scalapack 中是否有任何内置函数可以以二进制形式写出分布式矩阵?

0 投票
1 回答
43 浏览

mpi - MPI 术语中的 ScaLAPACK 子例程是否“阻塞”?

我觉得这是一个愚蠢的问题,但我真的不知道如何用谷歌搜索,因为“ScaLAPACK”和“块”这两个词的每一个组合都会用关于 ScaLAPACK 使用的块循环矩阵分布的信息来轰炸你。但是,我想知道的是 ScaLAPACK 子例程在 MPI 术语中通常是“阻塞”还是“非阻塞”,即它们是否在返回之前等待所有其他进程完成。再次为愚蠢的问题感到抱歉。

0 投票
1 回答
77 浏览

fortran - 'MPI_Barrier' 和 'BLACS_Barrier' 都不会停止处理器执行其命令

我正在研究 ScaLAPACK 并尝试习惯使用 ScaLAPACK 必不可少的 BLACS 例程。

我上过一些关于 MPI 的初级课程,所以对 MPI_COMM_WORLD 的东西有一些粗略的了解,但对它内部的工作原理等没有深入的了解。

无论如何,我正在尝试使用 BLACS 例程按照代码打招呼。

'mpirun -np 10 ./exe' 的输出就像,

除了我在代码左侧标记为 (**) 的 'BLACS_BARRIER' 行之外,一切似乎都运行良好。

我已经把那行放在下面的输出中,它的标题行总是打印在它的顶部。

那么问题来了,

  1. 我已经尝试将 BLACS_BARRIER 用于“ctxt_sys”、“ctxt_all”和“ctxt”,但它们都没有输出第一次打印标题行的输出。我也试过 MPI_Barrier(MPI_COMM_WORLD,info),但也没有用。我是否以错误的方式使用障碍物?

  2. 另外,我在使用BLACS_BARRIER到'ctxt'时得到了SIGSEGV,并且在执行mpirun时使用了6个以上的进程。为什么在这种情况下会发生 SIGSEGV?

感谢您阅读这个问题。

0 投票
1 回答
65 浏览

fortran - scalapack中的行分配不一致

考虑以下简单的 fortran 程序

当我以 11 mpi 等级运行它时,我得到

这就是我期望 scalapack 划分这个数组的方式,但是,对于我得到的偶数等级:

这没有任何意义,为什么排名 0 会为块大小 100 和排名 * 块大小 > N 获得 200 个元素。因此,我的程序适用于 mpi 排名 1、2、3、5、7、11,但对于排名 4 则失败,6,8,9,10,12 等(我不知道为什么它在 9 级时失败了!)。谁能解释我的方法有什么问题?

GFortran 版本:6.1.0

SCALPACK 版本:2.1.0

macOS 版本:10.11