流场可视化工程dlb-dynamicdr部署日志:阶段五:实验室服务器程序运行
2022-03-03
当前环境:
运行(阶段一:Init部分)
先对Init部分进行测试,该部分主要是对nc文件进行读取以及初始化MPI参数。可以对照之前的读代码日志进行分析推进。
整理好数据,配置文件如下:
<config repartition="1" trace_depth="2"
num_blocks_per_proc="16" num_total_blocks="32768"
num_time_blocks="1">
</config>
<dataset name="nek" file_format="NC_RECTILINEAR">
<run run_id="0" directory="/home/tianrui.cui/data" pattern="nek5000.nc" />
<dimension name="x" storage_order="1" size="512" blt_size="16"/>
<dimension name="y" storage_order="2" size="512" blt_size="16"/>
<dimension name="z" storage_order="3" size="512" blt_size="16"/>
<variable name="U" data_type="FLOAT32" />
<variable name="V" data_type="FLOAT32" />
<variable name="W" data_type="FLOAT32" />
</dataset>
运行,可以正确输出打印信息:
================ INIT ==============
data: nek
n_procs=4.
repartition, trace_depth=2
using per process blocks 16.
dims=3, dim_size=[512, 512, 512, 1], blt_size=[128, 128, 128, 1], divisions=[4, 4, 4, 1]
num_cells=64, num_cells3d=64, time_groups=1
====================================
初始报错信息如下:
[array:25421] *** An error occurred in MPI_Info_dup
[array:25421] *** reported by process [2403205121,3]
[array:25421] *** on communicator MPI_COMM_WORLD
[array:25421] *** MPI_ERR_INFO: invalid info object
[array:25421] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[array:25421] *** and potentially your MPI job)
步步推进打印调试信息发现出错的位置是load_time_interval()函数中条件分支语句错误,文件名是nek而错写为nek5000,修改判断语句的字符串后继续run,报错如下:
[PNetCDF Error] Specified netCDF file does not exist., in file '/home/tianrui.cui/dlb-dynamicdr-local-compiled/bil/bil_pio.c', line 191.
说明没有读取到NetCDF文件,出现错误的位点应该在:
std::vector<std::string> filenames;
filenames.push_back("/projects/SDAV/jiangz/nek5000/U.nc");
filenames.push_back("/projects/SDAV/jiangz/nek5000/V.nc");
filenames.push_back("/projects/SDAV/jiangz/nek5000/W.nc");
推测这里的位点找不到数据文件,所以导致读取失败,从超算服务器上导入文件。。。。。。
将地址修改为如下位置读取:
std::vector<std::string> filenames;
filenames.push_back("/home/tianrui.cui/data/nek5000/U.nc");
filenames.push_back("/home/tianrui.cui/data/nek5000/V.nc");
filenames.push_back("/home/tianrui.cui/data/nek5000/W.nc");
2022-03-04
阶段一(总)
重新运行如下:
[array:04367] *** An error occurred in MPI_Info_dup
[array:04367] *** reported by process [4252041217,2]
[array:05202] *** MPI_ERR_INFO: invalid info object
[array:05202] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[array:05202] *** and potentially your MPI job)
又开始报这个错误,说明文件读取是成功的?继续尝试打印寻找错误位点:发现问题还是在读取函数中:blocking_read_nek5000()函数,进入进行查看。定位BIL_Add_block_nc()函数执行正常,那么出错的函数一定是BIL_Read()函数。如果还是这个出错,那么就有理由怀疑还是没有读取到数据文件,或者数据文件出错“invalid info object”。
这里想到一个问题,是否是因为没有安装正确版本的MPI导致这些报错?尝试安装指定版本的MPICH3.1.3
MPICH重新部署
步骤如下:
$ cd /home/tianrui.cui/dlb-lib/MPI/MPICH
$ mkdir server_installed
$ tar -zxvf mpich-3.1.3.tar.gz
$ cd mpich-3.1.3
$ mkdir build
$ cd build
$ ../configure --prefix=/home/tianrui.cui/dlb-lib/MPI/MPICH/server_installed/
# 等待一分钟
$ make
# 等待几分钟
$ make install
# 等待几秒钟
成功编译安装
在.bashrc中添加环境变量:
# NetCDF
export NETCDF_ROOT=$CTR_CPP_LIB_ROOT/NetCDF/server_installed
# pure C
export PATH=$PATH:$NETCDF_ROOT/C/bin
export C_PATH=$C_PATH:$NETCDF_ROOT/C/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NETCDF_ROOT/C/include
export C_INCLUDE_PATH=$C_INCLUDE_PATH:$NETCDF_ROOT/C/include
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NETCDF_ROOT/C/lib
export LIBRARY_PATH=$LIBRARY_PATH:$NETCDF_ROOT/C/lib
source使其生效
对MPI完成编译之后还要对使用MPI编译的库进行重新生成:
Parallel_NetCDF 重新生成
仅给出目标根目录如下,不再进行详细过程阐述,记得修改.bashrc:
$ cd /home/tianrui.cui/dlb-lib/Parallel_NetCDF/MPICH_installed
ParMETIS 重新生成
仅给出目标根目录如下,不再进行详细过程阐述,记得修改.bashrc,记得要安装静态库和动态库共两次!:
$ cd /home/tianrui.cui/dlb-lib/ParMETIS/MPICH_installed
make
问题记录:
目前重装MPICH之后发现CMake的gcc被重新定向到了gcc 4.1.2 的老版本?!导致C++11 标准不可用,重新编译失败。具体为何不清楚,目前解决方案是可否重新安装一次CMake。
实际不用,发现问题如下:
上一次在指定GCC的时候添加了环境变量CC与CXX,但这次重新开机后CC和CXX变量不知为何消失了,只需在环境变量中加入如下即可:
export CC=/opt/gcc-4.8.5/bin/gcc
export CXX=/opt/gcc-4.8.5/bin/g++
重新编译发现监测到的GNU版本恢复正常:
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
使用MPICH版本仍然报错,如下:
../libbil.a(bil.c.o): In function `BIL_Set_io_hints':
bil.c:(.text+0x33a): undefined reference to `ompi_mpi_info_null'
bil.c:(.text+0x357): undefined reference to `ompi_mpi_info_null'
../libbil.a(bil.c.o): In function `BIL_Init':
bil.c:(.text+0x468): undefined reference to `ompi_mpi_byte'
bil.c:(.text+0x4a7): undefined reference to `ompi_mpi_info_null'
../libbil.a(bil_pio.c.o): In function `BIL_Pio_nc_to_mpi_type':
bil_pio.c:(.text+0x22b): undefined reference to `ompi_mpi_byte'
很多关于ompi的参数找不到,看来只能使用OpenMPI进行编译,但这个与之前在绵阳超算上部署的版本不符(之前使用的是MPICH)
阶段二(总)
接以上,定位到问题点BIL_Read()函数。
进一步定位到BIL_Pio_read_raw_blocks(),在bil_pio.c文件中。
进一步定位到MPI_File_open(),在bil_pio.c文件中。
发现没有进入BIL_Pio_read_raw_blocks()函数,而应该进入了BIL_Pio_read_nc_blocks()函数,重新定位错误到此。