|
Параллель есептеу жүйелерінің көптеген пайдаланушылары қуана келісетін нұсқа – ол әрине дәстүрлі тізбекті бағдарламалау тілдерін пайдалану. Бұл нұсқа идеалды болмағанымен оның көп артықшылықтары бар. Біріншіден, осы уақытқа дейін құрылған бағдарламалар багажы толық сақталады, екіншіден бағдарламашы үйреншікті терминдерде ойлауын жалғастыра алады, ал бағдарламаның параллель компьютер архитектурасына бейімделуіне қатысты барлық қосымша жұмыстарды компилятор орындайды. Бір қарағанда бәрі жеңіл, нақты орындалатын секілді көрінгенімен, мұнда компилятордың бағдарламаны автоматты түрде параллельдеу процесіне көңіл аударылуы керек.
Біз таратылған жадылы параллель компьютер үшін тиімді бағдарлама алғымыз келді делік. Негізгі есеп те осыған келіп тіреледі. Қандай да бір орындалатын кодты алу аса қиындықтар тудырмайды, ол үшін жай ғана бір процессор үшін бағдарламаны компиляция жасаса жеткілікті. Егер жүктеу кезінде бір ғана процессор қолданылып, бағдарламаның жұмыс уақыты азаймайтын болса онда параллель компьютерді пайдаланып қажет не?
Берілген архитектураның потенциалын толық пайдалану үшін, негізгі үш есепті шешу қажет:
1. бағдарламада, параллель орындауға болатын есептеу тармақтарын табу;
2. процессорлардың жергілікті жадыларының модульдеріне деректерді тарату;
3. деректерді таратуды есептеу параллельдігімен үйлестіру.
Егер бірінші есеп шешілмесе, онда компьютердің көппроцессорлы конфигурациясын пайдаланудың ешқандай мағынасы болмайды. Егер бірінші есеп шешіліп, ал қалған екеуі шешілмесе, онда бағдарламаның барлық жұмыс уақыты процессорлар арасындағы деректермен алмасуға кетуі мүмкін. Бұл жағдайда, бағдарламаның масштабталуы туралы ойды ұмытуға тура келеді.
Көрсетілген есептер шынында да өте күрделі. Бірнеше нақты мысал қарастырғаннан кейін, әркімнің де оған көзі жетері анық.
Енді аталған ситуацияны шамалы ықшамдап көрейік және ортақ жадылы параллель компьютерлерді қарастырайық. Мұнда тек бағдарламаның параллельдігін анықтау есебі ғана қалатындай болып көрінеді, бірақ бәрі сонымен шектеле ме? Бағдарламаның үш жолдан ғана тұратын келесі фрагментін қарастырайық:
DO 10 i = 1, n
DO 10 j = 1, n
10 U(i + j) = U(2*n -i-j+1) * q + p
Берілген циклді конструкцияның қандай итерациялары өзара тәуелсіз болады және фрагментті параллель орындауға болады ма? Фрагменттің ақпараттық құрылымы n = 10 жағдайы үшін 43-ші суретінде көрсетілген.
45 сурет. Фрагменттің ақпараттық құрылымы, n = 10.
Суреттен циклдардың параллель еместігін бірден анықтауға болады. Алайда берілген фрагменттің ішкі екі циклдары параллель болатындай етіп түрлендіруге болатыны байқалады.
DO 10 i = 1, n
DO 20 j = 1, n - i
20 U(i + j) = U(2*n - i - j + l)*q + p
DO 30 j = n - i + 1, n
30 U(i + j) = U(2*n - i - j + l)*q + p
10 continue.
Егер берілген фрагментті (n = 1000) векторлы-конвейерлік Cray С90 компьютерінде (шектік өнімділігі 1 Гфлопс) орындаса, онда оның өнімділігі 20 Мфлопс құрайды [10]. Төмен өнімділіктің негізгі себебі, компилятор, ішкі циклдарының барлық итерациялары өзара тәуелсіз болатын фрагменттің эквивалентті формасын өз бетінше таба алмауында, яғни ол фрагментті векторлай алмайды. Сонымен қатар өзгертілген фрагментте, дәл осы компьютердің өнімділігі шамамен 420 Мфлопс құрайтынын көреміз. Бұдан шығатын қорытынды, фрагмент бар болғаны үш жолдан тұрғанымен ондағы параллельділікті анықтау оңай бола бермейді.
Енді келесі фрагментті қарастырайық:
DO 10 i = 1, n
10 U(i) = Func(U, i)
мұндағы Func – пайдаланушы функциясы. «Цикл итерациялары өзара тәуелсіз бе, әлде жоқ па» деген сұраққа жауап беру үшін, компилятор Func функциясы U массив элементтерін пайдалана ма, жоқ па екенін анықтап алу керек. Егер функция денесінің қандай да бір жерінде, мысалы U(i-1) элементі орындалатын болса, онда итерациялар тәуелді болғаны. Егер Func функциясының өзі айқын түрде U массивін пайдаланбаса, бірақ оның денесінің қандай да бір жерінде басқа функцияны шақыру тұрса және ол өз кезегінде U(i-1) элементін пайдаланатын болса, онда цикл итерациялары тағы да тәуелді болғаны. Жалпы жағдайда, компилятор еркін ұзындықты шақырулар тізбегіне талдау жасай білуі және толық процедура-аралық талдауды орындай алуы керек. Жекелеген жағдайларда бұны істеуге болады, ал жалпы бұл есеп өте күрделі десе болады.
Ал енді компилятор, келесі фрагменттің итерацияларының тәуелсіздігі туралы қандай қорытынды жасауы мүмкін:
DO 10 i = 1, n
10 U(i) = A(i) + U(IU(i))
Егер IU массиві элементтерінің мәндері туралы ешқандай жорамал ақпараттар жоқ болса, ал ол көбіне болмайды, онда анық ештеңе айта алмаймыз. Параллель іске асыру нәтиженің өзгеруіне алып келуі мүмкін, сондықтан «сенімділік» үшін компилятор тізбекті кодты генерация жасайды. Компилятор нашар ма? Әрине жоқ, тек дәл осы жағдайда ол ештеңе де істей алмайды. Осыған ұқсас, фрагменттің шынайы құрылымын анықтау компиляторға күрделі болатын, олай болса тиімді параллель іске асыру да күрделі болатын мысалдарды көптеп келтіруге болады. Туындайтын мәселелерді шешу қабілеті төмен деп әрине компиляторды кіналап қажеті жоқ. Практика емес теория жүзінде де бағдарламалау тілінің заңдылықтарына сәйкес жазылған еркін фрагментті толықтай талдаудан өткізу мүмкін емес. Егер компьютерлердің архитектурасы күрделі болмаса, онда компиляторлар дәстүрлі тізбекті бағдарламалардан да тиімді кодтарды генерациялауға толық жағдайлары бар. Кері жағдайда компиляторға бағдарламаның қайсібір қасиеттеріне сілтеме жасайтын «жөн сілтеулер» қажет.
Компиляторға жөн сілтеулер әртүрлі формада өрнектелуі мүмкін. Бір жағдайларда комментарийлермен жазылған арнайы директивалар пайдаланылады, келесі бір жағдайларда тілге жаңа конструкциялар енгізіледі, көбіне қосымша қызметтік функциялар пайдаланылады. Типтік байланыс: дәстүрлі тізбекті тіл + қарастырылған тәсілдердің қандай да бір комбинациясы. Бағдарлама текстіне комментариилерімен арнайы директиваларды пайдалануға негізделген параллель компьютерлермен жұмыс істеуге арналған ең танымал Fortran тілінің кеңейтілімінің бірі - High Performance Fortran (HPF). Өткен ғасырдың 90-шы жылдарының ортасында HPF-ке үлкен үміт артылған болатын, өйткені бұл тіл бірден тасымалданатын параллель бағдарламаларды құрастыруға бағытталған болатын. HPF пайда болу уақыты компьютерлердің массалық параллельдігінің даму периодымен дәл келіп, ол кезде бағдарламалардың тасымалдану мәселесі өте өзекті мәселе болды. Алайда бұл жол қабылданбады, себебі HPF конструкциясының күрделілігі оны тиімді компиляторларды құру жолындағы алынбас қамалға айналдырды десе болады.
Дата добавления: 2015-10-29; просмотров: 135 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Ішкі параллельділік | | | OpenMP бағдарламалау технологиясы |