Контрольная работа: Паралельні обчислення з використанням MPI
Аргументом операції приведення є масив даних — по одному елементі від кожного процесу. Результат такої операції — єдине значення (тому вона і називається операцією приведення).
У підпрограмах глобальних обчислень функція, передана в підпрограму, може бути: визначеною функцією MPI, наприклад MPI_SUM, користувальницькою функцією, а також оброблювачем для користувальницької функції, що створюється підпрограмою MPI_Op_create.
Три версії операції приведення повертають результат:
одному процесу;
усім процесам;
розподіляють вектор результатів між усіма процесами.
Операція приведення, результат якої передається одному процесу, виконується при виклику підпрограми MPI_Reduce:
int MPI_Reduce(void *buf, void *result, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
Вхідні параметри підпрограми MPI_Reduce:
buf — адреса буфера передачі;
count — кількість елементів у буфері передачі;
datatype — тип даних у буфері передачі;
ор — операція приведення;
root — ранг головного процесу;
comm — комунікатор.
Підпрограма MPI_Reduce застосовує операцію приведення до операндам з buf, а результат кожної операції міститься в буфер результату result. MPI_Reduce повинна викликатися всіма процесами в комунікаторі comm, a аргументи count, datatype і op у цих викликах повинні збігатися. Функція приведення (ор) не повертає код помилки, тому при виникненні аварійної ситуації або завершується робота всієї програми, або помилка мовчазно ігнорується. І те й інше в однаковій мірі небажано.
У MPI мається 12 визначених операцій приведення (див. табл.).
Операція | Опис |
MPI_MAX | Визначення максимальних значень елементів одномірних масивів цілого чи речовинного типу |
MPI_MIN | Визначення мінімальних значень елементів одномірних масивів цілого чи речовинного типу |
MPI_SUM | Обчислення суми елементів одномірних масивів цілого, речовинного чи комплексного типу |
MPI_PROD | Обчислення заелементного добутку одномірних масивів цілого, речовинного чи комплексного типу |
MPI_LAND | Логічне "И" |
MPI_BAND | Бітове "И" |
MPI_LOR | Логічне "ЧИ" |
MPI_BOR | Бітове "ЧИ" |
MPI_LXOR | Логічне "ЧИ", що виключає |
MPI_BXOR | Бітове "ЧИ", що виключає |
MPI_MAXLOC | Максимальні значення елементів одномірних масивів і їхні індекси |
MPI_MINLOC | Мінімальні значення елементів одномірних масивів і їхні індекси |
Розглянемо приклад 3:
===== Example2.cpp =====
#include <mpi.h>
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
int n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
MPI_Init(&argc,&argv);