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; }
// 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; }