2017-12-17 28 views
1

저는 Chan 및 Dehne 정렬 알고리즘을 MPI 및 CGM 현실감있는 병렬 모델을 사용하여 구현하고 있습니다. 지금까지 각 프로세스는 원래 벡터에서 N/P 번호를받으며 각 프로세스는 빠른 정렬을 사용하여 순차적으로 번호를 정렬합니다. 각 프로세스는 로컬 벡터 (샘플은 크기 p를 가짐)로부터 샘플을 생성하고 각 프로세스는 샘플을 ~ P0; P0는 모든 프로세서의 데이터를 수용 할 수 있도록 크기가 더 큰 벡터 p * p의 모든 샘플을 수신해야합니다. 이것은 내가 꼼짝 못하는 부분입니다. 작동하는 것처럼 보입니다. 그러나 P0가 Signal : Segmentation fault (11)로 끝나는 모든 데이터를받은 후 어떤 이유로 인해 발생합니다. 고맙습니다.MPI_Recv를 사용하여 벡터를 수신하려고 시도했습니다.

// Step 2. Each process calculates it's local sample with size comm_sz 
     local_sample = create_local_sample(sub_vec, n_over_p, comm_sz); 

// Step 3. Each process sends it's local sample to P0 
     if (my_rank == 0) { 
      global_sample_receiver = (int*)malloc(pow(comm_sz,2)*sizeof(int)); 
      global_sample_receiver = local_sample; 
      for (i = 1; i < comm_sz; i++) { 
       MPI_Recv(global_sample_receiver+(i*comm_sz), comm_sz, MPI_INT, 
       i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
      } 
     } else { 
      MPI_Send(local_sample, comm_sz, MPI_INT, 0, 0, MPI_COMM_WORLD); 
     } 

     printf("P%d got here\n", my_rank); 

     MPI_Finalize(); 

무엇 재미 것은 모든 프로세스는 명령 printf("P%d got here\n", my_rank); 및 터미널에 그에 대한 인쇄를 reachs이다 :

여기에 코드의 관련 부분이다. 또한 global_sample_receiver에는 끝에 포함될 것으로 예상되는 데이터가 들어 있지만 프로그램은 여전히 ​​세그먼트 화 오류로 종료됩니다. 나는이 문제를 발견 local_sample도 malloc을 필요로 밝혀 :

P2 got here 
P0 got here 
P3 got here 
P1 got here 
[Krabbe-Ubuntu:05969] *** Process received signal *** 
[Krabbe-Ubuntu:05969] Signal: Segmentation fault (11) 
[Krabbe-Ubuntu:05969] Signal code: Address not mapped (1) 
[Krabbe-Ubuntu:05969] Failing at address: 0x18000003e7 
-------------------------------------------------------------------------- 
mpiexec noticed that process rank 0 with PID 5969 on node Krabbe-Ubuntu 
exited on signal 11 (Segmentation fault). 
-------------------------------------------------------------------------- 

편집 : 여기

이 출력됩니다.

+1

는 당신이 [MCV (https://stackoverflow.com/help/mcve)을 게시 할 수 있습니다 : 여기

3 단계의 모습인가? – atru

+0

나는 집에 돌아가려고 노력할 것이다. –

+0

왜 'malloc''global_sample_receiver'를 작성한 후 그 행을 덮어 씁니까? –

답변

2

global_sample_receiver (포인터 임)을 local_sample (다른 포인터)으로 덮어 쓰고 있다는 점에 유의하십시오. 당신이 local_sample에서 첫 번째 comm_sz 요소와 global_sample_receiver의 첫 번째 comm_sz 요소를 설정하려면

, 당신은 (예를 들어, 하지 포인터) 수동으로 데이터를 복사해야합니다. 상기되는 그게

memcpy(global_sample_receiver, local_sample, comm_sz * sizeof(int)); 

, 이렇게 자연 MPI 방법은 MPI_Gather() 경유.

// Step 3. Each process sends it's local sample to P0 
if (my_rank == 0) { 
    global_sample_receiver = (int*)malloc(pow(comm_sz,2)*sizeof(int)); 
} 
MPI_Gather(global_sample_receiver,comm_sz, MPI_INT, local_sample, comm_sz, MPI_INT, 0, MPI_COMM_WORLD);