2017-03-17 4 views
2

私はMPIを使って分散画像(グレースケール)畳み込みを実装しています。私の既存のパターンは、ルートプロセスでイメージを1Dフラットアレイとして読み取った後、それらをすべてのプロセス(行分解)に散布し、ルートプロセスでMPI_Gatherを実行し、イメージを1Dフラットアレイ。明らかに、これは期待された結果をもたらしません。なぜなら、画像の畳み込みによって、状況は境界では厄介になるからです。MPIのゴーストセル交換パターン

if (rank == 0) { 
    src = null 
    dest = rank + 1 
} 

if (rank == size - 1) { 
    src = rank - 1 
    dest = null 
} else { 
    src = rank - 1 
    dest = rank + 1 
} 

MPI_SendRecv(&sendbuf[offset], slen, dest.. 
      &recvbuf[offset], rlen, src); 

がどのように私は「幽霊のためにメモリを割り当てるか:

ので、前述のパターンを改善するために、私は、プロセスは擬似コードでghost rows.で自分の行を交換する前記いわゆるghost cell exchangeパターンを実装したいです各プロセスの「行」?私はメモリをあらかじめ割り振ってから散らすべきですか?私が検討している問題の範囲を過度に超えているので、私は「カスタムデータ型」の解決策に行きたくはありません。

答えて

2

理想的には、ゴーストセルは、の通常のセルと同じメモリブロックの一部である必要があります。そうすれば、アドレッシングスキームを簡単に保つことができます。この方式では、画像は、MPI_ScatterMPI_Gatherを使用して、完全な行の倍数で分配されます。境界以外のランクでは、2つの追加のゴースト行に十分なメモリを割り当てます。

height = total_hight/ranks; 
std::vector<float> data(width * (height + 2)); 
float* image = &data[width]; 
float* ghost_north = &data[0] 
float* ghost_south = &data[width * (height + 1)] 
float* inner_north = image; 
float* inner_south = &image[width * (height - 1)] 
MPI_Scatter(root_image, width * height, MPI_FLOAT, 
      image, width * height, MPI_FLOAT, ...); 
... 
iterations { 
    MPI_SendRecv(inner_north, width, MPI_FLOAT, north, tag, 
       ghost_north, width, MPI_FLOAT, north, tag, ...) 
    MPI_SendRecv(inner_south, width, MPI_FLOAT, south, tag, 
       ghost_south, width, MPI_FLOAT, south, tag, ...) 
    ... compute ... 
} 
MPI_Gather(image, width * height, MPI_FLOAT, 
      root_image, width * height, MPI_FLOAT, ...); 

この擬似コードでは、特殊な境界ケースは考慮されません。

単純な1次元分割の問題は、通信コストと追加のハローデータが最適でないことです。特に小さい画像と多くの参加ランクの場合

ここには、MPIを使用したデータ逆変換およびハロー通信方法に関するexcellent example by Rolf Rabenseifnerがあります。また、コミュニケーション方法の改善方法についても説明します。 2D分解では、最初の通信と垂直境界の両方で派生したMPIデータ型が必要です。

+0

完全に明確な答えをいただきありがとうございます。あなたは通信コストについて何か言及しました。今度は、画像サイズを増やしてこのモデルをテストすると、パフォーマンスが低下するはずです。 –

+0

基本的に、1次元分解の通信コストは、2次元分解*より悪くなります。通信のオーバーヘッドは、画像サイズ(大きい方が良い)、ランクの数(少ない方が良い)、繰り返しごとの計算(それ以上の方が良い)のバランスに依存します。 – Zulan

+0

私はその部分に同意します.1dのコミュニケーションには多くの交流が必要です。あなたのすべての協力に感謝します。私は先に進み、すぐに答えを受け入れる –