ソース 5.1.1 1対1ブロッキング通信

C
プログラム
#include <stdio.h>
#include <mpi.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()
{
  char hello[] = "Hello, host1!";
  MPI_Send(hello, STRLEN(hello), MPI_CHAR,
           RANK_RECVER, TAG_HELLO, MPI_COMM_WORLD);
}

// 受信
void Recv()
{
  char hello[64];
  int recvCount;
  MPI_Status status;

  MPI_Recv(hello, STRLEN(hello), MPI_CHAR,
           RANK_SENDER, TAG_HELLO, MPI_COMM_WORLD, &status);
  MPI_Get_count(&status, MPI_CHAR, &recvCount);
  hello[recvCount] = '\0';

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

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);
}
実行結果例
Exit : 0
Received bytes : 13
Received text  : Hello, host1!
Exit : 1
FORTRAN77
プログラム1 params.h
      Include 'mpif.h'

C     Hello 文字列通信タグ
      Integer TAG_HELLO
        Parameter (TAG_HELLO = 0)

C     受信バッファサイズ
      Integer BUF_SIZE
        Parameter (BUF_SIZE = 64)

C     送信側のランク
      Integer RANK_SENDER
        Parameter (RANK_SENDER = 0)
C     受信側のランク
      Integer RANK_RECVER
        Parameter (RANK_RECVER = 1)
プログラム2
C     送信
      Subroutine Send
      Implicit None
      Include 'params.h'
        Integer   err
        Character hello*13/'Hello, host1!'/

        Call MPI_Send(hello, Len(hello), MPI_CHARACTER,
     *                RANK_RECVER, TAG_HELLO, MPI_COMM_WORLD, err)

        Return
      End

C     受信
      Subroutine Recv
      Implicit None
      Include 'params.h'
        Integer   err
        Character hello(BUF_SIZE)
        Integer   status(MPI_STATUS_SIZE)
        Integer   recvCount
        Integer   i

        Call MPI_Recv(hello, BUF_SIZE, MPI_CHARACTER, RANK_SENDER,
     *                TAG_HELLO, MPI_COMM_WORLD, status, err)
        Call MPI_Get_count(status, MPI_CHARACTER, recvCount, err)

        Write(*, *) 'Received bytes : ', recvCount
        Write(*, *) 'Received text  : ', (hello(i), i = 1, recvCount)

        Return
      End

      Program TestLAM
      Implicit None
      Include 'params.h'

        Integer err
        Integer rank

        Call MPI_Init(err)

        Call MPI_Comm_rank(MPI_COMM_WORLD, rank, err)
        If(rank .eq. RANK_SENDER) Then
          Call Send
        Else If(rank .eq. RANK_RECVER) Then
          Call Recv
        EndIf

        Call MPI_Finalize(err)

        Write(*, *) 'Exit : ', rank

        Stop
      End
実行結果例
 Received bytes :  13
 Received text  : Hello, host1!
 Exit :  0
 Exit :  1
C++
プログラム
#include <iostream>
#include <mpi++.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,  // 受信側のランク
};

using namespace std;

// 送信
void Send()
{
  const char hello[] = "Hello, host1!";
  MPI::COMM_WORLD.Send(hello, STRLEN(hello),
                       MPI::CHAR, RANK_RECVER, TAG_HELLO);
}

// 受信
void Recv()
{
  char hello[64];
  int recvCount;
  MPI::Status status;

  MPI::COMM_WORLD.Recv(hello, STRLEN(hello), MPI::CHAR,
                       RANK_SENDER, TAG_HELLO, status);
  recvCount = status.Get_count(MPI::CHAR);
  hello[recvCount] = '\0';

  cout << "Received count : " << recvCount << endl;
  cout << "Received text  : " << hello << endl;
}

int main(int argc, char** argv)
{
  MPI::Init(argc, argv);

  int rank = MPI::COMM_WORLD.Get_rank();
  switch(rank)
  {
  case RANK_SENDER: Send(); break;
  case RANK_RECVER: Recv(); break;
  }

  MPI::Finalize();

  cout << "Exit : " << rank << endl;
}
実行結果例
Exit : 0
Received count : 13
Received text  : Hello, host1!
Exit : 1

Last update was done on 2002.11.14