1bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart/* Simple OpenMP test program that calls printf() from a parallel section. */
2bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
35fb36bbbd127cf580806a7738eef2505bb232cdbbart#include <assert.h>  // assert()
4bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart#include <omp.h>
5bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart#include <stdio.h>
65fb36bbbd127cf580806a7738eef2505bb232cdbbart#include <stdlib.h>  // atoi()
7bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart#include <unistd.h>  // getopt()
8bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
9bbd3dcf169ce6f368dd83586b867e804d4cb84f1bartstatic void usage(const char* const exe)
10bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart{
115fb36bbbd127cf580806a7738eef2505bb232cdbbart  fprintf(stderr,
125fb36bbbd127cf580806a7738eef2505bb232cdbbart          "Usage: %s [-h] [-i <n>] [-q] [-t<n>]\n"
135fb36bbbd127cf580806a7738eef2505bb232cdbbart          "-h: display this information.\n"
145fb36bbbd127cf580806a7738eef2505bb232cdbbart          "-i <n>: number of loop iterations.\n"
155fb36bbbd127cf580806a7738eef2505bb232cdbbart          "-q: quiet mode -- do not print computed error.\n"
165fb36bbbd127cf580806a7738eef2505bb232cdbbart          "-t <n>: number of OMP threads.\n",
175fb36bbbd127cf580806a7738eef2505bb232cdbbart          exe);
18bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart}
19bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
20bbd3dcf169ce6f368dd83586b867e804d4cb84f1bartint main(int argc, char** argv)
21bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart{
22bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  int i;
23bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  int optchar;
24bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  int silent = 0;
25bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  int tid;
265fb36bbbd127cf580806a7738eef2505bb232cdbbart  int num_iterations = 2;
275fb36bbbd127cf580806a7738eef2505bb232cdbbart  int num_threads = 2;
28bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
295fb36bbbd127cf580806a7738eef2505bb232cdbbart  while ((optchar = getopt(argc, argv, "hi:qt:")) != EOF)
30bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  {
31bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    switch (optchar)
32bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    {
33bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    case 'h': usage(argv[0]); return 1;
345fb36bbbd127cf580806a7738eef2505bb232cdbbart    case 'i': num_iterations = atoi(optarg); break;
35bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    case 'q': silent = 1; break;
365fb36bbbd127cf580806a7738eef2505bb232cdbbart    case 't': num_threads = atoi(optarg); break;
37bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    default:
38bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart      return 1;
39bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    }
40bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  }
41bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
425fb36bbbd127cf580806a7738eef2505bb232cdbbart  /*
435fb36bbbd127cf580806a7738eef2505bb232cdbbart   * Not the most user-friendly way of error checking, but still better than
445fb36bbbd127cf580806a7738eef2505bb232cdbbart   * no error checking.
455fb36bbbd127cf580806a7738eef2505bb232cdbbart   */
465fb36bbbd127cf580806a7738eef2505bb232cdbbart  assert(num_iterations > 0);
475fb36bbbd127cf580806a7738eef2505bb232cdbbart  assert(num_threads > 0);
485fb36bbbd127cf580806a7738eef2505bb232cdbbart
495fb36bbbd127cf580806a7738eef2505bb232cdbbart  omp_set_num_threads(num_threads);
505fb36bbbd127cf580806a7738eef2505bb232cdbbart  omp_set_dynamic(0);
515fb36bbbd127cf580806a7738eef2505bb232cdbbart
525fb36bbbd127cf580806a7738eef2505bb232cdbbart#pragma omp parallel for private(tid)
535fb36bbbd127cf580806a7738eef2505bb232cdbbart  for (i = 0; i < num_iterations; i++)
54bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  {
55bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    tid = omp_get_thread_num();
56bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    if (! silent)
57bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    {
585fb36bbbd127cf580806a7738eef2505bb232cdbbart      fprintf(stderr,
595fb36bbbd127cf580806a7738eef2505bb232cdbbart              "iteration %d; thread number = %d; number of threads = %d\n",
605fb36bbbd127cf580806a7738eef2505bb232cdbbart              i, tid, omp_get_num_threads());
61bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    }
62bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    else
63bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    {
645fb36bbbd127cf580806a7738eef2505bb232cdbbart      fprintf(stderr, "%s", "");
65bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart    }
66bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  }
67bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
68bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  fprintf(stderr, "Finished.\n");
69bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart
70bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart  return 0;
71bbd3dcf169ce6f368dd83586b867e804d4cb84f1bart}
72