Skocz do: nawigacji, wyszukiwania

MICLAB:Intel TBB


Środowisko i modele programowania

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



Standard Intel Threads Building Blocks


Intel Thread Building Blocks (Intel TBB) jest biblioteką szablonów języka C++ opracowaną przez firmę Intel. Standard zaprojektowany został w celu uproszenia procesu zrównoleglenia algorytmów. Umożliwia on implemenację wydajnych aplikacji dedykowanych dla wielordzeniowych procesorów ogólnego przeznaczenia. Intel TBB oferuje również możliwość tworzenia oprogramowania dla koprocesorów bazujących na architekturze Intel MIC. Głównym założeniem standardu jest tworzenie wątków, którym przyporządkowane są operacje realizowane na wybranych rdzeniach. Przyporządkowanie to odbywa się w sposób dynamiczny przez środowisko wykonawcze Intel TBB. Standard posiada własny mechanizm umożliwiający równoważenie obciążeń logicznych rdzeni, w celu ich efektywnego wykorzystania. Mechanizm ten jest podobny do sposobu balansowania obciążeń wdrożonego w technologii Cilk. Podobnie jak w przypadku OpenMP koncepcja zrównoleglenia programu jest zgodna z modelem fork-join.


Proces zrównoleglenia przy pomocy standardu Intel TBB polega stworzeniu wątku głównego, a następnie po napotkaniu dedykowanych konstrukcji tworzone są nowe wątki. Liczba obszarów równoległych w aplikacji może być dowolna, a zadania zdefiniowane w każdym z nich mogą być wykonywane przez różną liczbę wątków. Pomiędzy regionami równoległymi, program wykonywany jest przez wątek główny. Implementacji równoległych aplikacji w standardzie Intel TBB wymaga zastosowania dedykowanej dla tego standardu składni w kodzie programu, która odnosi się do algorytmów równoległych wchodzących w skład biblioteki. Przykładem takiego algorytmu jest parallel_for, wykorzystywany do implementacji równoległej wersji pętli typu for. Przykład zrównoleglenia kodu źródłowego w standardzie Intel TBB przedstawiono na Listingu 1.


#include <stdio.h>
#include <"tbb/tbb.h">

using namespace tbb;
void Foo(int i)
{
   (...)
}

int main()
{
   const int n = 100;

   parallel_for(blocked_range<size_t>(0, n),
      [&](blocked_range<size_t> r ) {
         for(size_t i=r.begin(); i!=r.end(); ++i)
         {
            Foo(i);
         }
   });

   return 0;
}
Listing 1. Zrównoleglenie pętli programu przy pomocy parallel_for


Intel TBB posiada własny dyspozytor pętli, który dzieli liczbę iteracji określoną przy pomocy obiektu blocked_range pomiędzy uruchomione wątki. Standard dopuszcza również możliwość definiowania własnego sposobu podziału pętli, wówczas liczba iteracji jaką wykona dany wątek uzależniona jest od rozmiaru ziarna, który definiowany jest jako trzeci argument w konstruktorze klasy blocked_range. Obliczenia jakie mają zostać wykonane równolegle zdefiniowane są w funkcji, która podawana jest jako drugi argument algorytmu parallel_for. W przypadku powyższego kodu (Listing 1) do zdefiniowania operacji wykonywanych przez wszystkie uruchomione wątki wykorzystano funkcje anonimowe języka C++11. Wyrażenie lambda może zostać zastąpione obiektem klasy z przeciążonym operatorem wywołania zawierającym kod, który ma zostać wykonany równolegle. Argumentem funkcji wykonywanej przez uruchomione wątki jest zestaw iteracji, przekazywany w postaci obiektu typu blocked_range.


Standard oferuje również wiele innych algorytmów umożliwiających równoległe przetwarzanie danych. Zalicza się do nich między innymi algorytmy pozwalające na zrównoleglenie pętli typu do oraz while, jak i algorytmy wykonujące równoległe sortowanie. Intel TBB umożliwia również wykonywanie równoległych operacji na danych przechowywanych w typach generycznych zdefiniowanych w bibliotece STL (Standard Template Library) języka C++. Dodatkowo istnieje możliwość zrównoleglenia pętli wykorzystującej iteratory.



< Standardy programowania równoległego - pThreads

Standardy programowania równoległego - Intel Cilk Plus>