Кіріспе

Cilk, Cilk++, Cilk Plus және OpenCilk – көп жіпті параллель есептеулерге арналған жалпы мақсаттағы бағдарламалау тілдері. Олар C және C++ бағдарламалау тілдеріне негізделген, оларды параллель циклдарды және fork-join үлгісін (идиомасын) білдіруге арналған құрылымдармен кеңейтеді. Алғаш рет 1990 жылдары Массачусетс технология институтында (MIT) Чарльз Э. Лейзерсон тобында жасалған Cilk кейіннен Cilk Arts компаниясы тарапынан Cilk++ ретінде коммерцияландырылды. Бұл компания кейіннен Intel компаниясы сатып алды, ол қолданыстағы C және C++ кодтарымен үйлесімділікті арттырып, нәтижесінде Cilk Plus деп атады. Intel 2017 жылы Cilk Plus қолдауын тоқтатқаннан кейін, MIT Cilk-ті OpenCilk түрінде қайта дамытуда.

Cilk Arts және Cilk++

2006 жылға дейін Cilk нарығы жоғары өнімділік есептеулермен шектелген болатын. Көп ядролы процессорлардың кеңінен қолданысқа енуімен бірге, жыл сайын жүздеген миллиондаған жаңа параллельді компьютерлер шығарыла бастады. Cilk Arts осы мүмкіндікті пайдалану үшін құрылды: 2006 жылы Лейзерсон Cilk Arts-ты іске қосып, келешектегі бағдарламашылардың коммерциялық қажеттіліктерін қанағаттандыратын Cilk-тің заманауи нұсқасын жасау және нарыққа шығаруды мақсат етті. Компания 2007 жылдың қазан айында А сериялы венчурлық қаржыландыру раундын жапты, ал оның Cilk++ 1.0 өнімі 2008 жылдың желтоқсан айында шығарылды. Cilk++ бірнеше жағынан Cilk-тен өзгеше: C++ тілін қолдау, циклдарды қолдау және гиперобъектілер – жаһандық айнымалыларға параллельді қол жеткізуден туындаған деректер бәсекесі мәселелерін шешуге арналған жаңа құрылым. Cilk++ – меншік бағдарламалық қамтамасыз ету болды. Бұрынғы нұсқасы сияқты, ол Cilk-ті C++ компиляторына түрлендіретін компилятор ретінде іске асырылды. Ол Microsoft және GNU компиляторларын қолдады.

Intel Cilk Plus (Интел-Кілк Плюс)

2009 жылдың 31 шілдесінде Cilk Arts өзінің веб-сайтында өнімдері мен инженерлік тобы енді Intel Corp. құрамына енгенін жариялады. 2010 жылдың басында www.cilk.com мекенжайындағы Cilk веб-сайты Intel веб-сайтына қайта бағыттала бастады (2017 жылдың басында бастапқы Cilk веб-сайты енді жұмыс істемейді). Intel және Cilk Arts технологияны біріктіріп, оны одан әрі жетілдірді, нәтижесінде 2010 жылдың қыркүйегінде Intel Cilk Plus жарық көрді. Cilk Plus Cilk Arts ұсынған Cilk++ тілінің қарапайымдылықтарын қабылдайды, бұл бастапқы Cilk кілт сөздерінің бірнешеуін жоюға, сондай-ақ функцияларды шақыру және қысқарту операцияларына қатысқан айнымалыларды өңдеу мүмкіндігін қосуға мүмкіндік береді. Cilk Plus, Cilk және Cilk++ тілдерінен массивтерді кеңейту мүмкіндігімен, коммерциялық компиляторға (Intel-ден) енгізілуімен және қолданыстағы түзету құралдарымен үйлесімділігімен ерекшеленеді. Cilk Plus алғаш рет Intel C++ компиляторында Intel Composer XE 2010 компиляторының жаңа нұсқасымен бірге іске асырылды. Intel ашық кодты (BSD лицензиясымен) GNU Compiler Collection (GCC) жинағына қосты, ол 4.9 нұсқасында Cilk Plus қолдауын ұсынды, ал GCC 5.0 нұсқасында ғана белгілі бір кілт сөз қосылды. 2013 жылдың ақпан айында Intel Cilk Plus қолдауын қамтитын Clang құралының жаңа нұсқасын жариялады. Intel компиляторы, бірақ ашық кодты іске асырулар емес, жарыс іздеуші және өнімділікті талдаушымен бірге келеді. Кейін Intel оны қолдауды тоқтатты және пайдаланушыларына параллель бағдарламалау қажеттіліктері үшін OpenMP немесе Intel-дің TBB кітапханасын пайдалануды ұсынды.

Версиялар арасындағы айырмашылықтар

MIT Cilk-тің бастапқы нұсқасында алғашқы Cilk кілт сөзі – Cilk, ол Cilk тілінде жазылған функцияны анықтайды. Cilk процедуралары C процедураларын тікелей шақыра алады, бірақ C процедуралары Cilk процедураларын тікелей шақыра алмайды немесе жаңадан іске қоса алмайды. Сондықтан бұл кілт сөз Cilk кодын C кодынан ажырату үшін қажет. Cilk Plus бұл шектеуді және cilk кілт сөзін жояды, осылайша C және C++ функциялары Cilk Plus кодына, ал Cilk Plus коды C және C++ функцияларына шақыру мүмкіндігіне ие болады.

