ソース 5.3.3 単純な汎用データ型 (C++)

maindefs.h
#ifndef ___MAINDEFS_H__200211211819_JEWFJODSJF__INCLUDED___
#define ___MAINDEFS_H__200211211819_JEWFJODSJF__INCLUDED___

#include <mpi++.h>

/* 配列の要素数を返します */
#define NUMOF(array)     (sizeof (array) / sizeof *(array))

/* 配列型の要素数を返します */
#define NUMOFT(type)     NUMOF(*(type*)0)

/* 配列型の文字列の長さを返します */
#define STRLEN(literal)  (NUMOF(literal) - 1)

#endif  /* #ifndef ___MAINDEFS_H__200211211819_JEWFJODSJF__INCLUDED___ */
newtype.h
#ifndef ___NEWTYPE_H__200211211820_DAOFIJE3W__INCLUDED___
#define ___NEWTYPE_H__200211211820_DAOFIJE3W__INCLUDED___

#include "maindefs.h"

/* int 2 個からなる新しい型です */
typedef int NEWTYPE_T[2];

/* 新しい MPI の汎用データ型を作成、登録します */
void CreateNewType(MPI::Datatype& newType);

/* MPI の新しいデータ型を開放します */
void FreeNewType(MPI::Datatype& newType);

/* 新しい型の配列を乱数で初期化します */
void InitNewType(NEWTYPE_T pNewType[], int size);

/* 新しい型の配列を表示します */
void OutputNewType(NEWTYPE_T pNewType[], int size);

#endif  /* #ifndef ___NEWTYPE_H__200211211820_DAOFIJE3W__INCLUDED___ */
newtype.cpp
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include "maindefs.h"
#include "newtype.h"

using namespace std;

/* 新しい MPI の汎用データ型を作成、登録します */
void CreateNewType(MPI::Datatype& newType)
{
  /* int 型 2 個からなる新しい汎用データ型を作成します */
  newType = MPI::INT.Create_contiguous(NUMOFT(NEWTYPE_T));

  /* その汎用データ型を MPI が使用できるように登録します */
  newType.Commit();
}

/* MPI の新しいデータ型を開放します */
void FreeNewType(MPI::Datatype& newType)
{
  newType.Free();
}

/* 新しい型の配列を乱数で初期化します */
void InitNewType(NEWTYPE_T pNewType[], int size)
{
  for(int i = 0; i < size; ++i)
  { for(int j = 0; j < NUMOF(pNewType[0]); ++j)
      { pNewType[i][j] = rand(); }
  }
}

/* 新しい型の配列を表示します */
void OutputNewType(NEWTYPE_T pNewType[], int size)
{
  for(int i = 0; i < size; ++i)
  {
     cout << "  " << i << ": <";
     for(int j = 0; j < NUMOF(pNewType[0]); ++j)
     {
       if(j != 0)
         { cout << ", "; }
       cout << setw(11) << pNewType[i][j];
     }
     cout << '>' << endl;
  }
}
main.cpp
#include <iostream>
#include "maindefs.h"
#include "newtype.h"

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

enum TAG_KIND   // 通信タグ
{
  TAG_NEWTYPE,  // 新しいデータ型のテスト用通信タグ
};
enum RANK_KIND  // ランク
{
  RANK_SENDER,  // 送信側のランク
  RANK_RECVER,  // 受信側のランク
};

using namespace std;

// 送信
void Send(MPI::Datatype newType)
{
  /* 送信するデータを作成し、出力します */
  NEWTYPE_T data[9];
  InitNewType(data, NUMOF(data));
  cout << "Sended data    :" << endl;
  OutputNewType(data, NUMOF(data));

  /* データ型に newType を指定します */
  MPI::COMM_WORLD.Send(data, NUMOF(data), newType,
                       RANK_RECVER, TAG_NEWTYPE);
}

// 受信
void Recv(MPI::Datatype newType)
{
  NEWTYPE_T data[64];
  int recvCount;
  MPI::Status status;

  /* データ型に newType を指定します */
  MPI::COMM_WORLD.Recv(data, NUMOF(data), newType,
                       RANK_SENDER, TAG_NEWTYPE, status);
  recvCount = status.Get_count(newType);

  cout << "Received count : " << recvCount << endl;
  cout << "Received data  :" << endl;
  OutputNewType(data, recvCount);
}

int main(int argc, char** argv)
{
  MPI::Init(argc, argv);
  int rank = MPI::COMM_WORLD.Get_rank();

  MPI::Datatype newType;   /* 新しい MPI のデータ型 */
  CreateNewType(newType);  /* 新しいデータ型を作成、登録します */
  switch(rank)
  {
  case RANK_SENDER: Send(newType); break;
  case RANK_RECVER: Recv(newType); break;
  }
  FreeNewType(newType);  /* 新しいデータ型の登録を解除します */

  MPI::Finalize();

  cout << "Exit : " << rank << endl;
}

Last update was done on 2002.11.14