Ëàáîðàòîðíûé ïðàêòèêóì íà ïàðàëëåëüíîì êëàñòåðå Ââåäåíèå Äàííîå ââåäåíèå ïîñâÿùåíî ïîäãîòîâêå ê ðàáîòå ñ ïàðàëëåëüíûìè ïðîãðàììàìè, èñïîëüçóþùèìè ðåàëèçàöèþ MPICH ñòàíäàðòà MPI, íà êîìïüþòåðàõ êëàñòåðà â àóäèòîðèè 2444 ìàòåìàòèêîìåõàíè÷åñêîãî ôàêóëüòåòà ÑÏáÃÓ, à òàêæå ìîìåíòàì, îáùèì äëÿ âñåõ ëàáîðàòîðíûõ ðàáîò äàííîãî ïðàêòèêóìà. Ïîëüçîâàòåëÿì êëàñòåðà äîñòóïíû 9 êîìïüþòåðîâ; èõ èìåíà m01, m03, . . ., m10 íàïèñàíû íà èõ êîðïóñàõ. Êîìïüþòåð m02 íå ñóùåñòâóåò; ïîïûòêè åãî èñïîëüçîâàíèÿ ïðèâîäÿò ê ñîîáùåíèÿì îá îøèáêàõ. Îáû÷íî, íà ýòèõ êîìïüþòåðàõ ðàáîòàåò îïåðàöèîííàÿ ñèñòåìà Windows Server 2003. Äëÿ ðàáîòû ñ MPICH êîìïüþòåðû äîëæíû áûòü ïåðåçàãðóæåíû â Linux. Ýòî äåëàåòñÿ â äâà ýòàïà: ÷òîáû íà÷àòü ïðîöåññ ïåðåçàãðóçêè, íóæíî íàæàòü ìûøüþ êíîïêó ¾Shut down ...¿ â îêíå, ïðèãëàøàþùåì ê âõîäó â Windows, è â ïðåäëàãàåìîì äèàëîãå âûáðàòü Restart (îáû÷íî ýòîò âàðèàíò óæå âûáðàí), è íàæàòü ¾Ok¿. Ïîñëå òîãî, êàê Windows çàâåðøèò ñâîþ ðàáîòó è íà÷íåòñÿ ïîâòîðíàÿ çàãðóçêà, ïîëüçîâàòåëþ áóäåò ïðåäëîæåíî ìåíþ ñ âûáîðîì èç òðåõ ïóíêòîâ: Windows è 2 âàðèàíòà SUSE Linux: console (ðåæèì êîìàíäíîé ñòðîêè) è îáû÷íûé îêîííûé âàðèàíò. Äàííîå ìåíþ ïîçâîëÿåò âûáðàòü æåëàåìûé âàðèàíò â òå÷åíèå íåñêîëüêèõ ñåêóíä, è åñëè ïîëüçîâàòåëü çà ýòî âðåìÿ íå âûáðàë Linux, àâòîìàòè÷åñêè ñíîâà çàãðóæàåòñÿ Windows. Äëÿ ðàáîòû ñ MPI âïîëíå äîñòàòî÷íî êîìàíäíîé ñòðîêè, îäíàêî îí ðàáîòàåò è â îêîííîì âàðèàíòå çàãðóçêè. Åñëè áûë âûáðàí îêîííûé âàðèàíò, òî äëÿ ââîäà óêàçàííûõ äàëåå êîìàíä íóæíî ñíà÷àëà çàïóñòèòü ýìóëÿòîð òåðìèíàëà. Ýòî äåëàåòñÿ ùåë÷êîì ëåâîé êíîïêîé ìûøè ïî ñîîòâåòñòâóþùåìó çíà÷êó â íèæíåé ÷àñòè ýêðàíà. Ïîñëå ðàáîòû æåëàòåëüíî îïÿòü ïåðåçàãðóçèòü êîìïüþòåð â Windows, äëÿ ÷åãî â êîíñîëüíîì ðåæèìå äîñòàòî÷íî íàæàòü Ctrl-Alt-Del, à â îêîííîì ùåëêíóòü ëåâîé êíîïêîé ïî çåëåíîìó êðóãëîìó çíà÷êó â ëåâîì íèæíåì óãëó ýêðàíà, â ïîÿâèâøåìñÿ ìåíþ âûáðàòü ïóíêò ¾çàâåðøèòü ñåàíñ¿ è â ïîÿâèâøåìñÿ äèàëîãå âûáðàòü ïóíêò ¾ïåðåçàãðóçèòü¿. Âî âðåìÿ ðàáîòû MPICH ïðè èñïîëüçîâàíèè êîìïüþòåðîâ, îòëè÷íûõ îò òîãî, íà êîòîðîì çàðåãèñòðèðîâàëñÿ ïîëüçîâàòåëü, MPICH âûíóæäåí âûïîëíÿòü îïðåäåëåííûå êîìàíäû íà ýòèõ êîìïüþòåðàõ îò èìåíè ïîëüçîâàòåëÿ. Äëÿ ýòîãî èñïîëüçóåòñÿ ñðåäñòâî ssh (øèôðóþùèé àíàëîã rsh). Ïîýòîìó äëÿ ïðàâèëüíîé ðàáîòû MPICH ssh äîëæåí áûòü íàñòðîåí òàê, ÷òîáû ïðè åãî èñïîëüçîâàíèè â ïðåäåëàõ êëàñòåðà ïîëüçîâàòåëü ìîã âõîäèòü íà äðóãèå êîìïüþòåðû áåç ââîäà ïàðîëÿ. Äëÿ ýòîãî ïîëüçîâàòåëü, çàðåãèñòðèðîâàâøèñü íà îäíîì èç êîìïüþòåðîâ êëàñòåðà, äîëæåí ñäåëàòü ñëåäóþùåå: à) Ñîçäàòü ïðè ïîìîùè óòèëèòû ssh-keygen ïàðó èç ñåêðåòíîãî è îòêðûòîãî êëþ÷åé. Äëÿ ýòîãî íóæíî äàòü êîìàíäó 1. Èìåíà êîìïüþòåðîâ, ïåðåçàãðóçêà â Linux è âõîä. 2. Ïîäãîòîâêà ssh. $ ssh-keygen -t rsa1 Çäåñü è äàëåå çíàê $ ÿâëÿåòñÿ ÷àñòüþ ïðèãëàøåíèÿ ê ââîäó êîìàíäû, è íàáèðàòü åãî íå íóæíî. Óòèëèòà ssh-keygen âî âðåìÿ ñâîåé ðàáîòû ïðåäëàãàåò ïîëüçîâàòåëþ ââåñòè ñåêðåòíóþ ôðàçó äëÿ çàùèòû êëþ÷à; ïîñêîëüêó â äàííîì ñëó÷àå òàêàÿ ôðàçà íå íóæíà, â îòâåò íà ýòîò âîïðîñ íóæíî ïðîñòî íàæàòü ¾ââîä¿. Ýòîò âîïðîñ ïîâòîðÿåòñÿ äâàæäû. Âûïîëíåíèå ýòîé êîìàíäû ïðèâåäåò ê ñîçäàíèþ â äîìàøíåì äèðåêòîðèè ïîääèðåêòîðèÿ .ssh, è â íåì ôàéëîâ identity (ñåêðåòíûé êëþ÷) è identity.pub (îòêðûòûé êëþ÷). á) Äàëåå, íåîáõîäèìî ïåðåéòè â äèðåêòîðèé .ssh (íàïðèìåð, êîìàíäîé cd .ssh) è ñîçäàòü â íåì ôàéë authorized_keys, ïîçâîëÿþùèé âõîäèòü íà äðóãèå êîìïüþòåðû êëàñòåðà áåç ïàðîëÿ. Ýòî äåëàåòñÿ â äâà ýòàïà. Âî-ïåðâûõ, íåîáõîäèìî ñîçäàòü ôàéë, â êîòîðîì 9 ðàç ïîâòîðÿåòñÿ ñòðîêà èç ôàéëà identity.pub (ïîñëåäíèé ôàéë ñîñòîèò èç îäíîé ñòðîêè). Ýòî ìîæíî ñäåëàòü, íàïðèìåð, òàêîé êîìàíäîé: $ for((I=0; I<9; I++)); do cat identity.pub >> authorized_keys; done Äàëåå, ïîëó÷åííûé ôàéë authorized_keys íåîáõîäèìî îòðåäàêòèðîâàòü â ëþáîì òåêñòîâîì ðåäàêòîðå, çàìåíèâ â êîíöå êàæäîé ñòðîêè â àäðåñå ëîãèí@èìÿêîìïüþòåðà èìÿ êîìïüþòåðà òàê, ÷òîáû âî âñåõ 9 ñòðîêàõ âñòðå÷àëèñü èìåíà âñåõ 9 êîìïüþòåðîâ (â îñòàëüíîì ñîäåðæèìîå ýòîãî ôàéëà äîëæíî îñòàòüñÿ áåç èçìåíåíèé). Äëÿ ýòîãî ñì. ðàçäåë 3 ðåäàêòèðîâàíèå ïðîãðàììû. â) Íàêîíåö, íóæíî ïðè ïîìîùè ssh (êîìàíäîé ssh èìÿêîìïüþòåðà) çàéòè íà êàæäûé èç êîìïüþòåðîâ êëàñòåðà (â òîì ÷èñëå è íà òîò, íà êîòîðîì èçíà÷àëüíî çàðåãèñòðèðîâàí ïîëüçîâàòåëü). Ýòî äåëàåòñÿ ïî äâóì ïðè÷èíàì: âî-ïåðâûõ, ïðè ïåðâîé òàêîé ðåãèñòðàöèè ssh ñïðàøèâàåò, âåðåí ëè îòêðûòûé êëþ÷ òîãî êîìïüþòåðà, íà êîòîðîì ìû ñîáèðàåìñÿ ðåãèñòðèðîâàòüñÿ. Íà ýòîò âîïðîñ íàäî îòâåòèòü yes, è ïðè ñëåäóþùèõ ïîïûòêàõ ðåãèñòðàöèè ýòîò âîïðîñ óæå íå çàäàåòñÿ. Âî-âòîðûõ, ýòî ïîçâîëÿåò ïðîâåðèòü ïðàâèëüíîñòü äåéñòâèé, âûïîëíåííûõ íà ïðåäûäóùèõ ýòàïàõ ssh íå äîëæåí ñïðàøèâàòü ïàðîëü ïðè òàêîé ðåãèñòðàöèè. Åñëè âñå áûëî ñäåëàíî ïðàâèëüíî, è çàðåãèñòðèðîâàííîìó íà îäíîì êîìïüþòåðå êëàñòåðà ïîëüçîâàòåëþ ssh ïîçâîëÿåò ðåãèñòðèðîâàòüñÿ íà ëþáîì êîìïüþòåðå êëàñòåðà áåç ïàðîëÿ, ìîæíî ïåðåõîäèòü ê ñëåäóþùåìó ïóíêòó.  Linux èìååòñÿ äîñòàòî÷íî ìíîãî òåêñòîâûõ ðåäàêòîðîâ, ïîçâîëÿþùèõ ââåñòè ïðîãðàììó è èñïðàâèòü èìåþùèåñÿ â íåé îøèáêè. Ìû ðàññìîòðèì îäèí èç ïðîñòåéøèõ âàðèàíòîâ, à èìåííî, âñòðîåííûé ðåäàêòîð îáîëî÷êè mc. Îáîëî÷êà mc î÷åíü ïîõîæà íà FAR èç Windows. Äëÿ åå çàïóñêà íóæíî äàòü êîìàíäó 3. Ðåäàêòèðîâàíèå ïðîãðàììû. $ mc Ïîñëå çàïóñêà ýêðàí äåëèòñÿ âåðòèêàëüíî íà äâå ïàíåëè, â îäíîé èç êîòîðûõ îòîáðàæàåòñÿ ñïèñîê ïîääèðåêòîðèåâ è ôàéëîâ òåêóùåãî äèðåêòîðèÿ. Äëÿ ðåäàêòèðîâàíèÿ óæå èìåþùåãîñÿ ôàéëà íóæíî ïîñòàâèòü íà íåãî âûäåëåííóþ ñòðî÷êó (êëàâèøàìè ââåðõ/âíèç) è íàæàòü F4. Äëÿ ñîçäàíèÿ íîâîãî (ïóñòîãî) ôàéëà ìîæíî âîñïîëüçîâàòüñÿ êîìàíäîé $ > èìÿ-ôàéëà  ðåäàêòîðå ìîæíî íàáèðàòü òåêñò îáû÷íûì îáðàçîì, ðàáîòàþò òàêæå êëàâèøè Backspace, Del, ñòðåëêè, PageUp, PageDown. Âûäåëèòü áëîê ìîæíî, ïîñòàâèâ êóðñîð íà íà÷àëî è íàæàâ F3, çàòåì ïîñòàâèâ êóðñîð íà ñèìâîë, ñëåäóþùèé çà ïîñëåäíèì ñèìâîëîì, êîòîðûé äîëæåí áûòü â áëîêå, è íàæàâ F3 åùå ðàç. Áëîê ìîæíî çàïèñàòü íà äèñê â îòäåëüíûé ôàéë (Ctrl-F) èëè óäàëèòü (F8); ïîñòàâèâ êóðñîð íà íóæíîå ìåñòî, ìîæíî ñêîïèðîâàòü (F5) èëè ïåðåìåñòèòü (F6) áëîê òóäà. Ìîæíî âñòàâèòü ñîäåðæèìîå äðóãîãî ôàéëà â ïîçèöèþ êóðñîðà (F15 èëè shift-F5). Ìîæíî èñêàòü òåêñò (F7) èëè èñêàòü è çàìåíÿòü (F4). Íîâîé ïî ñðàâíåíèþ ñ äðóãèìè òåêñòîâûìè ðåäàêòîðàìè ÿâëÿåòñÿ âîçìîæíîñòü ¾âûðàæåíèé scanf¿, ò. å. âîçìîæíîñòü èñïîëüçîâàòü ñïåöèôèêàöèè scanf â âûðàæåíèÿõ ïîèñêà è çàìåíû. Íàïðèìåð, ìîæíî ïîìåíÿòü ìåñòàìè äâà öåëûõ ïàðàìåòðà ó âûçîâîâ ôóíêöèè f, çàäàâ äëÿ ïîèñêà f(%d,%d) è òî æå ñàìîå äëÿ çàìåíû, è çàäàâ ïîðÿäîê àðãóìåíòîâ (â îòäåëüíîì ïîëå ââîäà) 2,1. Êîìàíäà undo Ctrl-u, çàïèñü ôàéëà F2, âûõîä F10. Ýòè è íåêîòîðûå äðóãèå êîìàíäû òàêæå ìîæíî âûçâàòü èç ìåíþ (F9).  îêîííîì âàðèàíòå ýìóëÿòîð òåðìèíàëà ìîæåò ïåðåõâàòûâàòü íåêîòîðûå ôóíêöèîíàëüíûå êëàâèøè, ïîíèìàÿ èõ êàê êîìàíäû ñåáå. Åñëè ýòî ïðîèñõîäèò, ìîæíî âìåñòî F1, ..., F9, F10 íàæèìàòü (ïîñëåäîâàòåëüíî, à íå îäíîâðåìåííî) Esc è äàëåå 1, ..., 9, 0. Ò. å. F3 òî æå, ÷òî è Esc 3. Äëÿ êîìïèëÿöèè MPI-ïðîãðàììû, íàïèñàííîé íà C, ïðîùå âñåãî âîñïîëüçîâàòüñÿ ñïåöèàëüíîé âåðñèåé êîìïèëÿòîðà, êîòîðàÿ íàçûâàåòñÿ mpicc. Íàïðèìåð, ñêîìïèëèðîâàòü ïðîãðàììó prog.c èç òåêóùåãî äèðåêòîðèÿ ìîæíî êîìàíäîé 4. Êîìïèëÿöèÿ MPI-ïðîãðàììû. $ mpicc prog.c Ïðè ýòîì, åñëè ïðîãðàììà ñîäåðæèò îøèáêè (âûÿâëÿåìûå ïðè êîìïèëÿöèè), mpicc ñîîáùèò ïîëüçîâàòåëþ î íèõ. Åñëè æå îøèáîê íåò, â òåêóùåì äèðåêòîðèè ïîÿâèòñÿ ðåçóëüòàò êîìïèëÿöèè, èñïîëíÿåìàÿ ïðîãðàììà a.out. Åñëè ïðîãðàììà áûëà óñïåøíî ñêîìïèëèðîâàíà, åå ìîæíî çàïóñòèòü íà âûïîëíåíèå êîìàíäîé 5. Çàïóñê ïðîãðàììû è çàìåð âðåìåíè. $ mpirun -np ÷èñëî -machinefile ôàéë a.out Çäåñü ÷èñëî îáîçíà÷àåò òðåáóåìîå ÷èñëî ïðîöåññîâ, à ôàéë ôàéë, ñîäåðæàùèé ñïèñîê èìåí êîìïüþòåðîâ, íà êîòîðûõ äîïóñòèìî âûïîëíÿòü ýòè ïðîöåññû. Îáû÷íî, ýòîò ôàéë ñîäåðæèò èìåíà âñåõ äîñòóïíûõ êîìïüþòåðîâ èç ÷èñëà m01, m03, . . ., m10, ïî îäíîìó èìåíè íà ñòðîêå. Íåîáõîäèìî, ÷òîáû ñóììàðíîå ÷èñëî ïðîöåññîðîâ íà êîìïüþòåðàõ, èìåíà êîòîðûõ çàïèñàíû â ýòîì ôàéëå, íå áûëî ìåíüøå òîãî ÷èñëà, êîòîðîå óêàçàíî â îïöèè -np; îäíàêî, îíî ìîæåò áûòü è ñòðîãî áîëüøå. Äëÿ çàìåðà âðåìåíè ðàáîòû ïðîãðàììû ìîæíî âîñïîëüçîâàòüñÿ ñðåäñòâîì time èç êîìàíäíîãî èíòåðïðåòàòîðà: $ time mpirun -np ÷èñëî -machinefile ôàéë a.out Êîìàíäà time â êîíöå ðàáîòû ïðîãðàììû âûâîäèò ðåçóëüòàòû òðåõ çàìåðîâ âðåìåíè: îáùåå âðåìÿ (îò íà÷àëà ðàáîòû ïðîãðàììû äî åå çàâåðøåíèÿ), âðåìÿ ðàáîòû ñîáñòâåííî ïðîãðàììû íà òîì êîìïüþòåðå, íà êîòîðîì îíà áûëà çàïóùåíà, è âðåìÿ ðàáîòû îïåðàöèîííîé ñèñòåìû ïî îáñëóæèâàíèþ ïîëüçîâàòåëüñêîé ïðîãðàììû, òàêæå íà òîì êîìïüþòåðå, íà êîòîðîì ðàáîòàåò ïîëüçîâàòåëü. Âðåìÿ âûâîäèòñÿ â ìèíóòàõ è ñåêóíäàõ ñ òî÷íîñòüþ äî 0,001 ñ.