close
1. 下載安裝Microsoft MPI
2. Visual Studio 編譯MPI環境設定
3. 加入標頭檔案
#include <mpi.h>
#include <time.h>
4.修改main()
int main(i nt argc, char** argv )
{
int num_procs;
int rank;
// (1) 初始化
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("%d: hello (p=%d)\n", rank, num_procs);
/*(2) 多個processors同時執行任務
Do many things, all at once */
round_robin(rank, num_procs);
printf("%d: Goodbye \n", rank);
// (3) 結束
MPI_Finalize();
}
5. round_robin定義如下
void round_robin(int rank, int procs)
{
// 產生本身processor的亂數和前一個亂數
long int rand_mine, rand_prev;
// rank_next: 下一個processor的rank
// rank_prev: 前一個processor的rank
int rank_next = (rank + 1) % procs;
int rank_prev = (rank == 0) ? procs - 1 : rank - 1;
MPI_Status status;
// 亂數種子 = 時間加上rank
srand(time(NULL) + rank);
rand_mine = rand() % (RAND_MAX / 100);
time();
printf("%d: random is %d\n", rank, rand_mine);
}
6. 加入顯示目前時間
#include <windows.h>
void time()
{
SYSTEMTIME currentTime;
GetSystemTime(¤tTime);
printf("time: %u/%u/%u %u:%u:%u:%u\n",
currentTime.wYear, currentTime.wMonth, currentTime.wDay,
currentTime.wHour+8, currentTime.wMinute, currentTime.wSecond,
currentTime.wMilliseconds, currentTime);
}
7. 測試
> mpiexec -n 3 ./MPIPassMsg.exe
設計一個環形傳遞亂數的例子
每個rank本身產生一組隨機亂數rand_mine,並將該數值傳遞給下一個rank(即rank_next)
每個rank列印接收到的亂數(即rand_prev)和對應該亂數的傳遞者(即rank_prev)
可以先假設由(1)偶數傳送給奇數 MPI_Send (2)再撰寫奇數接收 MPI_Recv
同理可證: (3) 奇數傳送給偶數 MPI_Send (4) 再撰寫偶數接收 MPI_Recv
if (rank % 2 == 0) // 偶數rank
{
// (1) 發送 MPI_Send
printf("%d: sending %d to %d", rank, rand_mine, rank_next);
currentTime(rank);
MPI_Send((void *)&rand_mine, 1, MPI_LONG, rank_next, 0, MPI_COMM_WORLD);
// (3) 接收 MPI_Recv
printf("%d: receiving from %d", rank, rank_prev);
currentTime(rank);
MPI_Recv((void*)&rand_prev, 1, MPI_LONG, rank_prev, 0, MPI_COMM_WORLD, &status);
printf("%d: rand_prev is %d\n", rank, rand_prev);
}
else // 奇數rank
{
// (2) 接收
printf("%d: receiving from %d", rank, rank_prev);
currentTime(rank);
MPI_Recv((void*)&rand_prev, 1, MPI_LONG, rank_prev, 0, MPI_COMM_WORLD, &status);
printf("%d: rand_prev is %d\n", rank, rand_prev);
// (4) 發送
printf("%d: sending %d to %d", rank, rand_mine, rank_next);
currentTime(rank);
MPI_Send((void *)&rand_mine, 1, MPI_LONG, rank_next, 0, MPI_COMM_WORLD);
}
$ mpiexec -n 4 ./MPIPassMsg2.exe
全站熱搜
留言列表