Witam,
Mam się zapoznać z tą technologią
Jaki kompilator najlepiej użyć, chodzi mi o taki który jest używany w firmach które programują w OpenMP? Czyżby to był Visual Studio?
Trochę o tym czytałem, wiem ze to jest programowanie równoległe, i znacznie może skrócić czas wykonywania programu, ale chciałbym poznać opinie ludzi doświadczonych. Czy często się używa OpenMP, i do czego(interesuje mnie jakieś praktyczne zastosowanie)? Patrząc na oferty pracy nigdzie i nigdy nie widziałem wymagań dotyczących OpenMP.

- Rejestracja:około 12 lat
- Ostatnio:ponad 3 lata
- Postów:161

- Rejestracja:ponad 21 lat
- Ostatnio:5 minut
Na twoje pytania i wiele innych odpowie artykuł w Wikipedii.
http://en.wikipedia.org/wiki/OpenMP

- Rejestracja:prawie 20 lat
- Ostatnio:25 minut
OpenMP opiera się głównie na dyrektywach preprocesora w C/C++. Ogólnie to jest jedno z rozwiązań ułatwiających czy umożliwiających programowanie współbieżne/ równoległe, z tym, że OpenMP jest w miarę wysokopoziomowe, w przeciwieństwie do ręcznego żonglowania wątkami.

- Rejestracja:około 12 lat
- Ostatnio:ponad 3 lata
- Postów:161
A te dwa pytania?
Jaki kompilator najlepiej użyć, chodzi mi o taki który jest używany w firmach które programują w OpenMP? Czyżby to był Visual Studio?
Czy często się używa OpenMP, patrząc na oferty pracy nigdzie i nigdy nie widziałem wymagań dotyczących OpenMP.

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata
OpenMP raczej nie może być wykorzystane jako jedyna forma równoległości, dlatego możesz mieć problem ze znalezieniem takich ogłoszeń.
Oprócz OpenMP dobrze jest poznać jakieś standardowe rozwiązanie dot. wątków, np.
- pthreads: https://computing.llnl.gov/tutorials/pthreads/
- boost::thread - http://www.boost.org/doc/libs/1_55_0/doc/html/thread.html
- C++11 std:
http://en.cppreference.com/w/cpp/thread
Do tego przyda się znajomość:
- OpenCL (Apple, AMD, nvidia): https://www.khronos.org/opencl/
- lub nvidia CUDA: http://www.nvidia.pl/object/cuda-parallel-computing-pl.html
Są też mniej standardowe rozwiązania które mogą Cię zainteresować:
- Microsoft: Concurrency Runtime, Windows DirectCompute, C++ AMP
- Intel: thread building blocks (TBB)
- AMD: APP SDK

- Rejestracja:prawie 20 lat
- Ostatnio:25 minut
Ja korzystałem z OpenMP pod GCC. Z VisualStudio nie korzystam.
A czy często się z OpenMP korzysta? Nie wiem, nie jestem koderem C/C++ zawodowo. Tak czy siak, wątpię by OpenMP był gdziekolwiek kluczową umiejętnością, to tylko jedno API do programowania równoległego - zrównoleglenie można uzyskać wieloma metodami i generalnie nie wymaga to rozbudowanych frameworków. Myślę, że jak ktoś dobrze ogarnia zrównoleglanie per se to ogarnięcie konkretnego API to kwestia tygodni, co najwyżej miesięcy.

- Rejestracja:około 12 lat
- Ostatnio:ponad 3 lata
- Postów:161
To moje pierwsze próby z OpenMP. Program oblicza liczbę sposobów, na jakie można rozmienić podaną kwotę prze użytkownika na 2, 5 i 10zł. Bez OpenMP wynik jest poprawny. Z OpenMP już nie. Wynik jest trochę mniejszy od poprawnego. Gdzie robię błąd.
.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int kwota, lsp=0;
int i, j, k;
int t1, t2, t3, rt;
printf("Podaj kwote: \n");
scanf("%d", &kwota);
//OpenMP enabled
t1 = clock();
#pragma omp parallel for shared(kwota, lsp) private(i, j, k)
for(i=0; i<=kwota/10; i++)
{
for(j=0; j<=kwota/5; j++)
{
for(k=0; k<=kwota/2; k++)
{
if(i*10 + j*5 + k*2==kwota) lsp++;
}
}
}
t2=clock();
t3=(t2-t1)/1000;
rt=(t2-t1)%1000;
printf("%d\n", lsp);
printf("Czas wykonywania programu z OpenMP to: %d sekund i %d milisekund \n", t3, rt);
//OpenMP disabled
lsp=0;
t1 = clock();
for(i=0; i<=kwota/10; i++)
{
for(j=0; j<=kwota/5; j++)
{
for(k=0; k<=kwota/2; k++)
{
if(i*10 + j*5 + k*2==kwota) lsp++;
}
}
}
t2=clock();
t3=(t2-t1)/1000;
rt=(t2-t1)%1000;
printf("%d\n", lsp);
printf("Czas wykonywania programu bez OpenMP to: %d sekund i %d milisekund \n", t3, rt);
getch();
}
EDIT: Już rozwiązałem ten mały problem, może komuś się przyda.
Wystarczyło zmienić:
#pragma omp parallel for shared(kwota, lsp) private(i, j, k)
na:
#pragma omp parallel for shared(kwota) private(i, j, k)\
reduction(+:lsp)