blob: bfa67ec93cf7b00d59d27df6de9c37abbb68e7b1 [file] [log] [blame]
bart0aeb1862008-03-10 19:26:42 +00001/** An OpenMP example.
2 * Based on the example listed on the following web page:
3 * http://developers.sun.com/sunstudio/downloads/ssx/tha/tha_using.html
4 */
5
6
7#include <assert.h>
8#include <math.h>
9#include <omp.h>
10#include <stdio.h>
11#include <stdlib.h>
bart72ab1ff2008-03-12 16:48:07 +000012#include <unistd.h> // getopt()
bart8f822af2009-06-08 18:20:42 +000013#include "../../drd/drd.h"
bart0aeb1862008-03-10 19:26:42 +000014
15
16static int is_prime(int* const pflag, int v)
17{
18 int i;
19 int bound = floor(sqrt ((double)v)) + 1;
20
21 for (i = 2; i < bound; i++)
22 {
23 /* No need to check against known composites */
24 if (!pflag[i])
25 continue;
26 if (v % i == 0)
27 {
28 pflag[v] = 0;
29 return 0;
30 }
31 }
32 return (v > 1);
33}
34
35int main(int argc, char **argv)
36{
37 int i;
38 int total = 0;
bart8f822af2009-06-08 18:20:42 +000039 int trace_total = 0;
bart72ab1ff2008-03-12 16:48:07 +000040 int silent = 0;
41 int n;
42 int num_threads = 2;
43 int optchar;
bart0aeb1862008-03-10 19:26:42 +000044 int* primes;
45 int* pflag;
46
bart8f822af2009-06-08 18:20:42 +000047 while ((optchar = getopt(argc, argv, "qt:v")) != EOF)
bart72ab1ff2008-03-12 16:48:07 +000048 {
49 switch (optchar)
50 {
bart8f822af2009-06-08 18:20:42 +000051 case 'q':
52 silent = 1;
53 break;
54 case 't':
55 num_threads = atoi(optarg);
56 break;
57 case 'v':
58 trace_total = 1;
59 break;
bart72ab1ff2008-03-12 16:48:07 +000060 default:
61 fprintf(stderr, "Error: unknown option '%c'.\n", optchar);
62 return 1;
63 }
64 }
65
66 if (optind + 1 != argc)
67 {
68 fprintf(stderr, "Error: wrong number of arguments.\n");
bartcfe96722008-07-01 13:16:23 +000069 return 1;
bart72ab1ff2008-03-12 16:48:07 +000070 }
71 n = atoi(argv[optind]);
72
bart0aeb1862008-03-10 19:26:42 +000073 // Not the most user-friendly way to do error checking, but better than
74 // nothing.
75 assert(n > 2);
76 assert(num_threads >= 1);
77
78 primes = malloc(n * sizeof(primes[0]));
79 pflag = malloc(n * sizeof(pflag[0]));
80
81 omp_set_num_threads(num_threads);
82 omp_set_dynamic(0);
83
bart0aeb1862008-03-10 19:26:42 +000084 for (i = 0; i < n; i++) {
85 pflag[i] = 1;
86 }
87
bart8f822af2009-06-08 18:20:42 +000088 if (trace_total)
89 DRD_TRACE_VAR(total);
90
bart0aeb1862008-03-10 19:26:42 +000091#pragma omp parallel for
92 for (i = 2; i < n; i++)
93 {
94 if (is_prime(pflag, i))
95 {
96 primes[total] = i;
97 total++;
98 }
99 }
bart72ab1ff2008-03-12 16:48:07 +0000100 if (! silent)
bart0aeb1862008-03-10 19:26:42 +0000101 {
bart72ab1ff2008-03-12 16:48:07 +0000102 printf("Number of prime numbers between 2 and %d: %d\n",
103 n, total);
104 for (i = 0; i < total; i++)
105 {
106 printf("%d\n", primes[i]);
107 }
bart0aeb1862008-03-10 19:26:42 +0000108 }
109
110 free(pflag);
111 free(primes);
112
113 return 0;
114}