我正在尝试编写一个程序,它用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;
}
答案 0 :(得分:4)
您收到此错误的原因是,当您拨打专线int *procRow = malloc(sizeof(int) * input);
时,只有等级0具有input
的有效值。所有其他排名都不知道用户输入了什么,并且input
未初始化,使其在malloc
未定义的行为中使用。将MPI_Barrier
命令替换为行MPI_Bcast(&input, 1, MPI_INT, 0, MPI_COMM_WORLD);
,您的代码应该有效。