OpenMP, co to za technologia

OpenMP, co to za technologia
Ulrich
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 3 lata
  • Postów:161
0

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.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
0

Na twoje pytania i wiele innych odpowie artykuł w Wikipedii.
http://en.wikipedia.org/wiki/OpenMP

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:6 minut
0

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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Ulrich
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 3 lata
  • Postów:161
0

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.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

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.

Do tego przyda się znajomość:

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
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:6 minut
0

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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Ulrich
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 3 lata
  • Postów:161
0

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.

Kopiuj
. 
#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ć:

Kopiuj
#pragma omp parallel for shared(kwota, lsp) private(i, j, k)

na:

Kopiuj
#pragma omp parallel for shared(kwota) private(i, j, k)\
	reduction(+:lsp) 
edytowany 2x, ostatnio: Ulrich

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.