| // RUN: %libomp-compile-and-run |
| // RUN: %libomp-run | %python %S/check.py -c 'CHECK' %s |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <omp.h> |
| |
| #define XSTR(x) #x |
| #define STR(x) XSTR(x) |
| |
| #define streqls(s1, s2) (!strcmp(s1, s2)) |
| |
| #define check(condition) \ |
| if (!(condition)) { \ |
| fprintf(stderr, "error: %s: %d: %s\n", __FILE__, __LINE__, \ |
| STR(condition)); \ |
| exit(1); \ |
| } |
| |
| #if defined(_WIN32) |
| #define snprintf _snprintf |
| #endif |
| |
| #define BUFFER_SIZE 1024 |
| |
| int main(int argc, char** argv) { |
| char buf[BUFFER_SIZE]; |
| size_t needed, length; |
| const char* format = "tl:%L tn:%n nt:%N an:%a"; |
| const char* second_format = "nesting_level:%{nesting_level} thread_num:%{thread_num} num_threads:%{num_threads} ancestor_tnum:%{ancestor_tnum}"; |
| |
| length = strlen(format); |
| omp_set_affinity_format(format); |
| |
| needed = omp_get_affinity_format(buf, BUFFER_SIZE); |
| check(streqls(buf, format)); |
| check(needed == length) |
| |
| // Check that it is truncated properly |
| omp_get_affinity_format(buf, 5); |
| check(streqls(buf, "tl:%")); |
| |
| #pragma omp parallel |
| { |
| char my_buf[512]; |
| char supposed[512]; |
| int tl, tn, nt, an; |
| size_t needed, needed2; |
| tl = omp_get_level(); |
| tn = omp_get_thread_num(); |
| nt = omp_get_num_threads(); |
| an = omp_get_ancestor_thread_num(omp_get_level()-1); |
| needed = omp_capture_affinity(my_buf, 512, NULL); |
| needed2 = (size_t)snprintf(supposed, 512, "tl:%d tn:%d nt:%d an:%d", tl, tn, nt, an); |
| check(streqls(my_buf, supposed)); |
| check(needed == needed2); |
| // Check that it is truncated properly |
| supposed[4] = '\0'; |
| omp_capture_affinity(my_buf, 5, NULL); |
| check(streqls(my_buf, supposed)); |
| |
| needed = omp_capture_affinity(my_buf, 512, second_format); |
| needed2 = (size_t)snprintf(supposed, 512, "nesting_level:%d thread_num:%d num_threads:%d ancestor_tnum:%d", tl, tn, nt, an); |
| check(streqls(my_buf, supposed)); |
| check(needed == needed2); |
| |
| // Check that it is truncated properly |
| supposed[25] = '\0'; |
| omp_capture_affinity(my_buf, 26, second_format); |
| check(streqls(my_buf, supposed)); |
| } |
| |
| #pragma omp parallel num_threads(4) |
| { |
| omp_display_affinity(NULL); |
| omp_display_affinity(second_format); |
| } |
| |
| return 0; |
| } |
| |
| // CHECK: num_threads=4 tl:[0-9]+ tn:[0-9]+ nt:[0-9]+ an:[0-9]+ |
| // CHECK: num_threads=4 nesting_level:[0-9]+ thread_num:[0-9]+ num_threads:[0-9]+ ancestor_tnum:[0-9]+ |