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