Mac OS Sierra에서이 코드를 실행하려고합니다. 여기서는 항상 세그먼트 오류 11 오류가 발생합니다. 나는 Mpi와 C를 배우기 시작한다.세그먼트 오류 : 11 Mpi Mac OS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>
void merge_sort(int l,int r,int part[]){
if (!(l<r)) return ;
int m = l + (r - l)/2;
merge_sort(l,m,part);
merge_sort(m+1,r,part);
int i = l, j = m+1, k = 0;
int a[10000];
while (i<=m && j<=r) {
if (part[i]>part[j]) {a[k] = part[j];j++;}
else {a[k] = part[i];i++;}
k++;
}
while (i<=m) {a[k] = part[i];i++;k++;}
while (j<=r) {a[k] = part[j];j++;k++;}
for (i=0;i<k;i++) part[i+l] = a[i];
}
int read(int size,int rank,int part[]){
int local_sz=0;
int n;
int data[1000000];
if (rank==0){
FILE *f = fopen("numbers.txt","r");
fscanf(f,"%d",&n);
int i;
for (i=0;i<n;i++)fscanf(f,"%d",&data[i]);
local_sz = n/size;
}
MPI_Bcast(&local_sz,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Scatter(data,local_sz,MPI_INT,part,local_sz,MPI_INT,0,MPI_COMM_WORLD);
return local_sz;
}
int main(int argc,char* argv[]){
int comm_sz,my_rank,local_sz;
int part[10000];
int *other_part[10000];
int i,j;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
printf("yess\n");
local_sz=read(comm_sz,my_rank,part);
merge_sort(0,local_sz-1,part);
for (i=0;i<local_sz;i++)
printf("%d ", *(part+i));
printf("\n");
for (i=0;i<comm_sz;i++){
if (i%2 == 0){
if (my_rank % 2 == 0){
if(my_rank+1<comm_sz){
MPI_Recv(other_part,local_sz,MPI_INT,my_rank+1,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
int b[local_sz*2];
for (j = 0; j < local_sz; j++){
b[j]=part[j];
b[j+local_sz]=other_part[j];
}
merge_sort(0,local_sz*2-1,b);
for (j = 0; j < local_sz; j++){
part[j] = b[j];
other_part[j] = b[j+local_sz];
}
free(b);
MPI_Send(other_part,local_sz,MPI_INT,my_rank+1,0,MPI_COMM_WORLD);
}
}
else{
if(my_rank-1 >= 0){
MPI_Send(part,local_sz,MPI_INT,my_rank-1,0,MPI_COMM_WORLD);
MPI_Recv(part,local_sz,MPI_INT,my_rank-1,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
}
}
}
else {
if (my_rank % 2 == 1){
if(my_rank+1<comm_sz){
MPI_Recv(other_part,local_sz,MPI_INT,my_rank+1,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
int b[local_sz*2];
for (j = 0; j < local_sz; j++){
b[j]=part[j];
b[j+local_sz]=other_part[j];
}
merge_sort(0,local_sz*2-1,b);
for (j = 0; j < local_sz*2; j++)printf("%d ", b[j]);
printf("\n");
for (j = 0; j < local_sz; j++){
part[j] = b[j];
other_part[j] = b[j+local_sz];
}
free(b);
MPI_Send(other_part,local_sz,MPI_INT,my_rank+1,0,MPI_COMM_WORLD);
}
}
else {
if(my_rank-1>=0){
MPI_Send(part,local_sz,MPI_INT,my_rank-1,0,MPI_COMM_WORLD);
MPI_Recv(part,local_sz,MPI_INT,my_rank-1,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
}
}
}
}
FILE *file;
char name[100]="",t[2];
t[0] = ((char)my_rank+48);
t[1] = '\0';
strcat(name,"sorted");
strcat(name,t);
strcat(name,".txt");
file = fopen(name,"w");
fprintf(file,"Process %d: ", my_rank);
for (i=0;i<local_sz;i++)fprintf(file, "%d ", part[i]);
MPI_Finalize();
return 0;
}
나는 C에 익숙하지 않아요과 잘 같은 아마 뭔가 간단로서 내가 잘못의 malloc 및/또는 주소와 포인터를 사용했다고 할 수있다.
코드 량은 죄송 합니다만 적절한 디버깅을 위해 모든 코드를 제공하는 것이 더 좋을 것이라고 생각했습니다.
수행 방법 : 세분화 오류가 발생하지 않을 때까지 코드의 단계별 단계를 제거하고 그 원인을 찾을 수 있습니다. – nbro
디버거를 배우는 것이 훨씬 더 효과적입니다. 그러나 [mcve]로 적절한 질문을하기 위해 @nbro가 제안한 것을 할 필요가 있습니다. – Zulan