2017-05-24 67 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