Un programme qui utilise open_mp pour trouver des nombre premier.

Contenu du snippet

Ce programme utilise une technologie particuliere pour integrer le support des threads.
OPEN_MP est base sur un macro language a base de #pragma et aussi sur le compilateur qui doit etre OPEN_MP compatible
le compilateur C/C++ de MS DEV-STUDIO PRO 2005 est 100% compatible.

Pour plus d'info : http://www.openmp.org/drupal/

Source / Exemple :


// OPEN_MP_01.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "omp.h"

int main(int argc, char *argv[])
{
	int i, j, limit;
	int start, end;          /* range of numbers to search */
	int number_of_primes=0;  /* number of primes found */
	int number_of_41primes=0;/* number of 4n+1 primes found */
	int number_of_43primes=0;/* number of 4n-1 primes found */
	int prime;               /* is the number prime? */
	int print_primes=0;      /* should each prime be printed? */
	DWORD dwStart, dwStop;
	float fElapsed;

	start = atoi(argv[1]);
	end = atoi(argv[2]);
	if (!(start % 2)) start++;

	if (argc == 4 && atoi(argv[3]) != 0) print_primes = 1;
	printf("Range to check for Primes: %d - %d\n\n",start, end);

	dwStart = GetTickCount();

#pragma omp parallel
	{
		int numPrimes=0;    /* local number of primes found */
		int num41Primes=0;  /* local number of 4n+1 primes found */
		int num43Primes=0;  /* local number of 4n-1 primes found */

#pragma omp for schedule(dynamic,1000)
		for(i = start; i <= end; i += 2) {
			int limit, j, prime;
			limit = (int) sqrt((float)i) + 1;
			prime = 1; /* assume number is prime */
			j = 3;
			while (prime && (j <= limit)) {
				if (i%j == 0) prime = 0;
				j += 2;
			}

			if (prime) {
				if (print_primes) printf("%5d is prime\n",i);
#pragma omp atomic
				number_of_primes++;

				if (i%4 == 1) {
#pragma omp atomic
					number_of_41primes++;
				}

				if (i%4 == 3) {
#pragma omp atomic
					number_of_43primes++;
				}

			}
		} // end for
	} // end parallel region

	dwStop = GetTickCount();
	fElapsed = (float) (((float)dwStop-(float)dwStart) / (float) 1000.0);
	printf("Total Elapsed time :%f Seconds\n",fElapsed);
	printf("\nProgram Done.\n %d primes found\n",number_of_primes);
	printf("\nNumber of 4n+1 primes found: %d\n",number_of_41primes);
	printf("\nNumber of 4n-1 primes found: %d\n",number_of_43primes);
}

Conclusion :


Pour utiliser le code : OpenMP.exe 1 100000
Le programme recherche les nombres premier... OPEN_MP permet a certaine partie du code d'etre automatiquement parallelise...
Donc si vous avez un ordi avec deux processeurs ou mieux un DUAL-CORE alors le programme va creer automatiquement
deux ou plus threads qui executerons par exemple la boucle :


#pragma omp parallel
{
int numPrimes=0; /* local number of primes found */
int num41Primes=0; /* local number of 4n+1 primes found */
int num43Primes=0; /* local number of 4n-1 primes found */

#pragma omp for schedule(dynamic,1000)
for(i = start; i <= end; i += 2) {
int limit, j, prime;
limit = (int) sqrt((float)i) + 1;
prime = 1; /* assume number is prime */
j = 3;
while (prime && (j <= limit)) {
if (i%j == 0) prime = 0;
j += 2;
}

if (prime) {
if (print_primes) printf("%5d is prime\n",i);
#pragma omp atomic
number_of_primes++;

if (i%4 == 1) {
#pragma omp atomic
number_of_41primes++;
}

if (i%4 == 3) {
#pragma omp atomic
number_of_43primes++;
}

}
} // end for
} // end parallel region

Donc je vous laisse deviner comment un programme qui utilise cette techno peut etre utilise pour accelerer une application.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.