ソース 5.4.1 キャンセル

C
プログラム
#include <stdio.h>
#include <mpi.h>
#include <unistd.h>

#define NUMOF(array)     (sizeof (array) / sizeof *(array))
#define STRLEN(literal)  (NUMOF(literal) - 1)

enum TAG_KIND   // 通信タグ
{
  TAG_HELLO,    // Hello 文字列通信タグ
};
enum RANK_KIND  // ランク
{
  RANK_SENDER,  // 送信側のランク
  RANK_RECVER,  // 受信側のランク
};

// 送信
void Send()
{
  puts("Nothing to do :p");
}

// 受信
void Recv()
{
  char hello[64];
  MPI_Status status;
  MPI_Request req;
  int i;
  int cancelled;
  const int waitTime = 3;  // 待つ回数

  MPI_Irecv(hello, STRLEN(hello), MPI_CHAR,
            RANK_SENDER, TAG_HELLO, MPI_COMM_WORLD, &req);

  // 何回か待ちます
  for(i = 0; i < waitTime; ++i)
  {
    int complete;

    MPI_Test(&req, &complete, &status);
    if(complete)
    {
      // 永遠に実行されない可哀想なコード :p
      int recvCount;

      puts("Complete!");

      MPI_Get_count(&status, MPI_CHAR, &recvCount);
      hello[recvCount] = '\0';

      printf("Received bytes : %d\n", recvCount);
      printf("Received text  : %s\n", hello);
      return;
    }

    puts("Waiting...");
    sleep(1);
  }

  // キャンセル
  MPI_Cancel(&req);
  MPI_Wait(&req, &status);

  MPI_Test_cancelled(&status, &cancelled);
  if(cancelled)
    { puts("Cancelled!"); }
  else  // ライブラリにバグがない限り実行されません
    { puts("???"); }
}

int main(int argc, char** argv)
{
  int rank;

  MPI_Init(&argc, &argv);

  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  switch(rank)
  {
  case RANK_SENDER: Send(); break;
  case RANK_RECVER: Recv(); break;
  }

  MPI_Finalize();

  printf("Exit : %d\n", rank);
}
実行結果例
Nothing to do :p
Waiting...
Exit : 0
Waiting...
Waiting...
Cancelled!
Exit : 1

Last update was done on 2002.11.14