2017-05-24 50 views
0

的爲什麼這行代碼:行爲MPI_SEND和MPI_RECV

if(my_rank != 0) { 
    sprintf(msg, "Hello from %d of %d...", my_rank, comm_sz); 
    if(my_rank == 2) { 
     sleep(2); 
     sprintf(msg, "Hello from %d of %d, I have slept 2 seconds...", my_rank, comm_sz); 
    } 
    MPI_Send(msg, strlen(msg), MPI_CHAR, 0, 0, MPI_COMM_WORLD); 
} 
else { 
    printf("Hello from the chosen Master %d\n", my_rank); 
    for(i = 1; i < comm_sz; i++) { 
     MPI_Recv(msg, MAX_STRING, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     printf("%s\n", msg); 
    } 
} 

給這個結果呢?

Hello from the chosen Master 0 
Hello from 1 of 5... 
Hello from 2 of 5, I have slept 2 seconds... 
Hello from 3 of 5... have slept 2 seconds... 
Hello from 4 of 5... have slept 2 seconds... 

是不是每個進程都有它的'msg'副本?

+0

你期望什麼?請注意,MPI不適用於線程,而是進程。 – Zulan

+0

@Zulan我希望只有第二個過程會寫_I睡了2秒... _ – Caramelleamare

回答

2

strlen()不包含空終止符,因此它不會被髮送到主。從等級3接收消息不會覆蓋字符串的後面部分,因此它仍然顯示。您應該使用strlen(msg) + 1作爲發送計數。

+0

真是一個愚蠢的,我忘記了它。謝謝。 – Caramelleamare