Przejdź do zawartości

Programowanie w systemie UNIX/CPU: Różnice pomiędzy wersjami

Z Wikibooks, biblioteki wolnych podręczników.
Usunięta treść Dodana treść
literówki, interpunkcja, drobne formatowanie
Linia 156: Linia 156:
* [http://bisqwit.iki.fi/story/howto/openmp/ Guide into OpenMP: Easy multithreading programming for C++. By Joel Yliluoma]
* [http://bisqwit.iki.fi/story/howto/openmp/ Guide into OpenMP: Easy multithreading programming for C++. By Joel Yliluoma]
* [https://www.youtube.com/watch?v=Y34jGSIb1yQ Fractal - Mandelbrot Set using OpenGL C++ OpenMP video by Marek Bruchatý]
* [https://www.youtube.com/watch?v=Y34jGSIb1yQ Fractal - Mandelbrot Set using OpenGL C++ OpenMP video by Marek Bruchatý]
* [http://beej.us/blog/data/parallel-programming-openmp/ beej blog : parallel-programming-openmp]


=Źródła=
=Źródła=

Wersja z 22:45, 26 wrz 2017

CPU

Epiphany

Technologia Epiphany[1] i przykładowy program z użyciem OpenCl[2]

Koprocesor Xeon Phi

Wstęp do programowania procesorów Xeon i koprocesora Xeon Phi [3]


OpenMP

Obraz i kod z użyciem OpenMP

testy wstępne

procesor

Sprawdzamy ile rdzeni (wątków) ma procesor:[4]

grep 'processor.*:' /proc/cpuinfo | wc -l 

Im więcej tym lepiej. Jeśli 1 to nie ma potrzeby używania OpenMP.

kompilator

W konsoli sprawdzamy wersję:[5]

 gcc --version ## get compiler version

lub [6]

 echo |cpp -fopenmp -dM |grep -i open

przykładowy wynik:

 #define _OPENMP 201307

biblioteki

Biblioteki:

  • libgomp (GNU Offloading and Multi Processing Runtime Library)[7]

Wyszukujemy pakiety (uwaga na openmpi - to inna biblioteka)

 sudo apt-cache search openmp


Stan biblioteki:

  dpkg --status libgomp1

wyniki:

Package: libgomp1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 156
Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Multi-Arch: same
Source: gcc-5
Version: 5.4.0-6ubuntu1~16.04.4
Depends: gcc-5-base (= 5.4.0-6ubuntu1~16.04.4), libc6 (>= 2.17)
Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2)
Description: GCC OpenMP (GOMP) support library
 GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers
 in the GNU Compiler Collection.
Homepage: http://gcc.gnu.org/
Original-Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>


lub:

  ldconfig -p | grep gomp

przykładowy wynik:

 libgomp.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgomp.so.1

Instalacja

Nie instalujemy biblioteki, ponieważ OpenMP jest to opcja kompilatora[8]

ale:

 apt-get install libgomp1
 sudo apt-get install gcc-multilib

użycie

Użycie OpenMP[9][10] polega na dodaniu do istniejącego kodu (tu przykład z kodem w C):

  • dyrektywy preprocesora: #include <omp.h>
  • Tworzenie wątków za pomocą dyrektywy: #pragma omp parallel
  • kompilacji z dodaną opcję: -fopenmp[11]

Ta niewielka ingerencja w istniejący kod[12] pozwala na przyspieszenie wykonywania n-razy (n jest liczbą możliwych wątków = liczba rdzeni * liczba wątków_na_rdzeń).

Przykłady

Pierwszy program

#include <omp.h>
#include <stdio.h>

int main() {
 #pragma omp parallel
 printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());


}


Drugi przykład

// fill array using symmetry of image 
// uses global var :  ...
int FillArraySymmetric(unsigned char data[] )
{
   
 unsigned char Color; // gray from 0 to 255 

printf("axis of symmetry \n"); 
iy = iyAxisOfSymmetry; 
#pragma omp parallel for schedule(dynamic) private(ix,Color) shared(ixMin,ixMax, iyAxisOfSymmetry)
for(ix=ixMin;ix<=ixMax;++ix) PlotPoint(ix, iy, GiveColor(ix, iy)); 


/*
The use of ‘shared(variable, variable2) specifies that these variables should be shared among all the threads.
The use of ‘private(variable, variable2)’ specifies that these variables should have a seperate instance in each thread.
*/

#pragma omp parallel for schedule(dynamic) private(iyAbove,ix,iy,Color) shared(iyAboveMin, iyAboveMax,ixMin,ixMax, iyAxisOfSymmetry)

// above and below axis 
for(iyAbove = iyAboveMin; iyAbove<=iyAboveMax; ++iyAbove) 
  {printf(" %d from %d\n", iyAbove, iyAboveMax); //info 
  for(ix=ixMin; ix<=ixMax; ++ix) 

  { // above axis compute color and save it to the array
    iy = iyAxisOfSymmetry + iyAbove;
    Color = GiveColor(ix, iy);
    PlotPoint(ix, iy, Color ); 
    // below the axis only copy Color the same as above without computing it 
    PlotPoint(ixMax-ix, iyAxisOfSymmetry - iyAbove , Color ); 
   } 
}  
 return 0;
}

Błędy

Najczęstsze błędy[13][14]

Poradniki

Źródła

  1. Technologia Epiphany - superkomputer dla każdego
  2. Mandelbrot set using OpenCL on Epiphany
  3. Tutorial: Parallel programming for Xeon and Phi at goparallel
  4. OpenMP in 30 Minutes By Joe Landman
  5. gcc wiki: openmp
  6. stackoverflow question how-to-check-the-version-of-openmp-on-linux
  7. libgomp
  8. askubuntu question how-can-i-install-openmp-in-ubuntu
  9. OpenMP w wikipedii
  10. OpenMP in 30 Minutes By Joe Landman
  11. OpenMP - kompilatory
  12. Kurs openMP - Paweł Przybyłowicz - asystent na Wydziale Matematyki Stosowanej AGH.
  13. 32 OpenMP Traps For C++ Developers 20.11.2009 by Alexey Kolosov, Andrey Karpov, Evgeniy Ryzhkov
  14. Common Mistakes in OpenMP and How To Avoid Them A Collection of Best Practices by Michael Suß and Claudia Leopold