C 如何通过MPI_send发送整数数组?

C 如何通过MPI_send发送整数数组?,c,arrays,mpi,C,Arrays,Mpi,我试图用常规的C语言创建一个程序,在任意数量的进程之间平均分割一个整数数组。出于调试目的,我使用了一个12个数字的整数数组,只有2个进程,这样主进程将有[1,2,3,4,5,6],而从进程1将有[7,8,9,10,11,12]。但是,我收到一个错误消息:MPI\u ERR\u BUFFER:invalid BUFFER pointer 经过一些研究,我发现有一个函数可以做到这一点(MPI\u Scatter)。不幸的是,由于我正在学习MPI,所以实现仅限于MPI\u Send和MPI\u Rec

我试图用常规的C语言创建一个程序,在任意数量的进程之间平均分割一个整数数组。出于调试目的,我使用了一个12个数字的整数数组,只有2个进程,这样主进程将有[1,2,3,4,5,6],而从进程1将有[7,8,9,10,11,12]。但是,我收到一个错误消息:
MPI\u ERR\u BUFFER:invalid BUFFER pointer

经过一些研究,我发现有一个函数可以做到这一点(
MPI\u Scatter
)。不幸的是,由于我正在学习MPI,所以实现仅限于
MPI\u Send
MPI\u Recv
。无论如何,
MPI_Send
MPI_Recv
都使用void*,我正在发送一个int*,所以它应该可以工作。有人能指出我做错了什么吗?多谢各位

int* create_sub_vec(int begin, int end, int* origin);
void print(int my_rank, int comm_sz, int n_over_p, int* sub_vec);

int main(void){

    int comm_sz;
    int my_rank;

    int vec[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int* sub_vec = NULL;
    int n_over_p;

    MPI_Init(NULL, NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);    

    n_over_p = 12/comm_sz;
    printf("Process %d calcula n_over_p = %d\n", my_rank, n_over_p);

    if (my_rank != 0) {
        MPI_Recv(sub_vec, n_over_p, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        print(my_rank, comm_sz, n_over_p, sub_vec);

    } else {

        printf("Distribuindo dados\n");
        for (int i = 1; i < comm_sz; i++) {
            sub_vec = create_sub_vec(i*n_over_p, (i*n_over_p)+n_over_p, vec);
            MPI_Send(sub_vec, n_over_p, MPI_INT, i, 0, MPI_COMM_WORLD);
        }
        printf("Fim da distribuicao de dados\n");

        sub_vec = create_sub_vec(0, n_over_p, vec);

        print(my_rank, comm_sz, n_over_p, sub_vec);
    }

    MPI_Finalize();
    return 0;

}

int* create_sub_vec(int begin, int end, int* origin){
    int* sub_vec;
    int size;
    int aux = 0;
    size = end - begin;
    sub_vec = (int*)malloc(size * sizeof(int));
    for (int i = begin; i < end; ++i) {
        *(sub_vec+aux) = *(origin+i);
        aux += 1;
    }
    return  sub_vec;
}

void print(int my_rank, int comm_sz, int n_over_p, int* sub_vec){
    printf("Process %d out of %d received sub_vecotr: [ ", my_rank, comm_sz);
    for (int i = 0; i < n_over_p; ++i)
    {
        printf("%d, ", *(sub_vec+i));
    }
    printf("]\n");
}
int*创建子向量(int开始、int结束、int*原点);
无效打印(int my_rank、int comm_sz、int n_over_p、int*sub_vec);
内部主(空){
国际通讯社;
int我的_等级;
int-vec[12]={1,2,3,4,5,6,7,8,9,10,11,12};
int*sub_vec=NULL;
int n_over p;
MPI_Init(NULL,NULL);
MPI_Comm_大小(MPI_Comm_WORLD和Comm_sz);
MPI通信等级(MPI通信世界和我的通信等级);
n_over_p=12/comm_sz;
printf(“进程%d计算n\u超过p=%d\n”,我的排名,n\u超过p);
如果(我的排名!=0){
MPI_Recv(子向量、n_over_p、MPI_INT、0、0、MPI_COMM_WORLD、MPI_STATUS_IGNORE);
打印(我的排名、通讯sz、n超过p、次级vec);
}否则{
printf(“分布式墙裙”);
对于(int i=1;i
问题在于
sub_-vec
未在非零秩上分配。 这由您决定(例如,MPI不分配接收缓冲区)

接收部分应该如下所示

if (my_rank != 0) {
    sub_vec = (int *)malloc(n_over_p * sizeof(int));    
    MPI_Recv(sub_vec, n_over_p, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}

正如您所写,自然的方法是通过
MPI_Scatter()
(同样,在开始分散之前,由您分配接收缓冲区。

您是否尝试实现并行排序?不,这是一个简单的并行向量元素求和练习。