内容


在 IBM POWER8 系统上编译和运行 Weather Research and Forecasting 数据

加快天气分析的速度,更快地提供天气通知

Comments

Weather Research and Forecasting (WRF) Model 是一个重要的应用程序,用于预测天气,以满足大气研究和有效的天气预报需求。WRF 是一个开源程序,它以原始码的形式提供其源代码,所以用户需要在不同的平台上将它编译为二进制程序。WRF 常常在具有并行计算支持的高性能计算环境上运行。Intel® x86 平台和 IBM Power® 平台都支持高性能计算。

在本教程中,您将学习如何:

  • 在 IBM POWER8™ 平台上,使用 IBM XL Fortran 和 XL C/C++ 编译器编译 WRF 及其依赖的库
  • 在 POWER8 平台上使用 IBM Parallel Environment™ (PE) 运行 WRF

操作系统信息和目录设置

本教程使用的操作系统为 Red Hat Enterprise Linux Server release 6.5 (Santiago) for Power。我使用的软件和源代码版本包括:

图 1. 软件依赖关系
依赖 WRF、WPS、NetCDF 和相关的库

提示:我建议您创建一个非 root 用户(例如 loadl)来执行编译和安装工作。然后可编译 WRF 及其相关的库并将其安装到 loadl 主目录中。同样,使用 PE 运行并行计算作业时,必须以非 root 用户身份执行它。

清单 1. 本教程中的定义
/home/loadl/project/bin --> The folder where the compiled binaries are installed.
/home/loadl/project/include --> The folder where the header files are installed.
/home/loadl/project/lib --> The folder where the libraries are installed.
/home/loadl/project/share --> The folder where the manual, document are installed.
/home/loadl/project/source --> The folder where the source code packages are saved.
/home/loadl/project/netcdf --> The folder where the compiled netcdf are installed. 
                               It has sub folders such as bin,include,lib,share.

还需要为用户 loadl 生成一个 SSH 密钥,然后将公钥添加到已授权的密钥中。这样就允许用户 loadl 实现静默登录,这是在此节点上运行 PE 作业的前提条件。

安装和编译 WRF Model

在 Linux 上安装 XL Fortran 和 XL C/C++ 编译器

使用 root 用户身份安装 XL Fortran 和 XL C/C++ 编译器。备注:XL C/C++ 编译器需要以下包。如果它们不存在,可使用 yum 安装这些包。32 位包具有 *.ppc 扩展名。64 位包使用 *.ppc64 扩展名。

清单 2. XL C/C++ 编译器需要的包
yum install libstdc++*.ppc
yum install gcc
yum install gcc-c++
yum install glibc-devel*.ppc64
yum install glibc-devel*.ppc
yum install libstdc++-devel*.ppc64
yum install compat-libstdc++-33*.ppc
yum install compat-libstdc++-33*.ppc64
yum install ksh

在 Linux 上安装 PE

首先请确保您已安装了所有必要的包。PE 需要 bind 和 xinetd 包。(使用 yum 安装 bind 包,安装命令为 yum install bind,然后使用 yum install xinetd 安装 xinetd 包。)然后编辑 /etc/selinux/config 文件并设置 SELINUX=disabled,以禁用 SELinux。

重新启动操作系统,让这些更改生效。

然后以 root 用户身份按照以下步骤操作,安装 PE。

  1. export IBM_PPEDEV_LICENSE_ACCEPT=yes
  2. rpm -i ppedev_pa_license-1.3.0-0.ppc64.rpm
  3. rpm -i ppedev_pa_runtime-1.3.0-0.ppc64.rpm
  4. rpm -i ppedev_pa_hpct-1.3.0-0.ppc64.rpm
  5. export IBM_PPE_RTE_LICENSE_ACCEPT=yes
  6. rpm -i ppe_rte_license-1.3.0.8-s008a.ppc64.rpm
  7. rpm -i ppe_rte_1308-1.3.0.8-s008a.ppc64.rpm

在此包的安装工作末尾,系统会提示推荐的系统设置更改。以 root 用户身份执行这些更改。启动节点设置诊断脚本:

问题 1net.core.wmem_max 为 124928,但推荐值为 1048576。

sysctl -w net.core.wmem_max=1048576

问题 2net.core.rmem_max 为 124928,但推荐值为 8388608。

