2017-03-09 3 views
-1

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 및/또는 주소와 포인터를 사용했다고 할 수있다.

코드 량은 죄송 합니다만 적절한 디버깅을 위해 모든 코드를 제공하는 것이 더 좋을 것이라고 생각했습니다.

+0

수행 방법 : 세분화 오류가 발생하지 않을 때까지 코드의 단계별 단계를 제거하고 그 원인을 찾을 수 있습니다. – nbro

+0

디버거를 배우는 것이 훨씬 더 효과적입니다. 그러나 [mcve]로 적절한 질문을하기 위해 @nbro가 제안한 것을 할 필요가 있습니다. – Zulan

답변

0

이유는 여기에 numbers.txt 파일이 없습니다.

코드가있는 디렉터 내에 "numbers.txt"라는 입력 파일을 만들어야합니다. 당신의 numbers.txt 내부

> cat numbers.txt 
1 
2 
3 
4 
5 
6 
7 
8 

:

예를 들어, 같은 것을 넣어. 그 후. 여기에 우리가 간다. 결과는 여기에 있습니다.

> ./sample 
yess 
2 

일반적으로, 그것은이다 당신은 디버거에 익숙해 다른 사람들로부터 좋은 조언을 얻었다. 도움이 될거야. 여기를보세요 :

run 
Process 2641 launched: '.../tmp/sample' (x86_64) 
yess 
Process 2641 stopped 
* thread #1: tid = 0x144bc, 0x00007fffb89ff6a0 libsystem_c.dylib`flockfile + 4, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x68) 
    frame #0: 0x00007fffb89ff6a0 libsystem_c.dylib`flockfile + 4 
libsystem_c.dylib`flockfile: 
-> 0x7fffb89ff6a0 <+4>: movq 0x68(%rdi), %rdi 
    0x7fffb89ff6a4 <+8>: addq $0x8, %rdi 
    0x7fffb89ff6a8 <+12>: popq %rbp 
    0x7fffb89ff6a9 <+13>: jmp 0x7fffb8a4898e   ; symbol stub for: pthread_mutex_lock 
(lldb) bt 
* thread #1: tid = 0x144bc, 0x00007fffb89ff6a0 libsystem_c.dylib`flockfile + 4, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x68) 
    * frame #0: 0x00007fffb89ff6a0 libsystem_c.dylib`flockfile + 4 
    frame #1: 0x00007fffb8a019d0 libsystem_c.dylib`fscanf + 156 
    frame #2: 0x0000000100001399 sample`read(size=1, rank=0, part=0x00007fff5fbf5d80) + 121 at sample.c:31 
    frame #3: 0x00000001000015a3 sample`main(argc=1, argv=0x00007fff5fbff9f0) + 179 at sample.c:52 
    frame #4: 0x00007fffb898d255 libdyld.dylib`start + 1 

감사를 디버거 내에서 코드를 실행에 당신이 할 수있는 무언가가 잘못 쉽게 자리 장소 -> 당신이 파일에서 데이터를 읽으려고 sample.c에 라인 (31).

이 재미를)

그래서 힘든하고 GDB/lldb를 사용하여 코드를 디버깅하는 방법을 배우기 시작!