Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Duisembiev-Parallel-esep.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.86 Mб
Скачать

§2.2.3 Хабарлама жіберу негізіндегі бағдарламалау жүйелері. Mpi бағдарламалау жүйесі

Таратылған жадылы компьютерлердің кең таралуы оларға сәйкес бағдарламалау жүйелерінің де пайда болуын анықтады. Негізінде бұндай жүйелерде ортақ адрестік кеңістік болмайды, және параллель процестер арасында деректер алмасу үшін коммуникациялық орта арқылы хабарламаны айқын жіберу пайдаланылады. Жекелеген процестер дәстүрлі бағдарламалау тілдерінің көмегімен бейнеленеді, ал олардың арақатынасын ұйымдастыру үшін қосымша функциялар енгізіледі. Сол себепті хабарламаны айқын түрде жіберуге негізделген барлық дерлік бағдарламалау жүйелері, жаңа тілдер түрінде емес, ал интерфейстер және кітапханалар түрінде беріледі.

Қазіргі уақытта хабарламаны айқын түрде жіберуге негізделген танымал бағдарламалау жүйелерінің мысалдары жеткілікті: Shmem, Linda, PVM, MPI және т.б. Бұл параграфта біз бүгінгі күні ең көп қолданыста жүрген MPI жүйесіне тоқталатын боламыз.

MPI бағдарламалау жүйесі

Соңғы жылдары таратылған жадылы параллель компьютерлерде ең танымал MPI (Message Passing Interface) бағдарламалау технологиясы кеңінен қолданыс табуда. Бұндай жүйелерде параллель процестер ара-қатынасын ұйымдастырудың негізгі тәсілі бір-біріне хабарлама жіберу. МРI cтандартының бекітілген интерфейстерін әрбір есептеу платформасындағы бағдарламалау жүйесі (МРI бағдарламалау жүйесі) де және өз бағдарламаларын құру кезінде пайдаланушы да қатаң сақтау керек. Қазіргі кездегі іске асырулар көбіне МРI стандартының 1.1 версиясына сәйкес келеді. 1997-1998 жылдары алдыңғы версияларының функционалдығын айтарлықтай кеңіткен МРI-2.0 стандарты пайда болды. Алайда бұл нұсқа бүгінгі күнге әлі кең тарала қоймады, және толық көлемде ешқандай есептеу жүйесінде енгізілмеген. Енді бұдан ары егер арнайы айтылмаса барлық жерде 1.1 стандарты пайдаланылуда деп түсіну керек. МРI технологиясы С и Fortran тілдерімен жұмыс істей алады. Бұл бөлімде барлық мысалдар мен функциялардың мазмұндалуы (егер арнайы айтылмаса) Си бағдарламалау тілін пайдалана отырып беріледі. Айта кету керек, МРI технологиясының негізгі идеялары және Си және Fortran тілдер үшін жекелеген конструкцияларын дайындау ережелері көп жағынан ұқсас.

МРI интерфейсінің толық версиясы 120–дан астам функциялар сипаттамасын құрайды. Егер оның толық мазмұнын беретін болса оған бөлек кітап арнауға да болар еді. Бұл бөлімнің мақсаты - технология идеясын түсіндіру және тәжірибе жүзінде қажет болатын компоненттерді игеруге көмектесу. Жалпы, егер оқырмандарда стандарт туралы қандай да бір сұрақтар пайда болса немесе оларды МРI технологиясы дамуының соңғы жаңалықтары қызықтыратын болса, онда http://www.mpiforum.org және http://parallel.ru/tech/tech_dev/mpi.html сайттарынан керекті ақпараттарды алуға болады.

МРI интерфейсі параллель бағдарламаларды M1MD (Multiple Instruction Multiple Data) стилінде құруға мүмкіндік береді, ол әртүрлі бастапқы текстермен процестерді біріктіру дегенді бідіреді. Алайда бұндай бағдарламаларды жазу және жөндеу өте күрделі, сондықтан тәжірибе жүзінде бағдарламашылар көбіне параллель бағдарламалаудың SPMD-моделін (Single Program Multiple Data) жиі пайдаланады, ал онда барлық параллель процестер үшін бір ғана код пайдаланылады. Қазіргі уақытта МРI көптеген іске асырулары жіптермен жұмысты қолдайды.

Жалпы МРI кітапхана болғандықтан, бағдарламаны компиляция жасау кезінде оған сәйкес кітапханалық модульдер пайдаланылады. Мұны командалық жолда орындауға болмаса басым көпшілік жүйелерде қарастырылған командаларды немесе скриптарды: mpicc (Си тіліндегі бағдарламалар үшін), mpiCC (Си++ тіліндегі бағдарламалар үшін) және mpif77/mpif90 (Фортран 77/90 тілдеріндегі бағдарламалар үшін ) пайдалануға болады. Компилятордың "-о name" опциясы алынатын орындалатын файлға ат беруге мүмкіндік береді, арнайы айтылмаса орындалатын файл аты a.out, мысалы, Фортран тілінде:

