Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

5. Cvičení - Paralelní programy pro SMS (jazyk C + OpenMP)

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;


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):

  1. Cygwin 1.7 (C/C++ a OpenMP) http://www.cygwin.com/
  2. MPICH 2, Win IA32 (knižnice MPI) http://www.mcs.anl.gov/research/projects/mpich2/
  3. 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 <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;
}



MPI:

#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;
}



OpenMP & MPI:

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

courses/b4m35pap/tutorials/05/start.txt · Last modified: 2017/11/26 18:40 by pisa