ソース 5.3.2 単純な汎用データ型 (FORTRAN77)
fname.h |
---|
#ifndef ___FNAME_H__200211212355_OJLWEFOSDF__INCLUDED___ #define ___FNAME_H__200211212355_OJLWEFOSDF__INCLUDED___ /* C のコード中で FORTRAN77 との名前付け規則の違いを */ /* 吸収するために使うマクロ */ /* コンパイラによって定義が変わることがあります */ #define FNAME(func) func##_ #endif /* #ifndef ___FNAME_H__200211212355_OJLWEFOSDF__INCLUDED___ */ |
cname.h |
#ifndef ___CNAME_H__200211212355_KJFOEJOIDS__INCLUDED___ #define ___CNAME_H__200211212355_KJFOEJOIDS__INCLUDED___ /* FORTRAN77 のコード中で C との名前付け規則の違いを */ /* 吸収するために使うマクロ */ /* コンパイラによって定義が変わることがあります */ #define CNAME(func) func #endif /* #ifndef ___CNAME_H__200211212355_KJFOEJOIDS__INCLUDED___ */ |
rand.c |
#include <stdlib.h> #include "fname.h" /* FORTRAN77 で乱数を使うために作った関数 */ int FNAME(random)() { return rand(); } |
params.h |
Include 'mpif.h' C 新しいデータ型のテスト用通信タグ Integer TAG_NEWTYPE Parameter (TAG_NEWTYPE = 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) C 新しい型のサイズ Integer NEWTYPE_SIZE Parameter (NEWTYPE_SIZE = 2) |
newtype.F |
#include "cname.h" C MPI の新しいデータ型を作成、登録します Subroutine CreateNewType(newType) Implicit None Include 'params.h' Integer newType Integer err Call MPI_Type_contiguous( * NEWTYPE_SIZE, MPI_INTEGER, newType, err) Call MPI_Type_commit(newType, err) Return End C MPI の新しいデータ型を開放します Subroutine FreeNewType(newType) Implicit None Include 'params.h' Integer newType Integer err Call MPI_Type_free(newType, err) Return End C 新しい型の配列を乱数で初期化します Subroutine InitNewType(data, size) Implicit None Include 'params.h' Integer size Integer data(NEWTYPE_SIZE, size) Integer CNAME(Random) Integer i, j Do i = 1, size Do j = 1, NEWTYPE_SIZE data(j, i) = CNAME(Random)() EndDo EndDo Return End C 新しい型の配列を表示します Subroutine OutputNewType(data, size) Implicit None Include 'params.h' Integer size Integer data(NEWTYPE_SIZE, size) Integer i, j Do i = 1, size Write(*, *) ' ', i, ': <', * (data(j, i), ',', j = 1, NEWTYPE_SIZE), '\b>' End Do Return End |
main.F |
C 送信 Subroutine Send(newType) Implicit None Include 'params.h' Integer newType Integer err Integer DATA_SIZE Parameter (DATA_SIZE = 9) Integer data(NEWTYPE_SIZE, DATA_SIZE) C 送信するデータを作成し、出力します Call InitNewType(data, DATA_SIZE) Write(*, *) 'Sended data :' Call OutputNewType(data, DATA_SIZE) C データ型に newType を指定します Call MPI_Send(data, DATA_SIZE, newType, * RANK_RECVER, TAG_NEWTYPE, MPI_COMM_WORLD, err) Return End C 受信 Subroutine Recv(newType) Implicit None Include 'params.h' Integer newType Integer err Integer data(NEWTYPE_SIZE, BUF_SIZE) Integer status(MPI_STATUS_SIZE) Integer recvCount Integer i C データ型に newType を指定します Call MPI_Recv(data, BUF_SIZE, newType, RANK_SENDER, * TAG_NEWTYPE, MPI_COMM_WORLD, status, err) Call MPI_Get_count(status, newType, recvCount, err) Write(*, *) 'Received count : ', recvCount Write(*, *) 'Received data :' Call OutputNewType(data, recvCount) Return End Program TestLAM Implicit None Include 'params.h' Integer err Integer rank C 新しい MPI のデータ型 Integer newType Call MPI_Init(err) Call MPI_Comm_rank(MPI_COMM_WORLD, rank, err) C 新しいデータ型を作成、登録します Call CreateNewType(newType) If(rank .eq. RANK_SENDER) Then Call Send(newType) Else If(rank .eq. RANK_RECVER) Then Call Recv(newType) EndIf C 新しいデータ型の登録を解除します Call FreeNewType(newType) Call MPI_Finalize(err) Write(*, *) 'Exit : ', rank Stop End |
Last update was done on 2002.11.14