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 T2250@1.73GHz 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 E7500@2.93GHz 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