Saya menulis sebuah program untuk menemukan jumlah elemen array dengan MPI. Root dan pekerja menemukan jumlah sebagian dan pekerja mengirimkan sebagian jumlah ke root pada akhirnya. Ketika saya mencoba dengan array berukuran statis tidak ada masalah. Tapi itu memberikan kesalahan segmentasi jika saya menggunakan calloc. Kode sumber diberikan di bawah ini:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define tag1 1 /* send from root to workers */
#define tag2 2 /* send from workers to root */
#define root 0
#define n_data 12
int main(int argc, char *argv[])
{
int total_sum, partial_sum;
int my_id, i, n_procs, n_portion;
MPI_Init(&argc, &argv);
MPI_Status status;
MPI_Comm_rank(MPI_COMM_WORLD, &my_id);
MPI_Comm_size(MPI_COMM_WORLD, &n_procs);
n_portion=n_data/n_procs;
int *array = (int *)calloc(n_data, sizeof(int));
int *local = (int *)calloc(n_portion, sizeof(int));
if(my_id == root) {
/* initialize array */
for(i = 0; i < n_data; i++)
array[i]=i;
/* send a portion of the array to each worker */
for(i= 1; i < n_procs; i++)
MPI_Send( &array[i*n_portion], n_portion, MPI_INT,i, tag1, MPI_COMM_WORLD);
/* calculate the sum of my portion */
for(i = 0; i < n_portion; i++)
total_sum += array[i];
/* collect the partial sums from workers */
for(i= 1; i < n_procs; i++) {
MPI_Recv( &partial_sum, 1, MPI_INT, MPI_ANY_SOURCE,tag2, MPI_COMM_WORLD, &status);
total_sum += partial_sum;
}
printf("The total sum is: %d\n", total_sum);
}
else { /* I am a worker, receive data from root */
MPI_Recv( &local, n_portion, MPI_INT, root, tag1, MPI_COMM_WORLD, &status);
/* Calculate the sum of my portion of the array */
partial_sum = 0;
for(i = 0; i < n_portion; i++)
partial_sum += local[i];
/* send my partial sum to the root */
MPI_Send( &partial_sum, 1, MPI_INT, root, tag2, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
Kesalahan yang saya ambil adalah:
-bash-4.1$ mpirun -np 3 distApprox
--------------------------------------------------------------------------
mpirun noticed that process rank 2 with PID 110834 on node levrek1 exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
Terimakasih atas bantuannya.
n_portion
? - person PaulMcKenzie   schedule 16.12.2015n_portion = 4
. - person smtnkc   schedule 16.12.2015n_procs
adalah 2 root akan menghitung separuh array danworker1
akan menghitung separuh lainnya. - person smtnkc   schedule 16.12.2015calloc
dengan variabel yang kami tidak tahu apa itu. Bagaimana dengan hard-coding4
daripada menggunakan variabel? Jika Anda melakukan hal tersebut, apakah Anda masih mengalami masalah tersebut? - person PaulMcKenzie   schedule 16.12.2015calloc()
. Mungkin itu gagal. - person John Zwinck   schedule 16.12.2015total sum
. Fakta ini membuat saya percaya bahwa Anda perlu menaikkan tingkat peringatan Anda. Tambahkan-wall
ke baris perintah kompiler Anda (dengan asumsi Anda menggunakangcc
). - person Klas Lindbäck   schedule 16.12.2015local
dari pada&local
dalam panggilanMPI_Recv
? - person Martin Zabel   schedule 16.12.2015n_portion
sebagai 4. Jadi, saya menginisialisasitotal_sum = 0
seperti yang ditunjukkan Klas, dan mengubah&local
menjadilocal
seperti yang ditunjukkan Martin. Berhasil! Terima kasih. - person smtnkc   schedule 17.12.2015