====== 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).