サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

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と名前違うよね?

本題。他の通信ライブラリと微妙に定義が違うよね、という話。

なんでこんなズレが.......悲しい