Cilk Plus-тің сын-пікірлері

2017 жылдың мамыр айында GCC 7.1 нұсқасы шығарылды және Cilk Plus қолдауы қолданудан шығарылатын болып белгіленді. Intel компаниясы 2017 жылдың қыркүйегінде Intel Software Development Tools құралдарының 2018 жылғы нұсқасымен Cilk Plus қолдауын тоқтатуды жариялады.

OpenCilk (жасыл)

Intel Cilk Plus қолдауын тоқтатудан кейін, MIT OpenCilk іске асыру арқылы Cilk-ті дамытуды өз мойнына алды, қазір "Tapir" деп аталатын LLVM/Clang түйінді нұсқасына баса назар аударды. OpenCilk Intel Cilk Plus-пен толыққандай үйлесімділігін сақтайды. Оның тұрақты алғашқы нұсқасы 2021 жылдың наурыз айында жарияланды.

Тіл ерекшеліктері

Cilk тілін жобалау принципі – бағдарламашы параллелизмді ашуға, қауіпсіз түрде параллель орындала алатын элементтерді анықтауға жауапты болуы керек; ал жұмысты процессорлар арасында қалай бөлу керектігін орындау кезінде орындау ортасы, әсіресе жоспарлаушы шешуі тиіс. Осы жауапкершіліктер бөлінгендіктен, Cilk бағдарламасы процессорлардың кез келген санында, тіпті біреуінде де қайта жазбастан орындала алады.

Кіреберістер

Қалған екі Cilk кілт сөзі біршама күрделірек және кіріс сөздерді пайдалануға қатысты. Әдетте, Cilk процедурасы іске қосылғанда, ол нәтижелерін ата-ана процедурасына тек ата-ананың жады аймағындағы айнымалыға нәтижелерді жазу арқылы қайтара алады, мысалыда көрсетілгендей, біз іске қосылған процедураның нәтижелерін x және y айнымалыларына тағайындадық. Балама ретінде кіріс сөзді пайдалануға болады. Кіріс сөз – Cilk процедурасының ішкі функциясы, ол іске қосылған процедураның нәтижелерін қайтарылған кезде өңдейді. Кіріс сөздерді пайдаланудың басты себебі – процедураның барлық кіріс сөздері бір-бірімен және ата-ана процедурасымен қатысты атомдық түрде жұмыс істейтініне кепілдік беріледі, осылайша егер бірнеше процедура бір уақытта ата-ана процедурасының жады аймағындағы бірдей айнымалыларды өзгертуге тырысса, туындауы мүмкін қателердің алдын алуға болады. `inlet` кілт сөзі процедура ішінде анықталған функцияны кіріс сөз ретінде белгілейді. `abort` кілт сөзін тек кіріс сөз ішінде қолдануға болады; ол жоспарлаушыға ата-ана процедурасы іске қосқан басқа процедураларды қауіпсіз тоқтатуға болатынын хабарлайды. Кіріс сөздер Cilk Cilk++ нұсқасына ауысқанда алынып тасталды және Cilk Plus нұсқасында жоқ.

Элементарлық функциялар

Cilk Plus-та элементтік функция – скалярлық аргументтерде немесе массив элементтерінде параллель түрде шақырыла алатын қалыпты функция. Олар OpenCL ядролық функцияларымен ұқсас.

#прагмалық симд

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

Жұмысты ұрлау

Cilk жоспарлаушысы бірнеше процессорлар арасында процедураны тиімді орындау үшін "жұмысты ұрлау" деп аталатын саясатты пайдаланады. Бұл мәселені түсіну үшін, ең алдымен Cilk коды бір процессорлы машинада қалай орындалатынын қарастырған жөн. Процессор процедуралық шақыруды өңдеу үшін тоқтату қажет болатын әрбір кадрды сақтайтын стекке ие. Егер fib(2) орындалып жатса және fib(1) рекурсивті шақыруына тап болса, fib(2) күйін, оның айнымалыларын және код орындалуын тоқтатқан жерін сақтап, осы күйді стекке қояды. Процедуралық шақырудан туындаған тоқтату және осы процедура арқылы шақырылған барлық процедуралар толық орындалғанға дейін ол стектегі тоқтатылған күйді алып тастамайды және орындауды жалғастырмайды. Бірнеше процессор болғанда, әрине, жағдай өзгереді. Әрбір процессорда орындалуы тоқтатылған кадрларды сақтау үшін стек болады; алайда, бұл стектер дектерге көбірек ұқсайды, себебі тоқтатылған күйлерді екі жағынан да алып тастауға болады. Процессор өз стегінен жайларды тек оларды салған жақтан ғана алып тастай алады; бірақ, қазіргі уақытта жұмыс істемейтін кез келген процессор (өз жұмысын аяқтаған немесе әлі тағайындалмаған) жоспарлаушы арқылы кездейсоқ басқа процессорды таңдап, олардың стегіндегі тоқтатылған күйлердің қарама-қарсы жағынан жұмысты "ұрлауға" тырысады, содан кейін ұрлаған процессор оны орындауды бастай алады. Ұрланған күйлер – ұрлаған процессордан бұрын орындалуға тиіс күйлер.