Tag Archives: hpc

在LSF作业提交系统上提交MPI并行程序

我们的noah模型采用mpi进行了并行。在windows上测试的时候使用了mpich2,通过。实际计算时使用了所里的曙光5000高性能计算机。还是费了一下午的时候来进行必要的设置。我们的超算环境部署了几种mpi,如mpich p4,openmpi等。我们使用了openmpi库。对于openmpi库的一些必要环境变量已经配置在 /public1/scripts/openmpi1.4-gnu.sh脚本里,其中包含MPI_HOME、PATH、LD_LIBRARY_PATH等与mpi有关的变量。

1. 在超算环境里,应用配置后的变量设置。
source /public1/scripts/openmpi1.4-gnu.sh

2. 在用户目录下的.bashrc里增加
export OMPI_MCA_pls_rsh_agent=/usr/bin/rsh

3. 对源代码进行编译。
mpicxx *.cpp *.o -o cali_noah_final_new_1 -I../gsl-1.14-lib/include -I/public1/home/CAS/lzhpc14/devenv/hdf5-1.8.5/include -L/public1/home/CAS/lzhpc14/yuting/runnoah/gsl-1.14-lib/lib -lgsl -lgslcblas -L/public1/home/CAS/lzhpc14/devenv/hdf5-1.8.5/lib -lhdf5 –lgfortran

mpicxx是mpi版本的c++编译器。在这里指定源代码,头文件路径,库路径,连接的库名即可通过编译。mpicxx具体是连接到哪个mpi环境里,是由步骤1进行了设置。注意必须使用mpi使用的对应编译器。

4. 编译通过后,将产生我们的模型可执行文件,cali_noah_final_new_1。这个模型需要带一个参数。所以我们写一个脚本cali_noah.sh。里面包括以下内容:
#!/bin/sh
export LD_LIBRARY_PATH=/public1/home/CAS/lzhpc14/yuting/runnoah/gsl-1.14-lib/lib:/public1/home/CAS/lzhpc14/devenv/hdf5-1.8.5/lib:$LD_LIBRARY_PATH
./cali_noah_final_new_1 run_0223.config

其中,export 需要指出./cali_noah_final_new_1 依赖的库位置。这里涉及到两个库gsl和hdf,mpi有关的库,不必在这里指定。在涉及到多个物理机器参与mpi计算时,export必须指定,否则会提示找不到必要的shared library。

5. 通过lsf提交到计算节点进行计算
bsub -q bigmem -n 64 -a openmpi mpirun.lsf ./cali_noah.sh

这里使用了64个CPU进行计算。由于这里使用很多个CPU,位于不同的计算节点上,大致流程是这样的。bsub将任务从登录节点提交到计算节点,并申请了64个计算单元。分配成功后,openmpi寻找一个计算节点为主节点,进行必须的初始化(包括在这个节点上进行shared library的位置配置),然后openmpi将任务分配到其余可用的计算节点,进行计算。如果这些计算单元全部位于同一个物理计算节点,那么是不需要专门设定shared library位置。但如果计算单元位于不同的计算节点,由openmpi分配的计算节点只预先配置了mpi的环境,而没有应用程序需要的其它library位置信息。这种情况下,必须指定LD_LIBRARY_PATH,如步骤4所描述。

在超算上执行Matlab程序

新发展了一个算法,对MODIS LST进行重建。对象是青藏高原250sq km,共2.7M多个点。工作量十分大。写了Matlab代码。在实验室工作站进行 parallel运行,开了8个labs,每一幅大约花费 3-5小时。希望计算2005年一年的day和night LST。计算时间不能接受。

研究所部署有曙光5000大型机。LSF管理系统。在个人用户下(不一定需要系统权限,一般用户即可)安装了Matlab 2010a,MatlabRoot是 /public1/CAS/wanglx/matlab1。Putty连接到超算后,执行./matlab1/bin/matlab,提示glibc 不支持,当前版本是 glibc 2.4,2010a支持的版本是 2.7,需要用户输入y 才能继续进入到matlab。需要对oscheck.sh进行crack,否则以后的bsub提交系统会有问题。vi $Matlabroot/bin/util/oscheck.sh进去后,注释掉584行 read ans(前面添加 #)。其后插入一行 ans = ‘y’。:w! 保存(加!是因为文件是只读),:q退出 vi。

安装XME,远程连接到超算,启动matlab,在Parallel菜单里配置 default configuration。配置一个合适的叫lsfconfig。设为default。注意在字符界面下是无法配置 defaultParallelConfig的。

使用parallel configuration是为了使用matlabpool 进行自动的分割和管理。否则自己得使用设定scheduler, job, 和task 还得自己管理输入和输出。比较麻烦一些。matlabpool 可以跟 parfor等连接起来使用,对于我们面临的任务简单的for循环十分适用。

退出xme。以 matlab -nodisplay进去,调用 interp_lst2 执行,以high 队列进去,自动连接到 256个labs进行计算。在configuration时配置 submitarguments 为 -qhigh。

interp_lst2的结构如下:

function interp_lst2

%set up some variables and reading data in from files

matlabpool open lsfconfig 64

for i=1:length(lst_data_fns)

decompose2_func(interp_image_fn, lst_dir, ref_dir, output_dir, …
dem, slope, aspect);

end

matlabpool close

function decompose2_func(…)

%set up variables

parfor i=1:interp_count

end

%posterior procedures

QProcess在超算LSF提交到计算节点上Segmentation fault的问题

TopModel被包装在QProcess里,在登录节点运行正常,但用bsub提交到计算节点时,出现 segmentation fault错误。

调试了一上午,发点问题出在 QProcess的几个connect函数上(比如连接了QProcess的finished事件等),将这些connect注释掉,segmentation fault消失。

所以一个问题是,是不是Qt里全部的事件机制在超算lsf上都不能用么?不过我用的整个程序没有进入事件循环(只是用了QProcess类而已),是不是跟这个有关系,但在登录节点上是可以运行的。