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