/** An OpenMP example.
* Based on the example listed on the following web page:
* http://developers.sun.com/sunstudio/downloads/ssx/tha/tha_using.html
*/
#include <assert.h>
#include <math.h>
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // getopt()
#include "../../drd/drd.h"
static int is_prime(int* const pflag, int v)
{
int i;
int bound = floor(sqrt ((double)v)) + 1;
for (i = 2; i < bound; i++)
{
/* No need to check against known composites */
if (!pflag[i])
continue;
if (v % i == 0)
{
pflag[v] = 0;
return 0;
}
}
return (v > 1);
}
int main(int argc, char **argv)
{
int i;
int total = 0;
int trace_total = 0;
int silent = 0;
int n;
int num_threads = 2;
int optchar;
int* primes;
int* pflag;
while ((optchar = getopt(argc, argv, "qt:v")) != EOF)
{
switch (optchar)
{
case 'q':
silent = 1;
break;
case 't':
num_threads = atoi(optarg);
break;
case 'v':
trace_total = 1;
break;
default:
fprintf(stderr, "Error: unknown option '%c'.\n", optchar);
return 1;
}
}
if (optind + 1 != argc)
{
fprintf(stderr, "Error: wrong number of arguments.\n");
return 1;
}
n = atoi(argv[optind]);
// Not the most user-friendly way to do error checking, but better than
// nothing.
assert(n > 2);
assert(num_threads >= 1);
primes = malloc(n * sizeof(primes[0]));
pflag = malloc(n * sizeof(pflag[0]));
omp_set_num_threads(num_threads);
omp_set_dynamic(0);
for (i = 0; i < n; i++) {
pflag[i] = 1;
}
if (trace_total)
DRD_TRACE_VAR(total);
#pragma omp parallel for
for (i = 2; i < n; i++)
{
if (is_prime(pflag, i))
{
primes[total] = i;
total++;
}
}
if (! silent)
{
printf("Number of prime numbers between 2 and %d: %d\n",
n, total);
for (i = 0; i < total; i++)
{
printf("%d\n", primes[i]);
}
}
free(pflag);
free(primes);
return 0;
}