저는 MPI 프로그래밍을 시작하고 OpenMPI를 사용하여 간단한 분산 qsort를 만들기로 결정했습니다. 나에게 내가 MPI_Scatterv를 사용하는 것을 시도하고 정렬 할 배열의 일부 그러나 다음 코드 세그먼테이션 폴트 (segfault)를 배포하려면 : 나는 Scatterv 사용에 대한 갈 것이라고 어떻게MPI_Scatterv segfault
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <mpi.h>
#define ARRAY_SIZE 26
#define BUFFER_SIZE 2048
int main(int argc, char** argv) {
int my_rank, nr_procs;
int* data_in, *data_out;
int* sizes;
int* offsets;
srand(time(0));
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nr_procs);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
// everybody generates the control tables
int nr_workers = nr_procs-1;
sizes = malloc(sizeof(int)*nr_workers);
offsets = malloc(sizeof(int)*nr_workers);
int nr_elems = ARRAY_SIZE/nr_workers;
// basic distribution
for (int i = 0; i < nr_workers; ++i) {
sizes[i] = nr_elems;
}
// distribute the remainder
int left = ARRAY_SIZE%nr_workers;
int curr_worker = 0;
while (left) {
++sizes[curr_worker];
curr_worker = (++curr_worker)%nr_workers;
--left;
}
// offsets
int curr_offset = 0;
for (int i = 0; i < nr_workers; ++i) {
offsets[i] = curr_offset;
curr_offset += sizes[i];
}
if (my_rank == 0) {
// root
data_in = malloc(sizeof(int)*ARRAY_SIZE);
data_out = malloc(sizeof(int)*ARRAY_SIZE);
for (int i = 0; i < ARRAY_SIZE; ++i) {
data_in[i] = rand();
}
for (int i = 0; i < nr_workers; ++i) {
printf("%d at %d\n", sizes[i], offsets[i]);
}
MPI_Scatterv (data_in, sizes, offsets, MPI_INT, data_out, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD);
} else {
// worker
printf("%d has %d elements!\n",my_rank, sizes[my_rank-1]);
// alloc the input buffer
data_in = malloc(sizeof(int)*sizes[my_rank-1]);
MPI_Scatterv(NULL, NULL, NULL, MPI_INT, data_in, sizes[my_rank-1], MPI_INT, 0, MPI_COMM_WORLD);
printf("%d got:\n", my_rank);
for (int i = 0; i < sizes[my_rank-1]; ++i) {
printf("%d ", data_in[i]);
}
printf("\n");
}
MPI_Finalize();
return 0;
}
를? 작업자 코드 내부에서 입력 버퍼를 할당하는 데 문제가 있습니까?
당신에게 설명과 유용한 팁을 주셔서 대단히 감사합니다! 초보자로서 저는 MPI에 관한 문서가 꽤 부족하다는 것을 알고 있습니다. 많은 참고 자료가 있지만, 대부분의 자료는 잘 설명되어 있지 않습니다. 나에게도 루트 프로세스가 데이터를 보내지는 않습니다 (추후에 완벽한 의미를 가짐). 슬프게도 나는 너무 새롭기 때문에 당신의 기여에 대해 당신을 대신 할 수는 없다 : ( –
@SidCasey : 아무런 문제 없다 : 나의 대답을 받아 들였고 더 요구할 수 없다! – francis
나는 Deino가 아니다. 하지만 MPI에 대한 그의 참조 페이지가 마음에 든다. http://mpi.deino.net/mpi_functions/MPI_Scatter.html –