OpenMP, co to za technologia

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.

0

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

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.

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.

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

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.

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1