Hallo Iam试图用C语言编写一个用于MPI的simlpe parralel程序。程序应该在数组中找到最大值。根进程应该使用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);
}
答案 0 :(得分:1)
将指针初始化为NULL,并跟踪它们。 使用buf1而不是&amp; 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;
}
祝你好运!