Pengurangan yang diimplementasikan menggunakan MPI_Allreduce()
direproduksi selama Anda menggunakan jumlah prosesor yang sama, asalkan implementasi mengamati catatan berikut ini muncul di Bagian 5.9.1 dari standar MPI-2.2.
Saran untuk pelaksana . Sangat disarankan MPI_REDUCE
untuk diimplementasikan sehingga hasil yang sama diperoleh setiap kali fungsi diterapkan pada argumen yang sama, muncul dalam urutan yang sama. Perhatikan bahwa ini dapat mencegah optimasi yang memanfaatkan lokasi fisik prosesor. ( Akhir saran untuk pelaksana .)
Jika Anda perlu menjamin reproduktifitas dengan cara apa pun, Anda dapat mengikuti panduan di paragraf berikut:
Nasihat untuk pengguna . Beberapa aplikasi mungkin tidak dapat mengabaikan sifat non-asosiatif dari operasi floating-point atau dapat menggunakan operasi yang ditentukan pengguna (lihat Bagian 5.9.5) yang memerlukan urutan pengurangan khusus dan tidak dapat diperlakukan sebagai asosiatif. Aplikasi semacam itu harus menegakkan urutan evaluasi secara eksplisit. Misalnya, dalam kasus operasi yang memerlukan urutan evaluasi dari kiri ke kanan (atau kanan ke kiri) yang ketat, ini dapat dilakukan dengan mengumpulkan semua operan dalam satu proses tunggal (misalnya, dengan
MPI_GATHER
), menerapkan operasi pengurangan dalam urutan yang diinginkan (misalnya, dengan
MPI_REDUCE_LOCAL
), dan jika perlu, menyiarkan atau menyebarkan hasilnya ke proses lain (misalnya, dengan MPI_BCAST
). ( Akhir saran untuk pengguna .)
Dalam skema yang lebih luas, algoritma yang efisien untuk sebagian besar aplikasi memanfaatkan lokalitas. Karena algoritma ini benar-benar berbeda ketika dijalankan pada sejumlah proses yang berbeda, tidak praktis untuk mereproduksi hasil secara tepat ketika dijalankan pada sejumlah proses yang berbeda. Pengecualian yang mungkin adalah multigrid dengan Jacobi teredam atau polinomial (misalnya Chebyshev), di mana dimungkinkan untuk metode sederhana ini bekerja dengan sangat baik.
Dengan jumlah proses yang sama, seringkali bermanfaat bagi kinerja untuk memproses pesan dalam urutan yang diterima (misalnya menggunakan MPI_Waitany()
), yang memperkenalkan non-determinisme. Dalam kasus seperti itu, Anda dapat mengimplementasikan dua varian, yang cepat yang menerima dalam urutan apa pun dan yang "men-debug" yang menerima dalam urutan statis. Ini mensyaratkan bahwa semua pustaka yang mendasarinya juga ditulis untuk menawarkan perilaku ini.
Untuk debugging dalam beberapa kasus, Anda dapat mengisolasi bagian dari perhitungan yang tidak menawarkan perilaku yang dapat direproduksi ini dan melakukan hal itu secara berlebihan. Tergantung pada bagaimana komponen dirancang, perubahan itu mungkin sejumlah kecil kode atau sangat mengganggu.