2017-04-26 64 views
0

我是MPI的新程序員。我正在寫一個簡單的程序來將矩陣乘以一個向量。我所做的是首先向所有節點廣播矢量,然後使用散射將一串行矩陣發送到每個節點。分散可變長度數據

我的問題是,陣列中的行數不是可用節點數的倍數。所以不同的節點最終具有不同的行數。此刻,我正在使用循環中的點對點通信來執行此操作。但我更喜歡是否可以使用MPI_Scatter。但MPI_Scatter只向所有節點發送相同長度的數據。

即使當每個節點獲得不同大小的數據塊時,我是否仍然可以使用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