2017-04-26 15 views
0

私はMPIの新しいプログラマです。行列をベクトルで乗算する簡単なプログラムを書いています。私がやっているのは、最初にベクトルをすべてのノードにブロードキャストしてから、分散を使って各ノードに行列の束を送ります。分散可変長データ

私の問題は、配列の行数が利用可能なノードの数の倍数ではないということです。したがって、異なるノードは異なる数の行を持つことになります。現時点では、これを行うためにループ内でポイントツーポイント通信を使用しています。しかし、代わりにMPI_Scatterを使うことができたら私は好きです。しかし、MPI_Scatterはすべてのノードに同じ長さのデータしか送信しません。

各ノードが異なるデータサイズのチャンクを取得しても、分散を使用してデータを送信できるのはどうしてですか?

答えて

1

MPI_Scattervこの場合は正確に作られています。 sendcountsのベクトルとオフセットのベクトルの両方を指定します。それらを適切に作成するのはちょっと難しいかもしれないので、例があります:

int remainder = rows % comm_size; 
int local_rows = (rows/comm_size) 
if (comm_rank < remainder) { 
    local_rows++; 
} 
int* sendcounts = NULL; 
int* displacements = NULL; 
double* data = NULL; 
if (comm_rank = root) { 
    data = ...; 
    sendcounts = malloc(sizeof(int) * comm_size); 
    displacements = malloc(sizeof(int) * comm_size); 
    int sum = 0; 
    for (int i = 0; i < comm_size; i++) { 
     sendcounts[i] = (rows/comm_size) * columns; 
     if (remainder > 0) { 
      sendcounts[i] += columns; 
      remainder--; 
     } 
     displacements[i] = sum; 
     sum += sendcounts[i]; 
    } 
} 
double* local_data = malloc(sizeof(*local_data) * local_rows * columns); 
MPI_Scatterv(data, sendcounts, displacements, MPI_DOUBLE, 
      local_data, local_rows * columns, MPI_DOUBLE, root, MPI_COMM_WORLD); 
+0

ありがとうございます。まさに私が探していたもの! – PPGoodMan

関連する問題