====== 5. Cvičení - Paralelní programy pro SMS (jazyk C + OpenMP) ====== Znění úkolů pro cvičení: {{courses:A4M36PAP:tutorials:05:05_cviceni_zadani.pdf|}}\\ Předpřipravený program pro ostření obrazu (pro 4. úkol): * win {{courses:A4M36PAP:tutorials:05:program_ostreni_obrazu.zip|}} * linux {{:courses:a4m36pap:tutorials:05:program_ostreni_obrazu_linux.zip|}} \\ \\ Měření času vykonávání části programu pod Win pomocí //QueryPerformanceCounter//() z knihovny //windows.h//: LARGE_INTEGER start, stop, frequency; long overhead; QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&start); QueryPerformanceCounter(&stop); overhead = stop.QuadPart-start.QuadPart; //------------------------------ QueryPerformanceCounter(&start); // ... QueryPerformanceCounter(&stop); //------------------------------ cout << " Beh sledovane casti programu trval: " << 1000*(stop.QuadPart - start.QuadPart - overhead)/(double)frequency.QuadPart << " ms" << endl; \\ \\ Pro měření času pod linuxem lze použít //clock_gettime//() z knihovny //time.h//. struct timespec start, stop; double elapsed; //------------------------------ clock_gettime(CLOCK_REALTIME, &start); // ... clock_gettime(CLOCK_REALTIME, &stop); //------------------------------ elapsed = ( stop.tv_sec - start.tv_sec )*1000 + (double)( stop.tv_nsec - start.tv_nsec )/(double)1000000; printf( " Beh sledovane casti programu trval: %lf ms\n", elapsed); \\ \\ \\ ------- \\ Soubory k instalaci (pro domácí přípravu): - Cygwin 1.7 (C/C++ a OpenMP) http://www.cygwin.com/ - MPICH 2, Win IA32 (knižnice MPI) http://www.mcs.anl.gov/research/projects/mpich2/ - NetBeans IDE s podporou C/C++ http://netbeans.org/downloads/index.html Pozn.: Instalace NetBeans není nevyhnutná. Pohodlně psát programy je lze i v poznámkovém bloce (http://notepad-plus-plus.org). \\ \\ \\ Při instalaci Cygwin je nutno přiznačit následující součásti v devel (development) balíčku: * binutils * gcc core * gcc g++ * gcc mingw core * gcc mingw g++ * gdb * libboost * make * mingw runtime Automaticky přiznačované součásti instalovat taktéž. \\ \\ \\ V případě, že se rozhodnete používat NetBeans: Pro programování v NetBeans je pak pro správnou funkčnost potřeba přidat cestu k nainstalovanému Cygwin-u k stávajucímu %PATH%. Například v příkazovém řádku příkazem: setx path "%path%;C:\Cygwin \\ Taktéž je potřeba vykonat: setx path "%path%;C:\Program Files (x86)\MPICH2\bin Potřebná nastavaní v prostředí NetBeans IDE: \\ Nástroje -> Předvolby -> C/C++ -> karta "Build Tools" -> Tool Collection -> Add.. -> Cygwin \\ Nástroje -> Předvolby -> C/C++ -> karta "Code Assistance" -> Tool Collection -> Cygwin \\ a přidat mezi Include directories: C:\Program Files (x86)\MPICH2\include Na kartě "Build Tools" v témže okně (Nástroje -> Předvolby -> C/C++) by mělo být nastaveno: * Base Director: C:\Cygwin\bin * C compiler C:\Cygwin\bin\gcc.exe * C++ Compiler: C:\Cygwin\bin\g++-3.exe * Assembler: C:\cygwin\bin\as.exe * Make Command: C:\Cygwin\bin\make.exe * Debugger: C:\Cygwin\bin\gdb.exe Nastavení NetBeans pro správnou kompilaci vytvářených programů: **OpenMP**: \\ Soubor -> Project Properties: C Compiler: - Additional Options: -fopenmp \\ ----------------------------------------------------------------------------------- \\ **MPI**: \\ Soubor -> Project Properties: C Compiler: - Include directories: .../Program Files/MPICH2/include Linker: - Additional Library directories: .../Program Files/MPICH2/lib - Libraries: mpi.lib \\ ----------------------------------------------------------------------------------- \\ **OpenMP & MPI**: \\ Soubor -> Project Properties: C Compiler: - Include directories: .../Program Files/MPICH2/include - Additional Options: -fopenmp Linker: - Additional Library directories: .../Program Files/MPICH2/lib - Libraries: mpi.lib Kompilace programu program.c z příkazového řádku Cygwin "Cygwin Bash Shell" (čili bez použití NetBeans) pomocí g++ (gcc, mpiCC): **OpenMP**: \\ g++ program.c -fopenmp \\ ----------------------------------------------------------------------------------- \\ **MPI**: \\ g++ program.c -I"C:\Program Files\MPICH2\include" -L"C:\Program Files\MPICH2\lib" -lmpi \\ ----------------------------------------------------------------------------------- \\ **OpenMP & MPI**: \\ g++ program.c -fopenmp -I"C:\Program Files\MPICH2\include" -L"C:\Program Files\MPICH2\lib" -lmpi Testovací program program.c: **OpenMP**: #include #include int main(int argc, char *argv[]) { int iam = 0, np = 1; #pragma omp parallel default(shared) private(iam, np) { np = omp_get_num_threads(); iam = omp_get_thread_num(); printf("Hello from thread %d out of %d \n", iam, np); } return 0; } \\ ----------------------------------------------------------------------------------- \\ **MPI**: #include #include "mpi.h" int main(int argc, char *argv[]) { int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen); printf("Hello from process %d out of %d on %s\n", rank, numprocs, processor_name); MPI_Finalize(); return 0; } \\ ----------------------------------------------------------------------------------- \\ **OpenMP & MPI**: #include #include "mpi.h" #include int main(int argc, char *argv[]) { int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; int iam = 0, np = 1; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen); #pragma omp parallel default(shared) private(iam, np) { np = omp_get_num_threads(); iam = omp_get_thread_num(); printf("Hello from thread %d out of %d from process %d out of %d on %s\n", iam, np, rank, numprocs, processor_name); } MPI_Finalize(); return 0; } Pozn.: Nezapomeňte mít potřebné knihovny v adresáři s vlastním programem (typicky: cyggcc_s-1.dll, cyggomp-1.dll, cygstdc++-6.dll, cygwin1.dll).