mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
115 lines
2.0 KiB
C
115 lines
2.0 KiB
C
/** 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;
|
|
}
|