mpif77 -о program program.f

Орындалатын файлды қабылдағаннан кейін оны процессорлардың қажетті санында жіберу керек. Ол үшін МРI-қосымшаларды жіберу (жүктеу) командасы mpirun ұсынылады, мысалы:

mpirun -np N <аргументтерімен бағдарлама>,

Мұндағы N – бір есеп үшін процестер саны. Жүктелгеннен кейін барлық жіберілген процестер бір ғана бағдарламаны орындайды, және орындалу нәтижесі жүйеге байланысты терминалға беріледі немесе анықталған атпен файлға жазылады.

Барлық қосымша обьектілер: МРI пайдаланылатын функция аттары, процедуралар аттары, тұрақтылар, деректердің анықталған типтері және т.с.с., mpi_ префиксімен беріледі. Мысалы, бір процестен екіншісіне хабарлама жіберетін функцияның аты MPI_Send. Егер пайдаланушы бағдарламада осындай префикспен аттарды пайдаланбаса, онда МРI объектілерімен біле тұра келіспеушіліктер болмайды. МРI интерфейсінің барлық сипаттаулары mpif.h (mpi.h) файлында жинақталған, сондықтан МРI-бағдарламасының басында include ‘mpif.h’ (Фортран тіліндегі бағдарламалар үшін) (#include “mpi.h” Си тіліндегі бағдарламалар үшін) директивасы тұруы керек.

MPI-бағдарлама - бұл параллель ара-қатынас жасайтын процестер жиынтығы. Бағдарламаның параллель бөлігін құра отырып, барлық процестер бір рет қана туындайды. MPI-бағдарламаның орындалуы барысында қосымша процестердің туындауына немесе бар процестердің жойылуына жол берілмейді (MPI-2.0-де мұндай мүмкіндік бар). MPI-да ешқандай жалпы айнымалылар болмаса деректер жоқ, әрбір процесс өзінің адрестік кеңістігінде жұмыс істейді. Процестер арасындағы ара-қатынастың негізгі тәсілі хабарламаны айқын жіберу болып табылады.

Бағдарлама параллель процестерінің ара-қатынасын таратпау (локализация) үшін процестер топтарын құруға болады. Бұл жағдайда олардың қатынас жасауы үшін жеке ортасы— коммуникатор ұсынылады. Құрылатын топтар құрамы еркін түрде алынады. Топтар бірдей болуы, қиылысуы да қиылыспауы да және бірі бірінің ішіне толық кіруі де мүмкін. Процестер ара-қатынасы тек қандай да бір коммуникатордың ішінде ғана орын алады, әртүрлі коммуникаторлармен жіберілген хабарламалар қиылыспайды және бір-біріне кедергі келтірмейді. Фортран тілінде коммуникаторлар типі integer, ал Си тілінде - MPI_Comm. Бағдарламаның жүктелген мезетінде барлық туындаған процестер mpi_comm_world коммуникаторы шеңберінде жұмыс істейді деп есептеледі. Бұл коммуникатор әрқашан болады және ол MPI-бағдарламасының барлық жүктелген процестерінің ара-қатынасы үшін қызмет атқарады. Сонымен қатар, бағдарламаның бастапқы жүктелуі кезінде бір ғана ағымды процестен тұратын mpi_comm_self коммуникаторы және бірде-бір процесс кірмейтін mpi_comm_null коммуникаторы болады.

MPI-бағдарламасының әрбір процесіне бүтін теріс емес сан болатын бірегей атрибут процесс нөмірі беріледі. Осы атрибуттың көмегімен процестер арасындағы өзара қатынастың айтарлықтай бөлігі жүргізіледі. Бір коммуникатордағы әрбір процестің жеке нөмірлері болатыны түсінікті. Бірақ процесс бір мезгілде әртүрлі коммуникаторларға кіре алатыны себепті, оның бір коммуникатордағы нөмірі басқа коммуникатордағы нөмірінен өзгеше болуы мүмкін. Бұдан келіп процестің негізгі екі атрибуты шығады: коммуникатор және коммуникатордағы нөмірі.

Егер топта п процесс болса, онда кезкелген процестің осы топтағы нөмірі 0-ден п-1-ге дейінгі аралықта жатады. Осы сияқты сызықты нөмірлеу, бағдарлама процестерінің логикалық ара-қатынасын әрқашан бірдей көрсете бермейді. Мысалы, процестер берілген есептің мағынасына байланысты тікбұрышты тордың тораптарында орналасуы және олар өздерінің тікелей көршілерімен ғана ара-қатынас жасауы мүмкін. Мұндай жағдайды, сәйкес процестердің виртуалды топологиясын суреттей отырып пайдаланушы өзінің бағдарламасында жеңіл көрсете алады.

Бағдарлама процестерін есептеу жүйесінің физикалық процессорларына көшіргенде бұл ақпараттың пайдасы болуы мүмкін.

Процестер өзара қатынасының негізгі әдісі хабарламаны жіберу болып табылады. Хабарламабұл қандай да бір типтегі деректер жиыны. Әрбір хабарламаның бірнеше атрибуттары болады, мысалы, жіберген-процесс нөмірі, қабылдаған-процесс нөмірі, хабарлама идентификаторы және т.б. Хабарламаның маңызды атрибуттарының бірі болып оның идентификаторы немесе тэг есептеледі. Мысалы, идентификатор бойынша хабарламаны қабылдаған процесс, оған тек бір процестен ғана келіп түскен екі хабарламаны ажырата алады. Хабарлама идентификаторы 0-ден 32767-ге дейінгі аралықта жататын бүтін теріс емес сан.

Хабарлама атрибуттарымен жұмыс істеу үшін, өрістері атрибуттар мәндеріне қатынасты қамтамасыз ететін MPI_Status структураcы енгізілген.

Тәжірибе жүзінде хабарлама көбіне қандай да бір буферде бірінен кейін бір қатар орналасқан бір типті деректер жиыны түрінде болады. Мұндай хабарлама мысалы, пайдаланушы сәйкес бүтін санды векторда орналастырған бірнеше жүздеген бүтін саннан тұруы мүмкін. Алайда, бұндай ситуацияның кемінде екі шектеуі болуы мүмкін. Біріншіден, кейбір кездерде түрлі типті деректерден тұратын хабарлама құру қажет болады. Екіншіден, жіберілетін деректер жадыдан әрқашан үздіксіз облыс ала бермейді. Мысалы, егер Fortran бағдарламалау тілінде матрица бағандарының элементтері жадыда бірінен кейін бірі орналасса, онда жолдар элементтері қандай да бір қадаммен орналасады. Жол элементтерін жіберу үшін, біріншіден оларды жинақтап алу керек, одан кейін жіберу, одан қайта ашу керек болады.

MPI жалпы функциялары

Нақты функцияларды сипаттауға көшпес бұрын, бірнеше жалпы ескертулерге тоқталайық. Функцияларды сипаттау кезінде шығыс параметрлерін белгілеу үшін OUT сөзі пайдаланылатын болады. Олар арқылы функция нәтижелерді қайтарады. Функция жұмысының нәтижесі бір ғана сан болғанның өзінде, ол параметрлердің біреуі арқылы қайтарылатын болады. Бұл MPI функцияларының барлығы дерлік өздерінің мәндері ретінде табысты аяқталу туралы ақпаратты қайтаруына байланысты. Табысты орындалған жағдайда функция mpi_success мәнін қайтарады, кері жағдайда – қателік коды қайтарылады. Функцияның орындалуы кезінде орын алған қателік түрін, әрбір функцияның сипатамасын қарап түсінуге болады. Әртүрлі қате ситуацияларға сәйкес келетін алдын ала анықталған қайтарылатын мәндер mpi.h файлында көрсетіледі.

Бұдан ары әрбір бағдарламаны құруға қажетті MPI жалпы функцияларын қарастырамыз [2].

int MPI_Init(int *argc, char ***argv)

Бағдарламаның параллель бөлігін инициалдау. Барлық басқа MPI функцияларын MPI_Init шақырылғаннан кейін ғана шақыру мүмкін болады. MPI_Init аргументтерінің әдеттен тыс өзгеше типі main функциясының аргументтерін барлық процестерге беру мүмкіндігі болу үшін қарастырылған.

Әрбір қосымша үшін параллель бөлікті инициализациялау тек бір рет қана орындалу керек. Көптеген модулдерден тұратын және әртүрлі авторлармен жазылған күрделі қосымшалар үшін бұны тексеріп отыру қиынға соғатындықтан, қосымша MPI_initialized функциясы енгізілген:

MPI_Initialized (int *flag)

Мұндағы out *flag – бағдарламаның параллель бөлігін инициалдау белгісі.

Егер MPI_Init функциясы шақырылып қойылса, онда flag параметрі арқылы 1 мәні, кері жағдайда 0 қайтарылады.

int MPI_Finalize(void)

Қосымшаның параллель бөлігінің аяқталуы. Барлық келесі қатынастар, кез-келген MPI-функциялары үшін және MPI_Init функциясы үшін де тыйым салынған. MPI_Finalize шақырылғанға дейін оның хабарламалар алмасуға араласуы талап етілетін барлық іс-әрекеттер аяқталуы тиіс.

MPI-бағдарламасының жалпы схемасы:

main(int argc, char **argv)

{

...

MPI_Init(&argc, &argv);

...

MPI_Finalize();

...

}

int MPI_Comm_size(MPI_Comm comm, int *size)

  • comm —коммуникатор идентификаторы;

  • out size - comm коммуникаторындағы процестер саны.

comm коммуникаторындағы параллель процестердің жалпы санын анықтау. Нәтиже size параметрі арқылы қайтарылады. Коммуникатор күрделі құрылым болуы себепті, оның алдында алдын ала анықталған MPI_Comm типті ат (имя) тұр және ол mpi.h файлында анықталған.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]