2013-12-15 62 views
1

我打算使用MPI集体通信实现一项简单的任务,但是MPI是新手,我发现集体例程有点不直观。我有4个从站,每个从站都必须读取一个唯一的字符串并将字符串发送给所有其他从站。MPI_Alltoall是否正确使用?

我看着MPI_Bcast,MPI_Scatter和MPI_Alltoall。我解决了MPI_Alltoall,但程序以不良终止结束。

该方案是:

int main(int argc,char *argv[]) 
{ 
    int my_rank, num_workers; 
    MPI_Comm SLAVES_WORLD; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &num_workers); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    createSlavesCommunicator(&SLAVES_WORLD); 

    char send_msg[20], recv_buf[20]; 
    sprintf(send_msg, "test string %d", my_rank); 

    MPI_Alltoall(send_buf, strlen(send_buf), MPI_CHAR, recv_buf, 20, MPI_CHAR, MPI_COMM_WORLD); 
    printf("slave %d recvd message %s\n", my_rank, recv_buf); 

}

void createSlavesCommunicator(MPI_Comm *SLAVES_WORLD) 
{ 
    MPI_Group SLAVES_GROUP, MPI_COMM_GROUP; 

    int ranks_to_excl[1]; 
    ranks_to_excl[0] = 0; 

    MPI_Comm_group(MPI_COMM_WORLD, &MPI_COMM_GROUP); 
    MPI_Group_excl(MPI_COMM_GROUP, 1, ranks_to_excl, &SLAVES_GROUP); 

    MPI_Comm_create(MPI_COMM_WORLD, SLAVES_GROUP, SLAVES_WORLD); 
} 
+0

程序崩溃在哪里?全能或传播者创造是否存在问题? –

回答

1

MPI_AlltoAll()发送消息从每个人到每个人。如果每个进程发送20个字符,输入和输出缓冲区应该大于20。从您的代码开始,这里是MPI_AlltoAll()是如何工作的:

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <string.h> 
#include "mpi.h" 

int main(int argc,char *argv[]) 
{ 
    int my_rank, num_workers; 
    MPI_Comm SLAVES_WORLD; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &num_workers); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    //createSlavesCommunicator(&SLAVES_WORLD); 

    char send_msg[20*num_workers], recv_buf[20*num_workers]; 
    int i; 
    for(i=0;i<num_workers;i++){ 
     sprintf(&send_msg[i*20], "test from %d to %d", my_rank,i); 
    } 

    MPI_Barrier(MPI_COMM_WORLD); 
    //MPI_Alltoall(send_msg, strlen(send_msg), MPI_CHAR, recv_buf, 20, MPI_CHAR, MPI_COMM_WORLD); 
    MPI_Alltoall(send_msg, 20, MPI_CHAR, recv_buf, 20, MPI_CHAR, MPI_COMM_WORLD); 
    MPI_Barrier(MPI_COMM_WORLD); 


    for(i=0;i<num_workers;i++){ 
     printf("slave %d recvd message %s\n", my_rank, &recv_buf[20*i]); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

看着你的问题,似乎MPI_ALLGATHER()是一个会做的伎俩功能...

“的块从第j个处理发送的数据由每一个过程接收并放置在缓冲器recvbuf的第j个块“。

http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Allgather.html

再见,

Francis