sysctl -w net.core.rmem_max=8388608

问题 3net.ipv4.ipfrag_low_thresh 为 196608,但推荐值为 1048576。

sysctl -w net.ipv4.ipfrag_low_thresh=1048576

问题 4net.ipv4.ipfrag_high_thresh 为 262144,但推荐值为 8388608。

sysctl -w net.ipv4.ipfrag_high_thresh=8388608

问题 5nofileulimit 为 1024,但推荐值为 4096。

Update nofile to be 4096 in /etc/security/limits.conf

问题 6memlockulimit 为 64,但推荐值为 unlimited

Update memlock to be unlimited in /etc/security/limits.conf

使用 service xinetd restart 重新启动 xinetd

问题 7/etc/xinetd.conf 中的 per_source 为 10,但推荐值为 80。

Change per_source to 80 in /etc/xinetd.conf

使用 service xinetd restart 重新启动 xinetd

根据 ulimit 相关设置,设置 /etc/profile 中的 ulimit -n 4096ulimit -l unlimited。然后重新启动 xinetd 服务:

清单 3. 重新启动 xinetd 服务
rpm -i pperte-1.3.0.8-s008a.ppc64.rpm
rpm -i ppe_rte_samples-1.3.0.8-s008a.ppc64.rpm
rpm -i ppertesamples-1.3.0.8-s008a.ppc64.rpm

编译 NetCDF

首先,以 loadl 身份登录并执行后续步骤。编译 NetCDF 之前,需要启用系统环境变量:

清单 4. 系统环境变量
export CC="xlc_r"
export CFLAGS="-q64 -O3 -qstrict -DIBMR2Fortran"
export CPP="xlc_r -E"
export CXX="xlC_r"
export CXXFLAGS="-q64 -O3 -qstrict"
export CXXCPP="xlC_r -E"
export F77="xlf_r"
export FC="xlf_r"
export F90="xlf90_r"
export FFLAGS="-q64 -O3 -qstrict"

使用 xlc_r 作为 C/C++ 编译器,xlf_r 作为 Fortran 编译器。对于从 NetCDF(和其他相关的库)到 WRF 的所有编译使用此环境变量设置。这么做会使依赖于 WRF 的库能够保持兼容。否则,在 WRF 编译期间调用依赖的库时,会遇到不兼容性错误。

要指定编译后的输出应安装在哪个目标文件夹,可使用此代码:

清单 5. 将编译后的输出安装在目标文件夹中
./configure --prefix=/home/loadl/project/netcdf
make
make install

编译 zlib

执行此清单中所示的步骤:

清单 6. 编译 zlib
./configure --prefix=/home/loadl/project
make
make install

编译 JasPer

执行此清单中所示的步骤:

清单 7. 编译 JasPer
./configure --prefix=/home/loadl/project
make
make install

编译 libpng

执行此清单中所示的步骤:

清单 8. 编译 libpng
export LD_LIBRARY_PATH=/home/loadl/project/lib/:$ LD_LIBRARY_PATH
export LDFLAGS="-L/home/loadl/project/lib/ -L/home/loadl/project/netcdf/lib"
 export CPPFLAGS="-I/home/loadl/project/include/ -I/home/loadl/project/netcdf/include"
./configure --prefix=/home/loadl/project
make
make install

编译 WRF

作为编译 WRF 的前提条件,需要启用环境变量:

清单 9. 为 WRF 编译启用环境变量
export JASPERLIB=/home/loadl/project/lib
export JASPERINC=/home/loadl/project/include
export WRF_EM_CORE=1
export NETCDF=/home/loadl/project/netcdf

要启用 WRF 的并行计算功能,可使用带 –lmpi 选项的 xlc_rxlf95_r 来执行编译。

首先解压 WRFV3.5.1.TAR.gz 并运行配置脚本,因为这有助于您创建 make 文件。它会生成一个 configure.wrf 文件,其中包含许多变量定义,并且会在执行 make 期间读取该文件。

运行 configure。在提示符下,从支持的平台中进行选择:

  1. Linux ppc64 BG /L blxlf compiler with blxlc (dmpar)
  2. Linux ppc64 BG /P xlf compiler with xlc (smpar)
  3. Linux ppc64 BG /P xlf compiler with xlc (dmpar)
  4. Linux ppc64 BG /P xlf compiler with xlc (dm+sm)
  5. Linux ppc64 IBM Blade Server xlf compiler with xlc (dmpar)

