| 1 | // RUN: %libomp-compile -D_GNU_SOURCE |
| 2 | // RUN: env OMP_NUM_THREADS=2,2 KMP_AFFINITY=reset,granularity=thread,compact %libomp-run |
| 3 | // REQUIRES: linux |
| 4 | |
| 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> |
| 7 | #include <string.h> |
| 8 | #include <omp.h> |
| 9 | #include "libomp_test_affinity.h" |
| 10 | |
| 11 | #define CHECK_EQUAL 0 |
| 12 | #define CHECK_NOT_EQUAL 1 |
| 13 | |
| 14 | void check_primary_thread_affinity(int line, affinity_mask_t *other_aff, |
| 15 | int type) { |
| 16 | #pragma omp master |
| 17 | { |
| 18 | affinity_mask_t *primary_aff = affinity_mask_alloc(); |
| 19 | get_thread_affinity(mask: primary_aff); |
| 20 | if (type == CHECK_EQUAL && !affinity_mask_equal(mask1: primary_aff, mask2: other_aff)) { |
| 21 | fprintf(stderr, format: "error: line %d: primary affinity was not equal\n" , line); |
| 22 | exit(EXIT_FAILURE); |
| 23 | } else if (type == CHECK_NOT_EQUAL && |
| 24 | affinity_mask_equal(mask1: primary_aff, mask2: other_aff)) { |
| 25 | fprintf(stderr, format: "error: line %d: primary affinity was equal\n" , line); |
| 26 | exit(EXIT_FAILURE); |
| 27 | } |
| 28 | affinity_mask_free(mask: primary_aff); |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | #define CHECK_PRIMARY_THREAD_AFFINITY_EQUAL(other_aff) \ |
| 33 | check_primary_thread_affinity(__LINE__, other_aff, CHECK_EQUAL) |
| 34 | #define CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(other_aff) \ |
| 35 | check_primary_thread_affinity(__LINE__, other_aff, CHECK_NOT_EQUAL) |
| 36 | |
| 37 | int main() { |
| 38 | int i; |
| 39 | affinity_mask_t *initial_mask = affinity_mask_alloc(); |
| 40 | get_thread_affinity(mask: initial_mask); |
| 41 | |
| 42 | for (i = 0; i < 10; ++i) { |
| 43 | #pragma omp parallel |
| 44 | { |
| 45 | CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); |
| 46 | } |
| 47 | CHECK_PRIMARY_THREAD_AFFINITY_EQUAL(initial_mask); |
| 48 | } |
| 49 | |
| 50 | omp_set_max_active_levels(2); |
| 51 | for (i = 0; i < 10; ++i) { |
| 52 | #pragma omp parallel |
| 53 | { |
| 54 | CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); |
| 55 | |
| 56 | #pragma omp parallel |
| 57 | CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); |
| 58 | |
| 59 | CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); |
| 60 | } |
| 61 | CHECK_PRIMARY_THREAD_AFFINITY_EQUAL(initial_mask); |
| 62 | } |
| 63 | |
| 64 | affinity_mask_free(mask: initial_mask); |
| 65 | return EXIT_SUCCESS; |
| 66 | } |
| 67 | |