MPI_Reduce funksiyasidan foydalanish misolini ko'rib chiqamiz . DA
Oldingi bo'limda biz o'rtachani qanday hisoblashni bilib oldik
MPI_Scatter va MPI_Gather funktsiyalari . MPI_Reduce- dan foydalanish soddalashtiradi
juda ko'p kod, bu erda kodning faqat asosiy qismi ko'rsatilgan.
float *rand_nums = NULL;
rand_nums = yaratish_rand_raqamlari (har_proc uchun_elementlar_soni);
float local_sum = 0; int i;
uchun (i = 0; i < har_proc uchun_elementlar soni; i++) {
mahalliy_sum += rand_sonlar[i];
}
printf("%d - %f jarayoni uchun mahalliy yig'indi, avg = %f\n",
mahalliy_sum, mahalliy_sum / har_proc uchun_elementlar soni);
dunyo_darajasi,
Machine Translated by Google
MPI_Reduce(&local_sum, &global_sum, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD);
agar (jahon_darajasi == 0) {
printf("Jami summa = %f, avg = %f\n", global_sum,
global_sum / (jahon_o'lchami * har bir ish uchun_elementlar soni));
} Yuqoridagi kodda har bir jarayon tasodifiy sonlarni hosil qiladi
va local_sum mahalliy summasini hisoblab chiqadi. Keyin local_sum ga kamayadi
MPI_SUM yordamida ildiz jarayoni .
Bir vaqtning o'zida ko'p ilovalar uchun qisqartirilgan ruxsat kerak bo'ladi faqat ildiz jarayoniga emas, balki barcha jarayonlarga olib keladi. Buning uchun MPI_Allreduce funktsiyasidan foydalaniladi:
MPI_Allreduce( bekor* yuborish_maÿlumotlari, bekor* recv_maÿlumotlari, int soni, MPI_Datatype ma'lumotlar turi, MPI_Op op, MPI_Comm kommunikatori)
MPI_Allreduce ning bajarilish strukturasi quyida tasvirlangan.
Do'stlaringiz bilan baham: |