1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Simple OpenMP test program that calls printf() from a parallel section. */
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>  // assert()
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <omp.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>  // atoi()
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h>  // getopt()
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void usage(const char* const exe)
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  fprintf(stderr,
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "Usage: %s [-h] [-i <n>] [-q] [-t<n>]\n"
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "-h: display this information.\n"
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "-i <n>: number of loop iterations.\n"
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "-q: quiet mode -- do not print computed error.\n"
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "-t <n>: number of OMP threads.\n",
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          exe);
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv)
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int optchar;
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int silent = 0;
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int tid;
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int num_iterations = 2;
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int num_threads = 2;
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  while ((optchar = getopt(argc, argv, "hi:qt:")) != EOF)
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    switch (optchar)
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    case 'h': usage(argv[0]); return 1;
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    case 'i': num_iterations = atoi(optarg); break;
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    case 'q': silent = 1; break;
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    case 't': num_threads = atoi(optarg); break;
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    default:
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      return 1;
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /*
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   * Not the most user-friendly way of error checking, but still better than
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   * no error checking.
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   */
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  assert(num_iterations > 0);
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  assert(num_threads > 0);
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  omp_set_num_threads(num_threads);
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  omp_set_dynamic(0);
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma omp parallel for private(tid)
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < num_iterations; i++)
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    tid = omp_get_thread_num();
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    if (! silent)
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fprintf(stderr,
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              "iteration %d; thread number = %d; number of threads = %d\n",
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              i, tid, omp_get_num_threads());
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    else
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    {
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      fprintf(stderr, "%s", "");
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  fprintf(stderr, "Finished.\n");
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
72