ソース 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