CMAQ中的并行设置和WRF等模式不同,在CMAQ的运行脚本中存在一个参数用于设置CMAQ的多核并行运算。

以下为CMAQ并行计算设置的一些细节,权作记录。

数据结构

数据并行化处理是程序并行化的一种方式。数据并行化通常是将数据均分为多个部分,并分配到处理器。每个处理器处理各自的部分。CMAQ的并行化则是基于这种方法。

CMAQ是一种4D空间(ncols, nrows, nlays, nspcs)计算模型,而且只在空间区域进行数据划分。CMAQ模型cctm运行脚本中 NPROCS 设置处理器数。NPROCS = NPCOL x NPROW,NPCOL对应的是列维度所使用的处理器数,NPROW对应的是行维度所使用的处理器数。当列维不能被 NCOL 整除时,剩余的部分将均分到 NCOL 处理器。行维的分配与列维的分配相同。例如,数据网格为 100x75 (column x row),使用6个处理器进行计算,3个处理器分配到列维,2个处理器分配到行维。每个处理器的子区域大小如下:PE 0 是 34 x 38, PE 1 和 PE 2 是 33 x 38, PE 3 是 34 x 37, PE 4 和 PE 5 是33 x 37。


解释器通信

在平流(advection)过程中,当模型在分布式内存系统运行时,处理器会从相邻处理器获取数据(处理器间通信)。STENEX是用于处理器通信的库,可以提供简单稳定的接口来处理大量的临近处理器通信。临近处理器通常指的是与自身(蓝色块)相邻的处理器(图2)。

图2 临近处理器设置

下图解释了处理器的数据获取过程,以下代码在处理器2上使用2x2,4个处理器的区域分解。当计算格点X时,格点X需要从临近处理器(P0和P3)中的红点网格获取数据(图3)。


1
2
3
4
5
6
DIMENSTION DATA( NCOLS, NROWS )
 DO J = 1, NROWS
    DO I = 1, NCOLS
       DATA(I,J) = A(I+2,J) * A(I, J-1)
    END DO
 END DO


图3 处理器计算获取数据示例

并行IO

IOAPI_3库专门用于处理CMAQ中的所有IO操作。但是,IOAPI_3仅能作用于串行代码,在进行区域分解时,无法在分布式内存环境中工作。PARIO库用于处理运行在分布式内存环境的CMAQ应用的文件I/O操作。PARIO的开发是为了保证效率和准确性,IOAPI_3中的函数(READ3, INTERP3, WRITE3, CHECK3, OPEN3, CLOSE3, DESC3, M3ERR, M3EXIT, M3WARN)在PARIO中均有替代函数,只需要在IOAPI_3中的函数钱加 ‘P’ 即可用于并行版,即POPEN3, PINTERP3等。


注意: IOAPI_3函数的接口和PARIO函数接口是相同的。

在数据输出时,所有处理器将数据发送到处理器0,将每一部分的数据合并,然后输出到文件。这个方式是“虚假”并行I/O方法(图4)。


图4 虚假并行方案

目前已经施行了真正的并行处理方案,允许各处理器直接向文件中输出数据。


图5 真并行方案

此方案已经加入到IOAPI 3.2版本,并行I/O方案也已加入到CMAQ5.2中。但是需要在模式构建阶段打开此特征选项,并且要使用IOAPI 3.2。


参考链接:
1. https://www.epa.gov/cmaq/parallel-implementation-cmaq