Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Техехин - Системное программное обеспечение - взаимодействие процессов (1114927), страница 29
Текст из файла (страница 29)
Элементы массива recvcounts задают количествоэлементов, которое должно быть отправлено каждой ветви, чтопозволяет каждой ветви получать порции данных разной длины.Наконец, функция MPI_scan() представляет собой некотороесужение функции MPI_AllReduce():#include <mpi.h>int MPI_Scan(void*count, MPI_Datatypecomm);sendbuf, void* recvbuf, intdatatype, MPI_Op op, MPI_CommВ буфере recvbuf ветви с номером i после возврата из этойфункции будет находиться результат поэлементного примененияоперации op к буферам sendbuf ветвей с номерами от 0 до iвключительно. Очевидно, что в буфере recvbuf ветви с номером N1 будет получен тот же результат, что и для аналогичного вызоваMPI_Allreduce().Пример 33.
MPI:коммуникаций.применениеколлективныхВ данном примере производится приближенное вычислениечисла π путем численного интегрирования на отрезке методомпрямоугольников. Количество точек в разбиении определяетпользователь. Ветвь с номером 0 осуществляет ввод данных отпользователя, а затем, по окончании вычислений, - сбор данных отвсех ветвей и вывод результата.178#include <mpi.h>#include <stdio.h>int main(int argc, char **argv){int size, rank, N, i;double h, sum, x, global_pi;MPI_Init(&argc,библиотеку */&argv);/*ИнициализируемMPI_Comm_size(MPI_COMM_WORLD, &size);/*Узнаемколичествоприложении... */задачвзапущенномMPI_Comm_rank (MPI_COMM_WORLD, &rank);/* ...и свой собственный номер: от 0 до (size1) */if (rank == 0) {/* ветвь с номером 0 определяет количествоитераций...
*/printf("Please, enter the total iterationcount:\n");scanf("%d", &N);}/*... и рассылает это число всем ветвям */MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);h = 1.0 / N;sum = 0.0;/* вычисление частичной суммы */for (i = rank + 1; i <= N; i += size) {x = h * (i - 0.5);sum += f(x);}sum = h * sum;179/* суммирование результата на ветви с номером 0*/MPI_Reduce(&sum,&global_pi,MPI_SUM, 0, MPI_COMM_WORLD);1,MPI_DOUBLE,is%.10f\n",if (rank == 0) {printf("Theglobal_pi);result}MPI_Finalize();return 0;}1808 Алфавитныйуказательупоминаемыхбиблиотечных функций и системных вызовов._exit() .......................................51MPI_Gather() .........................175accept()...................................133MPI_Get_count() ...................163alarm()......................................43MPI_Ibsend() .........................167bind()......................................131MPI_Init() ..............................154connect() ................................132MPI_Irecv()............................166creat() .......................................70MPI_Irsend()..........................167exec(), семейство ....................47MPI_Isend() ...........................166exit(), функция ........................52MPI_Issend()..........................167fcntl()..................................47, 81MPI_Probe()...........................164fork() ........................................42MPI_Recv()............................162ftok(), функция......................101MPI_Reduce() ........................178getpid() .....................................45MPI_Reduce_scatter() ...........179getppid() ...................................45MPI_Rsend()..........................161kill()..........................................67MPI_Scan() ............................179listen() ....................................133MPI_Scatter().........................174longjmp()..................................92MPI_Send() ............................160mkfifo() ....................................89MPI_Ssend() ..........................161mknod()....................................89MPI_Test() .............................168MPI_Abort() ..........................155MPI_Testall() .........................169MPI_Allgather().....................176MPI_Testany() .......................168MPI_Allreduce() ....................179MPI_Testsome().....................169MPI_Alltoall()........................177MPI_Wait() ............................168MPI_Barrier() ........................155MPI_Waitall() ........................169MPI_Bcast()...........................174MPI_Waitany() ......................168MPI_Bsend()..........................161MPI_Waitsome()....................168MPI_Comm_rank()................154msgctl() ..................................107MPI_Comm_size().................154msgget()..................................105MPI_Finalise() .......................155msgrcv() .................................106181msgsnd().................................105shmget()..................................114nice() ........................................60shutdown() .............................136pipe() ........................................80sigaction().................................78ptrace() .....................................94sigaddset() ................................76recv() ......................................135sigdelset() .................................76recvfrom() ..............................136sigemptyset() ............................76semctl()...................................121sigfillset() .................................76semget()..................................118sigismember()...........................76semop() ..................................119signal()......................................68send()......................................134sigpending() .............................76sendto() ..................................136sigprocmask()...........................75setjmp() ....................................92socket()...................................129shmat() ...................................115unlink().....................................71shmctl() ..................................116wait() ........................................52shmdt() ...................................1151829 Список литературы1.
Д.Цикритзис, Ф.Бернстайн. Операционные системы. Москва,Мир, 1977.2. Э.С.Таненбаум. Современные операционные системы,издание. Санкт-Петербург, Издательский дом Питер, 2002.2-е3. П.Кейлингер. Элементы операционных систем. Москва, Мир,1985.4. Ч.Хоар. ВзаимодействующиеМосква , Мир, 1989.последовательныепроцессы.5. Pate S.D. UNIX Internals.
A Practical Approach. Addison-WesleyLongman, 1997.6. К.Кристиан. Введение в операционную систему UNIX. Москва,Финансы и статистика. 1985.7. Б.К.Керниган, Р.Пайк.UNIX– универсальнаяпрограммирования. Москва, Финансы и статистика, 1992.среда8. М.Дансмур, Г.Дейвис. Операционная система UNIXпрограммирование на языке Си. Москва, Радио и связь, 1989.и9. Т.Чан.
Системное программирование на С++ для UNIX. Киев,Издательская группа BHV, 1997.10. М.Устюгов. Введение в TCP/IP. Москва, .МГУ, 1997.11. Б.Керниган, Д.Ритчи. Язык программирования Си. Издание 3-е,исправленное. Санкт-Петербург, Невский Диалект, 2001.12. И.В.Машечкин, М.И.Петровский, П.Д.Скулачев, А.Н.Терехин.Системное Программное Обеспечение: файловые системы ОСUnix и Windows NT. Москва, Диалог-МГУ,1997.13. А.Робачевский Операционная система UNIX. Санкт-Петербург,BHV-Санкт-Петербург, 199814. К.Хэвиленд, Д.Грей, Б.Салама.
Системное программирование вUNIX. Москва, ДМК, 2000.15. Н.Д.Васюкова, И.В.Машечкин, В.В.Тюляева, Е.М.Шляховая.Краткий конспект семинарских занятий по языку Си. Москва,МГУ, 1999.16. В.Столлингс. Операционные системы. 4-ое издание. Москва,Издательский дом Вильямс, 2002.183.