MPI_Scatter无法正常工作

时间:2014-11-18 21:59:17

标签: c mpi scatter

我正在尝试编写一个程序,它用4个节点计算,函数MPI_Scatter是前N个数字的总和。

程序询问每个节点应该计算的数字(例如,如果你输入5,主节点将创建一个大小为20的数组,每个节点将计算5个数字的总和),然后将其返回对主人。最后,master然后计算所有返回值的总和(使用MPI_Gather)。

node0 - > 1 + 2 + 3 + 4 + 5 = 15

node1 - > 6 + 7 + 8 + 9 + 10 = 40

...

node0 - > 15 + 40 + ......

你明白了。

我坚持使用MPI_Scatter功能 - 它只是无法正常工作......

我收到错误:

" malloc 3中的错误:无法分配内存"

我的代码:

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

int *createArray (int st_proc, int input) {
    int *array;
    array = malloc(input*st_proc*sizeof(int));
    int i;
    for (i=0; i<input*st_proc; i++) {
        array[i] = i+1;
    }

    return array;
}

void printArray (int *row, int nElements) {
    int i;
    for (i=0; i<nElements; i++) {
        printf("%d ", row[i]);
    }
    printf("\n");
}

int main (int argc, char **argv) {

    MPI_Init(&argc, &argv);
    int nproc, id;
    MPI_Comm_size(MPI_COMM_WORLD, &nproc); // Get number of processes
    MPI_Comm_rank(MPI_COMM_WORLD, &id); // Get own ID

    int *array;
    int input;
    if (id == 0) {
        printf("Vnesi stevilo: \n");
        scanf("%d",&input);
        array = createArray(nproc, input); // Master process creates matrix
        printf("Initial matrix:\n");
        printArray(array, input*nproc);
    }
    MPI_Barrier(MPI_COMM_WORLD);
    int *procRow = malloc(sizeof(int) * input); // received row will contain input integers
    if (procRow == NULL) {
        perror("Error in malloc 3");
        exit(1);
    }

    if (MPI_Scatter(array, input, MPI_INT, // send one row, which contains input integers
                procRow, input, MPI_INT, // receive one row, which contains input integers
                0, MPI_COMM_WORLD) != MPI_SUCCESS) {

        perror("Scatter error");
        exit(1);
    }

    printf("Process %d received elements: ", id);
    printArray(procRow, input);

    MPI_Finalize();

    return 0;
}

1 个答案:

答案 0 :(得分:4)

您收到此错误的原因是,当您拨打专线int *procRow = malloc(sizeof(int) * input);时,只有等级0具有input的有效值。所有其他排名都不知道用户输入了什么,并且input未初始化,使其在malloc未定义的行为中使用。将MPI_Barrier命令替换为行MPI_Bcast(&input, 1, MPI_INT, 0, MPI_COMM_WORLD);,您的代码应该有效。