ANSYS CFX を "Intel MPI" + "RDMA"で実行する方法

RDMAを使った実行方法
======================

start-methods.cclによるFabricの制御
---------------------------------------

CFXが使うMPIの環境変数を` start-methods.ccl` ファイルで制御できる。
つまり、これを使ってInfinibandのFabricを制御することができる。

```bash:command
vi ${ANSYS_INSTALL_DIR}/v201/CFX/etc/start-methods.ccl
```

Intel MPI のときは

- `START METHOD`が`Intel MPI Distributed Parallel` になっているブロックを探す
- `Appfile Host Entry=`の中に以下を付け加える。

Infinibandのとき

```bash:command
-genv I_MPI_DEBUG +2 -genv I_MPI_FABRICS shm:dapl
```

Omni-Pathのとき

```bash:command
-genv I_MPI_DEBUG +2 -genv I_MPI_FABRICS shm:ofa
```

下記にその編集例を示す。

```
START METHOD: Intel MPI Distributed Parallel
　　　　　　　　 (省略)
        Appfile Host Entry = -n %{hostprocs} -host %{hostname} -wdir "%{workdir_host}" -genv I_MPI_DEBUG +2 -genv I_MPI_FABRICS shm:ofa -env LD_PRELOAD %{impidir}/lib/libmpi_mt.so -env %{ldpathvar} %{rldpath} %{executable} %{arguments}
              (省略)
END
```
`I_MPI_DEBUG` オプションは使われているFABRICをログに表示し確認するために用いている。


実行方法
----------------------

### 実行コマンド

```bash:command
cfx5solve -def ${INPUT_FILENAME}.def \
    -par \
        -par-dist ${cfx_hosts} \
        -part ${NCPUS} \
        -large \
        -start-method "Intel MPI Distributed Parallel" \
    -batch
```

### マシンファイルの形式

`${cfx_hosts}`の中身は以下のようなイメージ。この例だと80coresで計算が実行される

```bash:command
xs-cs2-15*40,xs-cs2-16*40
```

まとめ
===========

`start-methods.ccl` ファイルを開き、`Intel MPI Distributed Parallel`のブロックを編集する。具体的には `Appfile Host Entry=` の真ん中あたりに下記を付け加えれば良い

- InfinibandかつRDMA
    - `-genv I_MPI_FABRICS shm:dapl`
- Omni-PathかつRDMA
    - `-genv I_MPI_FABRICS shm:ofa`
- TCP-over-IB(TCPoIB)のとき(マシンファイルに注意: ibのネットワークカードを指定すること)
    - `-genv I_MPI_FABRICS shm:tcp`




Appendix: CFXのマニュアルより関連項目を抜粋し日本語化
---------------------------------------------------

ほとんどの場合、デフォルト設定で十分であり、環境変数を設定する必要はないかもしれません。
ANSYS CFXは、環境変数 "CFX5_IMPI_DIR"を使用して、使用するIntel MPIインストールを選択します。
デフォルト設定は、ANSYS CFXによって"<CFXROOT>/../commonfiles/MPI/Intel" ディレクトリに自動的にインストールされるバージョンを指します。

`cfx5info -v` を使用して、`CFX5_IMPI_DIR` およびその他の環境変数の現在の設定を見つけることができます。別のインテルMPIバージョンを使用する場合は、そのバージョンを別の場所にインストールし、`CFX5_IMPI_DIR` をその場所に設定できます。

Intel MPIの制御に使用できるいくつかの環境変数があり、ANSYS CFX起動スクリプトからは直接アクセスできない柔軟性が追加されます。たとえば、環境変数は、ネットワークファブリックの選択（以下で簡単に説明します）、process pinningの制御、および collective operation 制御に使用できます。

これらの環境変数は、`${ANSYS_INSTALL_DIR}/v201/CFX/etc/start-methods.ccl` ファイルのstartコマンドを変更し、インテルMPIオプション `-env` または `-genv` を使用して設定できます（この使用例は、ネットワークファブリックのセクションに記載されています)。すべてのオプションと環境変数の詳細については、Intel MPIのドキュメントを参照してください。

いくつかの有用な環境変数には、以下で説明するものが含まれます。これらの環境変数が設定されている場合、起動スクリプトは、ANSYS CFX実行用にそれらを自動的に設定します。

`I_MPI_MPD_REMSH`

インテルMPIがリモートマシンでジョブを生成するために使用する方法を指定します。 Intel MPIのデフォルトはsshです。ただし、デフォルトでは、ANSYS CFXソフトウェアはこれをCFX5RSHに使用される設定と同じに設定し、CFX5RSHが設定されていない場合はrshを設定します。この変数はLinuxにのみ適用されます。

`I_MPI_FABRICS` および `I_MPI_FABRICS_LIST`

使用するネットワークファブリックと、インテルMPIがそれらを検索する順序を指定します。


Appendix: 参考にしたIntel MPI 関連情報
-----------------------------------
- [ファブリックの選択(Page13, インテル® MPI ライブラリー for Linux* ユーザーズガイド)](https://www.xlsoft.com/jp/products/intel/cluster/mpi/51/intel-mpi-5.1.2-user-guide-linux-JA.pdf)
- [ファブリック制御(Page132, インテル® MPI ライブラリー for Linux* リファレンス・マニュアル)](https://jp.xlsoft.com/documents/intel/mpi/51/intel-mpi-5.1.3-reference-manual-linux-JA.pdf)
- https://scc.ustc.edu.cn/zlsc/tc4600/intel/2016.0.109/mpi/User_Guide/I_MPI_FABRICS.htm
- https://jp.xlsoft.com/documents/intel/mpi/51/intel-mpi-5.1.3-reference-manual-linux-JA.pdf
- https://scc.ustc.edu.cn/zlsc/chinagrid/intel/Reference_Manual/Communication_Fabrics_Control.htm
- https://software.intel.com/content/www/us/en/develop/articles/tuning-the-intel-mpi-library-basic-techniques.html