2011-06-28 4 views
0

このプログラムは安全でないプログラムを示しています。時には正常に実行され、失敗することもあります。プログラムが失敗またはハングする理由は、MPIライブラリが特定のサイズのメッセージに対して熱心なプロトコルを実装する方法の結果として、受信タスク側でバッファが枯渇したためです。可能な解決策の1つは、送信ループと受信ループの両方にMPI_Barrierコールを含めることです。このMPIコードプログラムを修正する方法

そのプログラムコードはどのように正しいですか?

#include "mpi.h" 
#include <stdio.h> 
#include <stdlib.h> 

#define MSGSIZE 2000 

int main (int argc, char *argv[]) 
{ 
int  numtasks, rank, i, tag=111, dest=1, source=0, count=0; 
char  data[MSGSIZE]; 
double  start, end, result; 
MPI_Status status; 

MPI_Init(&argc,&argv); 
MPI_Comm_size(MPI_COMM_WORLD, &numtasks); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

if (rank == 0) { 
    printf ("mpi_bug5 has started...\n"); 
    if (numtasks > 2) 
    printf("INFO: Number of tasks= %d. Only using 2 tasks.\n", numtasks); 
    } 

/******************************* Send task **********************************/ 
if (rank == 0) { 

    /* Initialize send data */ 
    for(i=0; i<MSGSIZE; i++) 
    data[i] = 'x'; 

    start = MPI_Wtime(); 
    while (1) { 
    MPI_Send(data, MSGSIZE, MPI_BYTE, dest, tag, MPI_COMM_WORLD); 
    count++; 
    if (count % 10 == 0) { 
     end = MPI_Wtime(); 
     printf("Count= %d Time= %f sec.\n", count, end-start); 
     start = MPI_Wtime(); 
     } 
    } 
    } 

/****************************** Receive task ********************************/ 

if (rank == 1) { 
    while (1) { 
    MPI_Recv(data, MSGSIZE, MPI_BYTE, source, tag, MPI_COMM_WORLD, &status); 
    /* Do some work - at least more than the send task */ 
    result = 0.0; 
    for (i=0; i < 1000000; i++) 
     result = result + (double)random(); 
    } 
    } 

MPI_Finalize(); 
} 
+0

コードを正しくフォーマットしてください。[Meta](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)を参照してください。 – larsmoa

答えて

1

ウェイズ受信機はunexpected messagesの数は無制限で終わるしないようにこのコードを改善するためには、次のとおりです。

  • 同期を - あなたはMPI_Barrierを述べたが、それでもうまくいく代わりにMPI_Send関数のMPI_Ssendを使用して。
  • 明示的バッファリング - 適切なバッファリングを保証するためにMPI_BsendまたはBrecvを使用します。
  • 投稿済み - 受信プロセスは、システムバッファではなくデータを保持するバッファにメッセージが確実に受信されるように、作業を開始する前にIRecvをポストします。

メッセージの数は無制限なので、最初の(同期)メッセージだけが確実に機能します。

+0

ありがとうございました。 私にそのプログラムコードの行が間違っていますか? 私を助けてください! ありがとうございました – Jamalludin

関連する問題