Politechnika Krakowska Im. Tadeusza Ko±ciuszki

Transkrypt

Politechnika Krakowska Im. Tadeusza Ko±ciuszki
Politechnika Krakowska Im. Tadeusza
Ko±ciuszki Wydziaª Fizyki, Matematyki i
Informatyki
20 stycznia 2012
Programowanie rozproszone i równolegªe niestacjonarne magisterskie uzupeªniaj¡ce.
Streszczenie
Obliczanie caªki przy u»yciu ±rodowiska: OpenMP, MPI i CUDA.
Artur Bednarczyk, student I roku, Studia niestacjonarne
Spis tre±ci
1 Wprowadzenie
1
I Specykacja komputerów oraz systemów operacyjnych
2
II OpenMP
2
III MPI
5
IV CUDA
8
V Podsumowanie
9
1 Wprowadzenie
Celem pracy jest przedstawienie mo»liwo±ci oraz zastosowanie ±rodowisk do programowanie równolegªego i rozproszonego jakim s¡ OpenMP, MPI i CUDA,
które w znacznym stopniu pozwalaj¡ na szybsze wykonywanie oblicze«.
1
Na wst¦pie przedstawie opis danych ±rodowisko i sposób konguracji systemu
operacyjnego który umo»liwi poprawn¦ dziaªanie a zarazem kompilacj¦ danych
programów.
Kolejnym etapem jest prezentacja gªównych funkcji programów.
Podsumowanie zakresu pracy obejme przedstawienei zalet i wad ±rodowisk
OpenMP, MPI i CUDA, jako narz¦dzia, które w znaczym stopniu skracaj¡ czas
wykonywanych oblicze«.
Cz¦±¢ I
Specykacja komputerów oraz
systemów operacyjnych
Rozpocz¦ta praca na komputerze typu laptop:
Ubuntu 11.10 32bit
Genuine Intel CPU [email protected] x2
GeForce Go 7300/PCI/SSE2
Ze wzgl¦du na brak wspracia od strony NVIDIA dla GPU: GeForce Go 7300
przeniosªem si¦ na komputer typu PC:
Ubuntu 11.10 64-bitowy
Intel Core2 Duo CPU [email protected] x2
GeForce GTX 260
Cz¦±¢ II
OpenMP
OpenMP to zbiór dyrektyw, funkcji bibliotecznych i zmiennych ±rodowiskowych
maj¡cych pomóc w tworzeniu programów równolegªych w systemach z pami¦ci¡
dzielon¡. Atutem takiego standardu jest fakt, i» wi¦kszo±¢ producentów tego
typu sprz¦tu wspiera OpenMP.
Program zaczyna dziaªanie jako pojedynczy w¡tek, tzn. w¡tek gªówny (master thread), a» do momentu napotkania konstrukcji (pragmy) równolegªej. W
tym momencie utworzona zostaje grupa w¡tków, przy czym w¡tek gªówny staje
si¦ nadrz¦dny w stosunku do pozostaªych. Dalej ka»dy w¡tek wykonuje program znajduj¡cy si¦ w dynamicznym rozszerzeniu konstrukcji równolegªej (model SPMD), poza obszarami w których program jest wykonywany w modelu
pracy dzielonej. Po zako«czeniu pracy w konstrukcji równolegªej w¡tki zostaj¡
zsynchronizowane niejawn¡ barier¡ i tylko w¡tek gªówny kontynuuje prac¦. W
programie mo»na u»y¢ dowolnej ilo±ci konstrukcji równolegªych. Mo»emy równie» u»ywa¢ dyrektyw w funkcjach które s¡ wywoªywane z konstrukcji równolegªych.
2
Przykªadem urzycia poszczególnych konstrukcji jest fragment poni»szego kod
programu obliczajacy caªke metod¡ trapezów.
// Inicjalizacja obszaru równoleglenia
#pragma omp parallel
{
dx=(xk-xp)/(oat)n;
//ThreadsIdeNum();
}
cout<<"Szerokosc podzialu wynosi: "<<dx<<endl;
wynik=0;
// shared > traktuje zmienna jako globalna(globalna dla watkow)
// Obszar zrownoleglenia
#pragma opm atomic parallel shared(i) private(wynik)
{
//watki przydzielane dynamicznie
omp_set_num_threads(8)
#pragma omp for schedule(dynamic,1)
for(i=1; i<n; i++)
{
wynik +=Meth_Cal(xp + i * dx);
}
wynik += (Meth_Cal(xp) + Meth_Cal(xk))/2; wynik *= dx;
cout<<"Wynik Calkowania metoda trapezow: "<<wynik<<endl;
cout<<" "<<endl;
}
// Koniec obszaru rownoleglenia
3
Wykres zale»no±ci czasu od ilo±ci w¡tków
4
Konguracja OpenMP
Instalacja pakietów OpenMP
sudo apt-get install libgomp.so.1 sudo apt-get install openmpi-dev
Kompilacja programu
g++ -fopenmp MethodCF_MTiMP.cpp
Cz¦±¢ III
MPI
MPI (Message Passing Interface) standard biblioteki przesyªania komunikatów
dla potrzeb programowania równolegªego.
Najbardziej znan¡ implementacj¡ MPI jest MPICH, pochodz¡cy z Argonne
National Laboratory i rozwijany przez grup¦ pracowników dziaªu matematyki
i informatyki tej instytucji. Dost¦pna jest wersja zarówno na platformy UNIX
oraz Windows.
Gªównymi zaletami korzystania z danego ±rodowiska jest: Wymian¦ komunikatów mi¦dzy procesami Uzyskiwanie informacji o ±rodowisku Kontrol¦ nad
systemem
Przy przesyªaniu komunikatów mi¦dzy procesami MPI stara si¦ zachowa¢
niezale»no±¢ od platformy i wzale»no±ci od typu standardu dostarcza funkcje
pozwalaj¡ce na zdeniowanie typów u»ytkownika dla potrzeb przesyªania komunikatów.
Mo»liwe jest adresowanie komunikatów zarówno do konkretnych procesów,
jak i do okre±lonych grup odbiorców. Dost¦pne s¡ funkcje do deniowania grup
procesów i pó¹niejszego rozsyªania komunikatów do tych grup. Komunikaty
opatrzone s¡ tagami pozwalaj¡cymi na pó¹niejsze selektywne odbieranie ich z
kolejki w zale»no±ci od rodzaju.
Mo»liwa jest wymiana komunikatów w trybie non-blocking pozwalaj¡cym na
jeszcze wi¦ksze zrównoleglenie oblicze«.
Podstawowymi funkcjami w danym ±rodowisku s¡:
int MPI_Init(int *argc, char **argv) Funkcja inicjalizuje ±rodowisko wykonywania programu, m.in. tworzy domy±lny komunikator MPI_COMM_WORLD. Dopiero od momentu wywoªania
MPI_Init mo»na u»ywa¢ pozostaªych funkcji MPI.
int MPI_Finalize() Funkcja zwalnia zasoby u»ywane przez MPI i
przygotowuje system do zamkni¦cia.
int MPI_Comm_rank(MPI_Comm comm, int *rank) Funkcja pobiera numer aktualnego procesu (w obr¦bie komunikatora comm)
i umieszcza go w zmiennej rank.
5
int MPI_Comm_size(MPI_Comm comm, int *size) Funkcja pobiera ilo±¢ procesów (w obr¦bie komunikatora comm i umieszcza
j¡ w zmiennej size.
int MPI_Reduce(void *operand, void *result, int count, MPI_Datatype
datatype, MPI_Op op, int root, MPI_Comm comm) Pozwala
wykona¢ na przykªad sumowanie wszystkich cz¦±ciowych wyników otrzymanych w procesach i umieszczenie wyniku w zmiennej. Argument root wskazuje dla którego procesu wynik ma by¢
umieszczony w zmiennej result.
Przykªadem urzycia poszczególnych funkcji jest fragment poni»szego kod programu obliczajacy caªke metod¡ prostok¡tów.
MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
double t1 = MPI_Wtime();
if (myid==0)
{
n=3;
xk=5;
xp=2;
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
dx=(xk-xp)/n;
for (sum=0.0, i=myid+1; i<n; i+=numprocs)
{
mywynik += Meth_Cal(xp + i * dx);
}
mywynik *= dx;
MPI_Reduce(&mywynik, &wynik, 1, MPI_DOUBLE, MPI_SUM,
0, MPI_COMM_WORLD);
ShowMenu();
if (myid == 0)
printf("dx= %.0f \n", dx);
printf("Wynik %4.2f \n",wynik);
double t2 = MPI_Wtime();
printf("Czas oblicze«: %f\n",t2-t1);
MPI_Finalize();
6
Wykres dziaªania programu MPI
7
Instalacja pakietów MPI
sudo apt-get install openmpi-dev sudo apt-get install package-developer
Kompilacja programu
mpicc MethodCF_MP_MPI.cpp
mpicc MethodCF_MT_MPI.cpp
Cz¦±¢ IV
CUDA
CUDA jest opracowan¡ przez rm¦ NVIDIA, która udost¦pnia wzrost wydajno±ci oblicze« przy wykorzystaniu mocy procesora GPU.
Integraln¡ cz¦±ci¡ architektury CUDA jest oparte na j¦zyku programowania
C ±rodowisko programistyczne wysokiego poziomu, w którego skªad wchodz¡
kompilator "nvcc". Procesor GPU wykorzystuje pami¦¢ wspóªdzielon¡ za pomoc¡ w¡tków/bloków których mo»e by¢ od 128 a» do 512.
Gªówn¡ dziaªaniem CUDA jest mo»liwo±¢ odczytywania i zapisywania danych z dowolnego adresu pami¦ci GPU.
Podstawowe funkcje wykorzystywane w programowaniu CUDA:
cudaMalloc: przekazywanie alokacji do funkcji lub do oczytu i zapisu, która wykona si¦ na poszczególnych argumentach.
__kernel__ void *: przekazywanie parametrów do j¡dra systemu.
cudaMemcpy(): uzyskanie dost¦pu do pami¦ci za po±rednictwem
kodu hosta. Tak samo jak w standardzie C i memcpy() z dodatkowego parametu aby okre±li¢ ¹ródªa i wska¹nik docelowego
punktu pami¦ci.
cudaFree: zwolnienie pami¦ci przydzielonej z cudaMalloc().
Poni»szy kod pokazuje sposób urzycia poszczególnych funkcji obliczajacej caªke
metod¡ simpsona.
__global__ void dxMethod(int xk, int xp, int n, int *dx){
*dx=(xk-xp)/n; }
. . .
cudaMalloc((void**)&dev_dx, sizeof(int));
dxMethod<<<1,1>>>(5, 3, 2, dev_dx);
for (i=1; i<=n ; i++)
{
x = xp + i * dx;
8
mywynik += Meth_Cal(x-dx/2);
cudaMemcpy( &dx, dev_dx, sizeof(int), cudaMemcpyDeviceToHost);
if (i < n) { wynik+=Meth_Cal(x);
}
}. . .
cudaFree(dev_dx);
Instalacja pakietów CUDA
sudo apt-get install nvidia-current nvidia-current-dev nvidia-currentupdates nvidia-current-updates-dev
sudo apt-get install nvidia-cuda-toolkit
sudo apt-get install nvidia-cuda-sdk
Kompilacja programu
nvcc -c MethodCF_MS_CUDA.cu g++-4.4 -o runme -L /usr/local/cuda/lib
-lcudart MethodCF_MS_CUDA.o
Cz¦±¢ V
Podsumowanie
Celem danego projektu byªo przestawienie ±rodowiska OpenMP, MPI i CUDA
wraz z ich mo»liwo±ciami do programowania równolegªego i rozproszonego, które
w znaczym stopniu wspieraj¡ prac¦ przy bardzo skomplikowanych obliczeniach
np: matematycznych czy zycznych.
Nie które z w/w ±rodowisk posiadaj¡ prosty sposób implementacji w j¦zykach
programowania takich jak C, C++, Java czy Fortran co powoduje i» osoba która
nie zajmuje si¦ na codzie« programowanie mo»e wesprzec swoj¡ prac¦ i uzyska¢
szybki dost¦p do wyników swoich oblicze«.
Literatura
[1] Bibliograa
[2] 1.OpenMP, http://computing.llnl.gov/tutorials/openMP/ Author:Blaise
Barney, Lawrence Livermore National Laboratory
[3] 2.MPI, http//:computing.llnl.gov/tutorials/mpi/ Author: Blaise Barney,
Lawrence Livermore National Laboratory
[4] 3.CUDA, CUDA BY EXAMPLE 2010. An Introduction to General-Purpose
GPU Programming Author: Jason Sanders, Edward Kandrot. Nvidia.
9