2017-12-17 27 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には、最後に含まれるはずのデータが含まれていますが、プログラムはまだセグメント化エラーで終了しています。ここで

が出力されます:

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). 
-------------------------------------------------------------------------- 

編集:私は問題を発見し、local_sampleもmalloc関数を必要と判明しました。

+1

あなたは[MCV](https://stackoverflow.com/help/mcve)を投稿することができます:ここで

は、ステップ3は次のようになりますか。? – atru

+0

私は家に帰ることを試みるでしょう –

+0

なぜあなたは 'malloc'' global_sample_receiver'をして、その後にそれを上書きしますか? –

答えて

2

global_sample_receiver(これはポインタ)をlocal_sample(別のポインタ)で上書きして、ランク0にするという問題があります。あなたはlocal_sampleから最初comm_sz要素とglobal_sample_receiverの最初のcomm_szの要素を設定したい場合は

、あなたは(例えばないポインタ)データを手動でコピーする必要があります。言われて、これを行うの自然なMPIの方法がMPI_Gather()を経由していることを

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

// 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); 
関連する問題