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(&currentTime);
    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

 

 

 

 
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()