Reduce_scatter と Reduce_scatter_block
OpenMPIにはReduce_scatterとReduce_scatter_blockの2種類の集団通信が定義されています。
Reduce_scatter
MPI_Reduce_scatter(3) man page (version 4.1.8)
それぞれのプロセスが持つデータを集約し、その結果を直和に配布します。
int MPI_Ireduce_scatter( const void *sendbuf, void *recvbuf, const int *recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request )
recvcountsの配列でそれぞれのプロセスが受け取るデータ量を指定します。このrecvcountsの合計値を見ることで、入力データの長さを判断しています。 (つまり、sendbufからsizeof(datatype) * sum(recvcounts)の長さのデータを入力とみなしている)
Reduce_scatter_block
MPI_Reduce_scatter_block(3) man page (version 3.0.6)
これは上記のReduce_scatterにおいて、それぞれのプロセスが受け取るデータ量が全て同一の場合の特殊ケースの集団通信として定義されています。
int MPI_Reduce_scatter_block( const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )
そのため、プロセスが受け取るデータ量の指定は配列でなく、スカラーになっています。 入力データの長さは(sizeof(datatype) * recvcount)です。
NCCLやUCCと名前違うよね?
本題。他の通信ライブラリと微妙に定義が違うよね、という話。
- NCCL
- 上記のReduce_scatter機能の提供なし
- 上記のReduce_scatter_block機能を
ReduceScatterとして提供 Collective Communication Functions — NCCL 2.26.2 documentation
- UCC
- 上記のReduce_scatter機能を
reduce_scatter_vとして提供 - 上記のReduce_scatter_blockを
reduce_scatterとして提供
- 上記のReduce_scatter機能を
なんでこんなズレが.......悲しい