Коллоквиум сұрақтары жауаптары (2) (копия). Коллоквиум сратары
Скачать 2 Mb.
|
Возвращаемое значениеВозвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки. В Fortran возвращаемое значение сохраняется в параметре IERROR. Функция MPI_AlltoallСобирает данные и распределяет их между всеми членами группы. MPI_Alltoall является расширением функции MPI_Allgather. Каждый процесс отправляет отдельные данные каждому из получателей. j-й блок, отправленный из процесса i, принимается процессом j и помещается в i-й блок буфера приема. Синтаксисc++Копировать int MPIAPI MPI_Alltoall( _In_ void *sendbuf, int sendcount, MPI_Datatype sendtype, _Out_ void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm ); Параметрыsendbuf [в] Указатель на данные, которые должны быть отправлены всем процессам в группе. Количество и тип данных элементов в буфере указываются в параметрах sendcount и sendtype. If the comm parameter references an intracommunicator, you can specify an in-place option by specifying MPI_IN_PLACE in all processes. The sendcount and sendtype parameters are ignored. Each process enters data in the corresponding receive buffer element. The nth process sends data to the nth element of the receive buffer. sendcount The number of elements in the buffer that is specified in the sendbuf parameter. If sendcount is zero, the data part of the message is empty. sendtype The MPI data type of the elements in the send buffer. recvbuf [out] The pointer to a buffer that contains the data that is received from each process. The number and data type of the elements in the buffer are specified in the recvcount and recvtype parameters. пересчет Количество элементов в буфере приема. Если количество равно нулю, то часть данных в сообщении пуста. recvtype Тип данных MPI элементов в буфере приема. связь Дескриптор коммуникатора MPI_Comm. Возвращаемое значениеВозвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки. В Fortran возвращаемое значение сохраняется в параметре IERROR. 22 Таратылған деректер бойынша ауқымды есептеу операциялары. MPI_Reduce(), MPI_Allreduce(), MPI_Reduce_scatter() функциялары. Параллельді бағдарламалауда процессорлар арқылы таратылатын деректер блоктарындағы математикалық операциялар Ғаламдық қысқарту операциялары деп аталады. Жалпы жағдайда қысқарту операциясы-бұл Вектор, ал нәтижесі-вектордың барлық компоненттеріне белгілі бір математикалық операцияны қолдану арқылы алынған скалярлық шама. Атап айтқанда, егер вектордың компоненттері әртүрлі процессорларда орындалатын процестердің адрестік кеңістігінде орналасса, онда бұл жағдайда олар жаһандық (параллель) азайту туралы айтады. Мысалы, белгілі бір процестер тобының барлық процестерінің адрестік кеңістігінде var айнымалысының көшірмелері болсын (міндетті түрде бірдей мәнге ие емес), содан кейін оған Ғаламдық қосындыны есептеу операциясын қолдану немесе басқаша айтқанда, SUM азайту операциясы осы айнымалының барлық жергілікті мәндерінің қосындысын қамтитын бір мәнді қайтарады. Бұл операцияларды қолдану таратылған есептеулерді ұйымдастырудың негізгі құралдарының бірі болып табылады.В MPI глобальные операции редукции представлены в нескольких вариантах: бір процестің адрестік кеңістігінде нәтижені сақтай отырып (MPI_Reduce). барлық процестердің адрестік кеңістігінде нәтижені сақтай отырып (MPI_Allreduce). операция нәтижесі ретінде векторды қайтаратын префиксті азайту операциясы. бұл вектордың I-ші компоненті-таратылған вектордың алғашқы I компонентін (MPI_Scan) азайту нәтижесі. біріктірілген операция Reduce/Scatter (MPI_Reduce_scatter). Mpi_reduce функциясы келесідей орындалады. Op параметрімен көрсетілген жаһандық азайту операциясы кіріс буферінің бірінші элементтерінің үстінде орындалады және нәтиже түбірлік процестің қабылдау буферінің бірінші элементіне жіберіледі. Содан кейін буфердің екінші элементтері үшін де солай жасалады және т. б. С: int MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) FORTRAN: MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR
- Сур. 4.8 Reduce операциясының графикалық түсіндірмесі ұсынылған. Бұл схемада "+" операциясы кез-келген рұқсат етілген азайту операциясын білдіреді. Сур. 4.8. Reduce операциясын графикалық түсіндіру. Op операциясы ретінде сіз алдын-ала анықталған операциялардың біреуін немесе пайдаланушы жасаған операцияны пайдалана аласыз. Барлық алдын-ала анықталған операциялар ассоциативті және коммутативті болып табылады. Пайдаланушы жасаған операция, кем дегенде, ассоциативті болуы керек. Азайту тәртібі топтағы процестердің нөмірлерімен анықталады. Элементтердің datatype түрі op операциясымен үйлесімді болуы керек. 4.1-кестеде MPI азайту функцияларында қолдануға болатын алдын-ала анықталған операциялардың тізімі берілген.
Mpi_allreduce функциясы азайту нәтижесін барлық процестердің мекен-жай кеңістігінде сақтайды, сондықтан функция параметрлерінің тізімінде түбір процесінің идентификаторы жоқ. Әйтпесе, параметрлер жиынтығы алдыңғы функциямен бірдей. С: int MPI_Allreduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) FORTRAN: MPI_ALLREDUCE (SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR) INTEGER COUNT, DATATYPE, OP, COMM, IERROR
- Сур. 4.9 Allreduce операциясының графикалық түсіндірмесі ұсынылған. Сур. 4.9. Allreduce операциясын графикалық түсіндіру. Mpi_reduce_scatter функциясы нәтижені процестер бойынша азайту және бөлу операцияларын біріктіреді. С: MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int *recvcounts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) FORTRAN: MPI_REDUCE_SCATTER(SENDBUF,RECVBUF,RECVCOUNTS, DATATYPE, OP, COMM, IERROR) INTEGER RECVCOUNTS(*), DATATYPE, OP, COMM, IERROR
Mpi_reduce_scatter функциясы MPI_Allreduce-тен ерекшеленеді, өйткені жұмыс нәтижесі топтағы процестер санына сәйкес бөлінбейтін бөліктерге бөлінеді, i-ші бөлік I-ші процеске қабылдау буферіне жіберіледі. Бұл бөліктердің ұзындығы массив болып табылатын үшінші параметрді белгілейді. - Сур. 4.10 Reduce_scatter операциясының графикалық түсіндірмесі ұсынылған. Сур. 4.10. Reduce_scatter операциясының графикалық интерпретациясы. 23 топтармен және коммуникаторлармен жұмыс. Топтармен жұмыс істеу функциялары. Топтармен жұмыс істеу функциялары Mpi_group_size тобындағы процестер санын анықтау функциясы С: MPI_Group_size(MPI_Group group, int *size) FORTRAN: MPI_GROUP_SIZE(GROUP, SIZE, IERROR) INTEGER GROUP, SIZE, IERROR IN group-топ; Out size-топтағы процестер саны. Функция топтағы процестер санын қайтарады. Егер топ = MPI_GROUP_EMPTY болса, онда өлшем = 0. Mpi_group_rank тобындағы процесс нөмірін анықтау функциясы С: MPI_Group_rank(MPI_Group group, int *rank) FORTRAN: MPI_GROUP_RANK(GROUP, RANK, IERROR) INTEGER GROUP, RANK, IERROR , IN group-топ; Out rank-топтағы процесс нөмірі. Mpi_group_rank функциясы функцияны шақырған процесс тобындағы Нөмірді қайтарады. Егер процесс топтың мүшесі болмаса, онда mpi_undefined мәні қайтарылады. Mpi_group_translate_ranks екі топтағы процесс нөмірлері арасында сәйкестік орнату функциясы С: MPI_Group_translate_ranks (MPI_Group group1, int n, int *ranks1, MPI_Group group2, int *ranks2) Функция екі түрлі топтағы бірдей процестердің салыстырмалы нөмірлерін анықтайды. Егер екінші топтағы процесс болмаса, онда ол үшін mpi_undefined мәні орнатылады. MPI-де жаңа топтар құру үшін 8 функция бар. Тобы құрылуы мүмкін не арқылы коммуникатор, не арқылы жиындарға қолданылатын амалдар, олардың процестер, басқа топтар. Коммуникаторлармен жұмыс істеу функциялары Бұл бөлімде коммуникаторлармен жұмыс істеу функциялары қарастырылады. Олар коммуникаторларға қол жеткізу функциялары және коммуникаторларды құру функциялары болып бөлінеді. Қол жеткізу функциялары жергілікті және байланыс қажет емес, ұжымдық және процессораралық байланысты қажет етуі мүмкін құру функцияларынан айырмашылығы. Коммуникаторға қол жеткізудің екі негізгі функциясы-mpi_comm_size-байланыс саласындағы процестер санын сұрау және mpi_comm_rank-байланыс саласындағы процесс нөмірі идентификаторын сұрау MPI негізгі функциялары арасында ең басында қарастырылды. Олардан басқа, екі mpi_comm_compare коммуникаторларын салыстыру функциясы бар. С: MPI_Comm_compare(MPI_Comm comm1,MPI_Comm comm2, int *result) Салыстыру нәтижесінің мүмкін мәндері: Mpi_ident-коммуникаторлар бірдей, бір нысанды білдіреді; Mpi_congruent-коммуникаторлар сәйкес келеді, топтың бірдей атрибуттарымен байланыстың екі саласы; Mpi_similar-коммуникаторлар ұқсас, топтарда бірдей процестер бар, бірақ басқа тапсырыс; MPI_UNEQUAL-барлық басқа жағдайларда. Жаңа коммуникаторды үш функцияның бірімен жасауға болады: MPI_Comm_dup, MPI_Comm_create, MPI_Comm_split. Mpi_comm_dup коммуникаторын қайталау функциясы С: MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm) Функция жаңа атрибуттары бар коммуникаторларды құру үшін пайдалы. Mpi_comm_create коммуникаторын құру функциясы С: MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) Бұл функция топ тобы үшін коммуникатор жасайды. Топ мүшелері болып табылмайтын процестер үшін mpi_comm_null мәні қайтарылады. Егер топ тобы ата-аналық коммуникатордың кіші тобы болмаса, Функция қате кодын қайтарады. Mpi_comm_split коммуникаторын бөлу функциясы С: MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) Функция ата-аналық коммуникатормен байланысты топты color кіші тобы белгісінің әр мәні үшін бір-бірден бөлінбейтін кіші топтарға бөледі. Мәні color тиіс неотрицательным. Әр кіші топта бірдей түс мәні бар процестер болады. Key параметрі жаңа топтар ішіндегі тәртіпті басқарады: кіші key мәні процесс идентификаторының кіші мәніне сәйкес келеді. Бірнеше процестер үшін key параметрі тең болған жағдайда, Тапсырыс ата-аналар тобындағы тәртіпке сәйкес орындалады. 24 топтармен және коммуникаторлармен жұмыс. Коммуникаторлармен жұмыс істеу функциялары. топ процестердің реттелген жиынтығы деп аталады. * Топтағы әрбір процестің өз дәрежесі бар. Топтармен жасалатын операцияларды коммуникаторлармен жасалатын операциялардан бөлек орындауға болады, бірақ алмасу операцияларында тек коммуникаторлар ғана пайдаланылады. * MPI-де арнайы алдын-ала анықталған бос mpi_group_empty тобы бар. Коммуникаторлар екі түрлі болады: 1. интракоммуникаторлар-процестердің бір тобындағы операциялар үшін; 2. интеркоммуникаторлар-процестердің екі тобы арасындағы екі нүктелі алмасу үшін. Интракоммуникатор-MPI_COMM_WORLD. MPI бағдарламаларында интракоммуникаторлар жиі қолданылады. Топ құру функцияларында, әдетте, бос mpi_comm_null коммуникаторын пайдалану мүмкін емес. Comm коммуникаторымен байланысты топ тобына MPI_Comm_group: Int MPI_Comm_group(mpi_comm comm, MPI_Group *group)функциясына жүгіну арқылы қол жеткізуге болады. MPI_Comm_create функциясы басқа коммуникатордың (oldcomm) процестер жиынтығынан (group) жаңа коммуникаторды (newcomm) жасайды: int Mpi_comm oldcomm, MPI_Group group, mpi_comm *newcomm) Mpi_comm_free функциясы жою үшін comm коммуникаторын белгілейді: int MPI_Comm_free (MPI_Comm * comm ) Коммуникаторларды басқару операцияларының қатарына MPI_Comm_size және MPI_Comm_rank операцияларын жатқызуға болады. Олар, атап айтқанда, masterslave моделіндегі процестер арасында рөлдерді бөлуге мүмкіндік береді. 25 деректердің туынды түрлері және буып-түйілген деректер MPI туынды түрлері бағдарламалау тілдерінде түсінілгендей, толық мағынада мәліметтер типтері емес. Оларды коммуникациядан басқа кез-келген басқа операцияларда қолдануға болмайды. MPI туынды түрлерін негізгі типтегі элементтердің жадындағы орналасуды сипаттаушылар ретінде түсіну керек. MPI туынды түрі-жасырын (opaque) объект, ол екі нәрсені анықтайды: негізгі типтердің реттілігі және орын ауыстыру реттілігі. * Туынды тип mpi_type_contiguous, mpi_type_vector, mpi_type_hvector, Mpi_type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct арнайы құрылымдық функцияларын қолдана отырып, алдын ала анықталған MPI түрлерінен және бұрын анықталған туынды түрлерден құрылады. * Жаңа туынды түрі mpi_type_commit функциясын шақыру арқылы тіркеледі. Тіркелгеннен кейін ғана жаңа туынды түрді коммуникациялық кіші бағдарламаларда және басқа түрлерін жобалау кезінде қолдануға болады. Алдын ала анықталған MPI түрлері тіркелген деп саналады. * Туынды тип қажет болмаған кезде, ол mpi_type_free функциясымен жойылады. Mpi_pack функциясы бастапқы inbuf мекен-жайы бар жад аймағынан datatype типті элементтерді қосады. Қаптаманың нәтижесі Шығыс буферіне бастапқы outbuf мекен-жайы және outsize байтының өлшемі орналастырылады. Position параметрі бумаланған деректер орналастырылатын байттағы ағымдағы позицияны көрсетеді. Кіші бағдарламадан шыққан кезде позиция мәні бірінші бос байтты көрсете отырып, оралған байттар санына артады. Бумаланған хабарламаны кейінгі жіберу кезінде COMM параметрі коммуникатор ретінде пайдаланылады. Жадтың бірнеше аймағынан әртүрлі типтегі элементтерді жіберу үшін оларды алдымен mpi_pack орау функциясына кезекпен бір массивке салу керек. Буып-түю функциясын бірінші рет шақырған кезде, position параметрі әдетте буфердің басынан бастап оралған көріністі орналастыру үшін 0-ге орнатылады. Буферді үздіксіз толтыру үшін әр келесі қоңырауда алдыңғы қоңыраудан алынған позиция параметрінің мәнін пайдалану керек. Қапталған буфер Mpi_packed түрін және mpi_pack функциясына жүгінген кезде пайдаланылған comm коммуникаторын көрсете отырып, кез келген коммуникациялық операциялармен жіберіледі. |