Search
Znění úkolů pro cvičení: 05_cviceni_zadani.pdf Předpřipravený program pro ostření obrazu (pro 4. úkol):
Dokumentace a specifikace OpenMP
Kompletní přednášky Tim Mattson’s (Intel)
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;
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):
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:
Automaticky přiznačované součásti instalovat taktéž. V případě, že se rozhodnete používat NetBeans:
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:
Nastavení NetBeans pro správnou kompilaci vytvářených programů:
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):
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:
#include <stdio.h> #include <omp.h> 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; }
#include <stdio.h> #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; }
#include <stdio.h> #include "mpi.h" #include <omp.h> 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).