xref: /llvm-project/openmp/runtime/test/affinity/format/affinity_display.1.c (revision a70184ba92b8bdbb27d16321a656353abf955b82)
1 // RUN: %libomp-compile
2 // RUN: env OMP_DISPLAY_AFFINITY=TRUE OMP_NUM_THREADS=4 OMP_PLACES='{0,1},{2,3},{4,5},{6,7}' %libomp-run | %python %S/check.py -c 'CHECK' %s
3 
4 // Affinity Display examples
5 #include <stdio.h>
6 #include <stdlib.h> // also null is in <stddef.h>
7 #include <stddef.h>
8 #include <omp.h>
9 #include <string.h>
10 
11 // ENVIRONMENT
12 // OMP_DISPLAY_AFFINITY=TRUE
13 // OMP_NUM_THREADS=4
14 // OMP_PLACES='{0,1},{2,3},{4,5},{6,7}'
15 
16 // CHECK: num_threads=1 OMP: pid [0-9]+ tid [0-9]+ thread [0-4] bound to OS proc set \{([0-7])|(0,1)|(undefined)\}
17 // CHECK: num_threads=4 Thread id [0-3] reporting in
18 // CHECK: num_threads=4 OMP: pid [0-9]+ tid [0-9]+ thread [0-4] bound to OS proc set \{([0-7])|([0246],[1357])|(undefined)\}
19 // CHECK: num_threads=1 Default Affinity Format is:
20 // CHECK: num_threads=1 Affinity Format set to: host=%20H tid=%0.4n binds_to=%A
21 // CHECK: num_threads=4 tid=[0-3] affinity:host=[a-zA-Z0-9_.-]+[ ]+tid=000[0-4][ ]+binds_to=(([0-7])|([0246],[1357])|(undefined))
22 
23 #define FORMAT_STORE 80
24 #define BUFFER_STORE 80
25 
main(int argc,char ** argv)26 int main(int argc, char** argv) {
27   int i, n, tid, max_req_store = 0;
28   size_t nchars;
29   char default_format[FORMAT_STORE];
30   char my_format[] = "host=%20H tid=%0.4n binds_to=%A";
31   char **buffer;
32 
33   // CODE SEGMENT 1 AFFINITY DISPLAY
34   omp_display_affinity(NULL);
35 
36   // OMP_DISPLAY_AFFINITY=TRUE,
37   // Affinity reported for 1 parallel region
38   #pragma omp parallel
39   {
40     printf("Thread id %d reporting in.\n", omp_get_thread_num());
41   }
42 
43   // Get and Display Default Affinity Format
44   nchars = omp_get_affinity_format(default_format, (size_t)FORMAT_STORE);
45   printf("Default Affinity Format is: %s\n", default_format);
46 
47   if (nchars > FORMAT_STORE) {
48     printf("Caution: Reported Format is truncated. Increase\n");
49     printf(" FORMAT_STORE by %d.\n", (int)nchars - FORMAT_STORE);
50   }
51 
52   // Set Affinity Format
53   omp_set_affinity_format(my_format);
54   printf("Affinity Format set to: %s\n", my_format);
55 
56   // CODE SEGMENT 3 CAPTURE AFFINITY
57   // Set up buffer for affinity of n threads
58   n = omp_get_max_threads();
59   buffer = (char **)malloc(sizeof(char *) * n);
60   for (i = 0; i < n; i++) {
61     buffer[i] = (char *)malloc(sizeof(char) * BUFFER_STORE);
62   }
63 
64   // Capture Affinity using Affinity Format set above.
65   // Use critical reduction to check size of buffer areas
66   #pragma omp parallel private(tid, nchars)
67   {
68     tid = omp_get_thread_num();
69     nchars = omp_capture_affinity(buffer[tid], (size_t)BUFFER_STORE, NULL);
70     #pragma omp critical
71     {
72       if (nchars > max_req_store)
73         max_req_store = nchars;
74     }
75   }
76 
77   for (i = 0; i < n; i++) {
78     printf("tid=%d affinity:%s:\n", i, buffer[i]);
79   }
80   // for 4 threads with OMP_PLACES='{0,1},{2,3},{4,5},{6,7}'
81   // host=%20H tid=%0.4n binds_to=%A
82   // host=<hostname> tid=0000 binds_to=0,1
83   // host=<hostname> tid=0001 binds_to=2,3
84   // host=<hostname> tid=0002 binds_to=4,5
85   // host=<hostname> tid=0003 binds_to=6,7
86 
87   if (max_req_store > BUFFER_STORE) {
88     printf("Caution: Affinity string truncated. Increase\n");
89     printf(" BUFFER_STORE by %d\n", max_req_store - BUFFER_STORE);
90   }
91   return 0;
92 }
93