私は、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関数を必要と判明しました。
あなたは[MCV](https://stackoverflow.com/help/mcve)を投稿することができます:ここで
は、ステップ3は次のようになりますか。? – atru私は家に帰ることを試みるでしょう –
なぜあなたは 'malloc'' global_sample_receiver'をして、その後にそれを上書きしますか? –