因为 POWER8 是新版本,所以配置脚本仅将 BG (BlueGene) 识别为 CPU,但这不会影响编译结果。选择第三个选项:Linux ppc64 BG /P xlf compiler with xlc (dmpar)

然后会得到一个提示:

清单 10. WRF 编译配置中的 “compiling for nesting” 提示
Compile for nesting?
   1=basic
   2=preset moves
   3=vortex following 
[default 1]

选择默认设置 1 basic。这会为您的版本生成一个配置模板文件。编辑 configure.wrf 文件。按如下所示更新字段:

清单 11. 更新配置文件中的字段
SFC   =  xlf95_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64
SCC   =  xlc_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64
CCOMP =  xlc_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64
DM_FC =  xlf95_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64 -lmpi
DM_CC =  xlc_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64 -DMPI2_SUPPORT –lmpi
CPP   =  /opt/ibm/xlf/15.1.0/exe/cpp -C -P

然后执行 ./compile em_real >& compile.log,这会执行编译并将编译日志写入 compile.log,调试时可使用该日志。如果编译成功,会生成一个 exe 文件:

清单 12. 生成一个 exe 文件
-bash-4.1$ ll run/*.exe
lrwxrwxrwx 1 loadl loadl 17 Aug 22 07:55 run/ndown.exe -> ../main/ndown.exe
lrwxrwxrwx 1 loadl loadl 15 Aug 22 07:55 run/nup.exe -> ../main/nup.exe
lrwxrwxrwx 1 loadl loadl 16 Aug 22 07:55 run/real.exe -> ../main/real.exe
lrwxrwxrwx 1 loadl loadl 14 Aug 22 07:55 run/tc.exe -> ../main/tc.exe
lrwxrwxrwx 1 loadl loadl 15 Aug 22 07:53 run/wrf.exe -> ../main/wrf.exe

编译 WPS

解压 WPSV3.5.1.TAR.gz 并运行配置脚本,创建 make 文件。运行配置脚本。然后会提示您进行选择:

清单 13. WRF 编译配置脚本的结果
Please select from among the following supported platforms.
    
    1.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (serial)
    2.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (serial_NO_GRIB2)
    3.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (dmpar)
    4.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (dmpar_NO_GRIB2)
    5.  Linux ppc64 BG bglxf compiler with blxlc   (dmpar)
    
Enter selection [1-5] :

选择 3.Linux ppc64 Power775 xl compilers & MPICH2 comms (dmpar)

WPS3.5.1 仍然无法识别最新的 POWER8 系统。它生成一个名为 configure.wps 的文件,其中包含变量定义并会在执行 make 时读取该文件。修改 configure.wps 中的 WRF 相对路径值。

WRF_DIR                 =       ../../wrf_arw/WRFV3

备注:在 wrf_arw/WRFV3 后不要有空格。否则会出现错误。

按如下所示修改此字段:

清单 14. 修改字段
CPP                 = /opt/ibm/xlf/15.1.0/exe/cpp -C -P
MPICH2_SYS          = /opt/ibmhpc/pecurrent/mpich2/gnu
MPI_INC             = -I$(MPICH2_SYS)/include64
MPI_LIB             = -L$(MPICH2_SYS)/lib64 –lmpi
FC                  = xlf95_r
SFC                 = xlf95_r
CC                  = mpicc -DMPI2_SUPPORT -DFSEEKO64_OK
CPPFLAGS            = -DAIX -DIBM4 -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI

保存更改并执行 ./compile > &compile.log,开始编译工作并将日志写入到 compile.log 文件中。WPS 编译后,将生成这个 exe 文件:

清单 15. 编译成功后会生成 Exe 文件
[loadl@tul237p5 WPS]$ ll *.exe
lrwxrwxrwx 1 loadl loadl 23 Aug 12 00:37 geogrid.exe -> geogrid/src/geogrid.exe
lrwxrwxrwx 1 loadl loadl 23 Aug 12 00:37 metgrid.exe -> metgrid/src/metgrid.exe
lrwxrwxrwx 1 loadl loadl 21 Aug 12 00:37 ungrib.exe -> ungrib/src/ungrib.exe

在 POWER8 上运行 WRF

要运行 WRF,需要准备 WRF 输入数据,这需要 WPS 提前处理天气输入数据。使用 geogrid.exe 生成静态陆地数据。使用 ungrib.exe 对天气输入 GRIB 气象数据进行解包。使用 metgrid.exe 生成 WRF 的输入,这会将大气数据横向插入到模型域上。使用 real.exe 将该数据纵向插入到模型的坐标上。

图 2. WRF 数据流程
WRF 数据处理过程
WRF 数据处理过程

ungrib.exegeogrid.exemetgrid.exe 在单个进程中执行。Real.exewrf.exe 在并行模式下执行。这意味着 PE 在交互式模式下同时执行 real.exewrf.exe

下面是一个在交互式模式下使用 PE 运行 WRF 的示例。

在启用了 SMT4 的 POWER8 系统上,CPU 数量是核心数量的 4 倍。我建议您使用 nmon 监视系统资源和使用情况,如这个 20 核心 POWER8 系统示例所示:

图 3. nmon 工具读取 CPU 信息
NMON 工具读取 CPU 信息
NMON 工具读取 CPU 信息

POWER8 芯片很新,以至于 nmon 无法正确识别它的型号,但它可读取 CPU 频率 (4.1GHz) 和 SMT 值 (SMT=4)。

设置 MP_TASK_AFFINITY=core 后,并行任务的最大数量为总核心数。所以在我的 20 核心 POWER8 环境中,该数量为 20。

设置 MP_TASK_AFFINITY=cpu 后,并行任务的最大数量为总的 CPU 数量。所以在我的 20 核心 POWER8 (SMT4) 环境上,该数量为 80。

命令 poe 是 PE 的主要可执行程序,用于调用并行计算任务。Poe 需要一个 hostfile,该文件可描述此主机上可用的 CPU 资源总量。该 hostfile 可能名为 host.list。可在每行上使用 “<hostname>*数量” 来描述资源。例如:

myhost01*20
myhost02*10

在本例中,我将 hostfile 内容设置为 myhost*80

然后使用这个 poe 命令启动 WRF 并行计算。

poe /home/loadl/project/wrf.exe -hostfile /home/loadl/project/host.list –procs 78

-procs 78 表示共启动了 78 个并行任务。此数量必须小于 hostfile 中描述的总资源数量。

如果设置 MP_TASK_AFFINITY=core 并仍然尝试启动 78 个并行任务,您会获得一个错误:

ERROR:0031-758 AFFINITY:Oversubscribe:78 tasks in total, each task requires 1 resource, but there are only 20 available resource.Affinity can not be applied.

ERROR:0031-161 EOF on socket connection with node myhost

我在我的 20 核心 POWER8 机器上使用了不同的设置,对一个 WRF 域模型执行了测试。我发现:

  • 设置 MP_TASK_AFFINITY=cpuprocs=78 会得到最佳的性能。在 WRF 运行时,CPU 使用情况与下面所示内容类似:
    图 4. 使用设置 MP_TASK_AFFINITY=cpuprocs=78 的 CPU 使用情况
    MP_TASK_AFFINITY=cpu 时的 CPU 使用情况
    MP_TASK_AFFINITY=cpu 时的 CPU 使用情况
  • 设置 MP_TASK_AFFINITY=cpuprocs=80。尽管这会用尽所有 CPU 资源,但性能很差,因为没有委托的 CPU 资源来管理 I/O。这会影响总体性能。
  • 设置 MP_TASK_AFFINITY=coreprocs = 20 很好,但没有设置 MP_TASK_AFFINITY=cpu 时的性能高。WRF 运行时,CPU 使用情况与下面所示内容类似:
    图 5. 使用设置 MP_TASK_AFFINITY=core 的 CPU 使用情况
    MP_TASK_AFFINITY=core 时的 CPU 使用情况
    MP_TASK_AFFINITY=core 时的 CPU 使用情况

结束语

本教程介绍了如何在 POWER8 系统上编译和运行基本的 Weather Research and Forecasting (WRF) Model。XL C/Fortran 编译器和 POWER8 CPU 支持 WRF 并行计算。通过使用 POWER8 CPU,可缩短预报天气的过程并创造更多的商业价值。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=990595
ArticleTitle=在 IBM POWER8 系统上编译和运行 Weather Research and Forecasting 数据
publish-date=11272014