int main(int argc, char *argv[]) {

	int numThreads;

	if (argc < 3 || argc > 3) {
		printf("Usage> %s limite_prime_number number_of_threads\n", argv[0]);
		exit(-1);
	}
	maxLimit = atol(argv[1]);
	numThreads = atol(argv[2]);

	lArrayPrimes = (char *) calloc(maxLimit, sizeof(char *));
	// Multiples de 2
	lArrayPrimes[1]++;
	for (int i = 4; i <= maxLimit; i += 2) {
		lArrayPrimes[i]++;
	}
	int base;
	nextbase = 3;
	lSquareRoot = sqrt(maxLimit);
	int i, np;
	// Démarrer le chronomètre
	Chrono lChrono(true);

	#pragma omp parallel num_threads(numThreads) shared(lArrayPrimes) private(base,i)
    {
    	#pragma omp for schedule(dynamic)
		for (base = nextbase; base <= lSquareRoot; base +=2){
			if ((int)lArrayPrimes[base] == 0) {
				for (i = base; i * base <= maxLimit; i += 2){
					lArrayPrimes[i * base]++;
				}
			}
		}
		np = omp_get_num_threads();
	}
	// Arrêter le chronomètre
	lChrono.pause();

	// Afficher les nombres trouvés à la console
	int count = 0;
	for (int i = 1; i <= maxLimit; i++) {
		if ((int) lArrayPrimes[i] == 0) {
			//printf("%i ", i);
			count++;
		}
	}
	printf("\n");
	printf("Limite Max : %i\nnumThreads : %i\n", maxLimit, np);
	printf("Primes numbers found : %i\n", count);

	// Afficher le temps d'exécution dans le stderr
	printf("Temps d'execution = %f sec\n", lChrono.get());
	return 0;
}
Beispiel #2
0
// Programme qui trouve à l'aide de la passoire d'Ératosthène,
// tous les nombres premiers inférieurs à un certain seuil
// spécifié sur la ligne de commande.
// Attention, ce programme n'est aucunement optimisé!
int main(int argc, char *argv[])
{

    // Déterminer la limite supérieure pour la recherche;
    // par défaut, prendre 1000
    unsigned long lMax = 1000;
    if (argc >= 2) {
        lMax = atol(argv[1]);
    }

    // Déterminer le nombre de threads
    int lThreads = 1; // par défault = 1
    if (argc >= 3) {
        lThreads = atoi(argv[2]);
    }
    omp_set_num_threads(lThreads);

    // Démarrer le chronomètre
    Chrono lChrono(true);

    // Allouer le tableau des drapeaux (flags) d'invalidation
    char *lFlags = (char*) calloc(lMax, sizeof(*lFlags));
    assert(lFlags != 0);

    // Process even numbers first
    unsigned long i;
    #pragma omp parallel shared(i)
    {
        #pragma omp for nowait schedule(static)
        for (i=4; i < lMax; i+=2) {
            lFlags[i]++;
        }
    }

    unsigned long lastSquared = sqrt(lMax) + 1;

    // Process odd numbers
    #pragma omp parallel shared(gP) private(i)
    {
        #pragma omp for schedule(dynamic)
        for (gP = 3; gP <= lastSquared; gP+=2) {
            if (lFlags[gP] == 0) {
                // invalider tous les multiples
                for (unsigned long i = gP; i*gP < lMax; i+=2) {
                    lFlags[i*gP]++;
                }
            }
        }
    }

    // Arrêter le chronomètre
    lChrono.pause();

    // Afficher les nombres trouvés à la console
    for (unsigned long p=2; p<lMax; p++) {
        if (lFlags[p] == 0) printf("%ld ", p);
    }
    printf("\n");

    // Afficher le temps d'exécution dans le stderr
    fprintf(stderr, "Temps d'execution = %f sec\n", lChrono.get());

    return 0;
}