Hallo Iam尝试使用MPI编写C语言的simlpe并行程序。程序应在数组中找到最大值。根进程应使用MPI_Scatter将数组的块发送给所有进程,然后由MPI_Gather收集结果。当我运行程序时,出现如下一般错误:
也许此Unix错误消息会有所帮助:
Unix错误号:14
地址错误
我知道MPI_Scatter和MPI_Gather或我发送给此函数的值有问题。
我试图找到解决方案,但没有发现任何有用的方法。
这是我的代码:
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 9
int max(int *buf, int N){
int i;
int value = 0;
for(i=0; i<N; i++){
if (buf[i]>value){
value = buf[i];
}
}
return value;
}
int main(int argc, char** argv)
{ int size, rank;
int slave;
int *buf;
int *buf1;
int *buf2;
int i, n, value;
MPI_Status status;
/* Initialize MPI */
MPI_Init(NULL, NULL);
/*
* Determine size in the world group.
*/
MPI_Comm_size(MPI_COMM_WORLD, &size);
if ((BUFSIZE % size) != 0) {
printf("Wrong Bufsize ");
return(0);
}
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank==0) {
buf = (int *)malloc(BUFSIZE*sizeof(int));
buf2 = (int *)malloc(size*sizeof(int));
printf("\n Generated array: \n");
for(i=0; i<BUFSIZE; i++){
buf[i] = rand() % 20;
printf("%d, ", buf[i]);
}
printf("\n");
printf("\n Sending values to processes:");
printf("\n -----------------------------");
}
buf1 = (int *)malloc((BUFSIZE/size)*sizeof(int));
MPI_Scatter(buf, BUFSIZE/size, MPI_INT, buf1, BUFSIZE/size, MPI_INT, 0, MPI_COMM_WORLD);
value = max(&buf1[0], BUFSIZE/size);
printf("\n Max from rocess %d : %d \n", rank, max(&buf1[0], BUFSIZE/size));
MPI_Gather(&value, 1, MPI_INT, buf2, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0){
printf("\n Max value: %d", max(&buf2[0], size));
}
MPI_Finalize();
return(0);
}
最佳答案
初始化指向NULL的指针,并对其进行跟踪。
使用buf1代替&buf1 [0]更清楚。
使用以下命令在MPI_Finalize()之前释放缓冲区:
if(bufferPionter != NULL) free(bufferPionter);
如果指针有问题,则免费通话中将崩溃。在max函数中,如果所有数字均小于零,则maximun为零。我解决了。
int max(int *buf, int N){
int i;
int value = N? buf[0] : 0;
for(i=0; i<N; i++){
if (buf[i]>value){
value = buf[i];
}
}
return value;
}
最好的祝福!
关于c - MPI_Scatter和MPI_Gather不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19407128/