Учебное пособие Казань 018 удк



Download 2,08 Mb.
Pdf ko'rish
bet72/98
Sana16.12.2022
Hajmi2,08 Mb.
#888158
TuriУчебное пособие
1   ...   68   69   70   71   72   73   74   75   ...   98
Bog'liq
ParVychGafGal

MPI_Scatter, MPI_Gather 
принимает элементы от каждого 
процесса и собирает их в корневой процесс. Элементы упорядочены по рангу 
процесса, из которого они были получены. Прототип функции 
MPI_Gather 
идентичен 
MPI_Scatter

MPI_Gather( void* send_data, int send_count, MPI_Datatype send_datatype,
void* recv_data, int recv_count, MPI_Datatype recv_datatype, int root,
MPI_Comm communicator) 
MPI_Scatter, MPI_Gather
являются функциями, которые выполняют шаблоны 
передачи данных 
«один
 
к одному
»
или 
«
один ко многим
»,
что просто 
означает, что многие процессы отправляют, а получает один процесс или 
наоборот. Зачастую полезно иметь возможность отправлять многие элементы 
во многие процессы (т. е. шаблон передачи 
«
многие ко многим»
). Для этого в 
MPI имеется функция 
MPI_Allgather
. На следующем рисунке показано, как 
данные распределяются после вызова MPI_Allgather. 


106 
Так же, как и при вызове функции 
MPI_Gather
элементы из каждого 
процесса собираются в порядке их ранга, за исключением того, что элементы 
будут собраны во все процессы. Объявление функции 
MPI_Allgather
почти 
идентично 
MPI_Gather, 
разница лишь в отсутствии корневого процесса. 
MPI_Allgather( void* send_data, int send_count, MPI_Datatype 
send_datatype, void* recv_data, int recv_count, MPI_Datatype 
recv_datatype, MPI_Comm communicator) 
В качестве примера рассмотрим программу, которая вычисляет среднее 
значение массива. Хотя программа довольно проста, она демонстрирует, как 
можно использовать MPI для разделения работы между процессами, 
выполнения вычислений на подмножествах данных, а затем агрегировать 
меньшие фрагменты в окончательный ответ.
float *create_rand_nums(int num_elements) { 
 
float *rand_nums = (float *)malloc(sizeof(float) * num_elements); 
 
assert(rand_nums != NULL); 
 
int i; 
 
for (i = 0; i < num_elements; i++) { 
 
 
rand_nums[i] = (rand() / (float)RAND_MAX); 
 

 
return rand_nums; 



107 
float compute_avg(float *array, int num_elements) { 
 
float sum = 0.f; 
int i; 
 
for (i = 0; i < num_elements; i++) { 
 
 
sum += array[i]; 
 

 
return sum / num_elements; 

int main(int argc, char** argv) { 
 
int num_elements_per_proc = 10000000; 
 
srand(time(NULL)); 
 
MPI_Init(NULL, NULL); 
 
int world_rank; 
 
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
 
int world_size; 
 
MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
 
float *rand_nums = NULL; 
 
if (world_rank == 0) { 
 
 
rand_nums = create_rand_nums(num_elements_per_proc * 
world_size); 
 

 
float *sub_rand_nums = (float *)malloc(sizeof(float) * 
num_elements_per_proc); 
 
MPI_Scatter(rand_nums, num_elements_per_proc, MPI_FLOAT, 
sub_rand_nums, num_elements_per_proc, MPI_FLOAT, 0, 
MPI_COMM_WORLD); 


108 
 
float sub_avg = compute_avg(sub_rand_nums, 
num_elements_per_proc); 
 
float *sub_avgs = (float *)malloc(sizeof(float) * world_size); 
 
MPI_Allgather(&sub_avg, 1, MPI_FLOAT, sub_avgs, 1, MPI_FLOAT, 
MPI_COMM_WORLD); 
 
float avg = compute_avg(sub_avgs, world_size); 
 
printf("Avg of all elements from proc %d is %f\n", world_rank, avg); 
 
if (world_rank == 0) { 
 
 
free(rand_nums); 
 

 
free(sub_avgs); 
 
free(sub_rand_nums); 
 
MPI_Barrier(MPI_COMM_WORLD); 
 
MPI_Finalize(); 

Здесь функция 

Download 2,08 Mb.

Do'stlaringiz bilan baham:
1   ...   68   69   70   71   72   73   74   75   ...   98




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish