Hallo Iam은 MPI를 사용하여 C 언어로 병렬 프로그램을 작성하려고합니다. 프로그램은 배열에서 최대를 찾아야합니다. 루트 프로세스는 MPI_Scatter를 사용하여 모든 프로세스에 배열 청크를 보내고 MPI_Gather로 결과를 수집해야합니다. 나는이 프로그램을 실행하면이 같은 일반적인 오류가 발생합니다 : MPI_Scatter 및 MPI_Gather는 작동하지 않습니다.
는 아마도이 유닉스 오류 메시지가 도움이 될 것입니다 : 유닉스의 errno : 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);
}
마지막'printf' 문 안에서'max()'에 대한 두 번째 호출에서 뭔가가 빠졌습니다. –
마지막'printf' 문에도 % d이 없습니다. – Dusty
맞아요,하지만 여기에 코드를 복사하는 동안 분실했습니다. 아무 문제없이 프로그램을 컴파일 할 수는 있지만 실행할 수는 없습니다. –