Skocz do: nawigacji, wyszukiwania

MICLAB:Intel Cilk Plus


Środowisko i modele programowania

dr inż. Łukasz Szustak, Politechnika Częstochowska, IITiS
mgr inż. Kamil Halbiniak, Politechnika Częstochowska, IITiS



Standard Intel Cilk Plus


Intel Cilk Plus jest rozszerzeniem języków C oraz C++, które pozwala na tworzenie równoległych aplikacji przeznaczonych zarówno dla procesorów ogólnego przeznaczenia jak i akceleratorów bazujących na architekturze Intel MIC. Trzy słowa kluczowe wchodzące w skład standardu Intel Cilk Plus tworzą prosty i jednocześnie wysoce wydajny model programowania równoległego, który oferuje proste w użyciu środowisko przeznaczone do tworzenia aplikacji równoległych. Koncepcja zrównoleglenia kodu źródłowego podobnie jak w przypadku standardu OpenMP oparta jest zgodna z modelemfork-join.


Język programowania Intel Cilk Plus oparty jest o technologię CILK, która opracowana została w 1994 roku przez MIT (Massachusetts Institute of Technology). Od roku 2009 technologia CILK rozwijana jest przez firmę Intel. Standard zaprojektowany został w celu dostarczenia programistom prostego oraz dobrze zbudowanego interfejsu programowania. W związku z tym, że Intel Cilk Plus jest rozszerzeniem do języków C oraz C++, zrównoleglenie programu nie wymaga wykonania znacznej restrukturyzacji jego kodu źródłowego.


Aplikacje napisane w oparciu o Intel Cilk Plus posiadają semantykę sekwencyjną. Oznacza to, że wynik obliczeń równoległych jest taki sam jak w przypadku obliczeń sekwencyjnych. Słowa kluczowe standardu zaprojektowane zostały w taki sposób, aby kod równoległy był podobny do kodu w wersji sekwencyjnej. Rozwiązanie to gwarantuje szybsze tworzenie aplikacji równoległych. Implementacja równoległych aplikacji przy użyciu standardu Intel Cilk Plus sprowadza się jedynie do użycia trzech słów kluczowych cilk_for, cilk_spawn oraz cilk_sync.


Pierwsze z nich Cilk_for jest odpowiednikiem dobrze znanej pętli for. Środowisko wykonawcze standardu Intel Cilk Plus zamienia ciało na rekurencyjny ciąg iteracji zgodnie ze strategią „dziel i zwyciężaj”. Pętla dzielona jest na części posiadające jedną lub więcej iteracji. Liczba iteracji jaka wykonana zostanie w każdym z kawałów pętli zależy od wartości ziarna zdefiniowanego przy pomocy dyrektywy #pragma cilk_grainsize. Kod źródłowy zrównoleglony przy pomocy słowa kluczowego cilk_for przedstawiony został na Listingu 1.


#include <stdio.h>
#include <cilk/cilk.h>

int main()
{
   int threads = __cilkrts_get_nworkers();
   cilk_for(int i=0; i<threads; ++i)
   {
      printf("Hello world! Watek: %d"\n", __cilkrts_get_worker_number());
   }
   
   return 0;
}
Listing 1. Zrównoleglenie pętli przy pomocy cilk_for


Kolejnym słowem kluczowym umożliwiającym zrównoleglenie aplikacji jest cilk_spawn. Umieszczone tego słowa kluczowego przed wywołaniem funkcji poinformuje środowisko wykonawcze, iż może ona zostać wykonana równolegle wraz z kodem występującym bezpośrednio po niej.


Program wykonywany jest przez wiele wątków, aż do momentu napotkania słowa kluczowego cilk_sync. Słowo te informuje środowisko Cilk, że część programu znajdująca siępo nim wykonana zostanie po zakończeniu wszystkich zadań wykonywanych równolegle . Słowa kluczowe cilk_spawn oraz cilk_sync w dużym stopniu ułatwiają implementację równoległych algorytmów rekurencyjnych. Przykład kodu zrównoleglonego przy pomocy cilk_spawn oraz cilk_sync zaprezentowano na Listingu 2.


#include <stdio.h> 
#include <cilk/cilk.h>

int main()
{
   fun1();
   cilk_spawn fun2();
   fun3();
   cilk_sync;
   fun4();

   return 0;
}
Listing 2. Zrównoleglenie programu przy pomocy cilk_spawn oraz cilk_sync


Intel Cilk Plus posiada własny dyspozytor, który automatycznie przydziela zadania do maksymalnie możliwej liczby logicznych rdzeni i równoważy ich obciążenia w najbardziej optymalny sposób. W sytuacji kiedy któryś z logicznych rdzeni jest zajęty lub obciążenie nie jest wystarczająco zrównoważone, dyspozytor przenosi zadania i uruchamia jest na logicznym rdzeniu, który w danej chwili znajduje się w stanie bezczynności. Programy, w których wymagana jest komunikacja pomiędzy wątkami, nie mogą zostać w prosty sposób zrównoleglone przy pomocy standardu Intel Cilk Plus, ponieważ nie są one zgodne z jego głównym założeniem - semantyką szeregową. Wyjściem z tej sytuacji, jest wyodrębnienie fragmentów wykonywanych zgodnie z semantyką szeregową.



< Standardy programowania równoległego - Intel TBB

Standardy programowania równoległego - MPI >