// RUN: %libomp-compile -D_GNU_SOURCE // RUN: env OMP_NUM_THREADS=2,2 KMP_AFFINITY=reset,granularity=thread,compact %libomp-run // REQUIRES: linux #include #include #include #include #include "libomp_test_affinity.h" #define CHECK_EQUAL 0 #define CHECK_NOT_EQUAL 1 void check_primary_thread_affinity(int line, affinity_mask_t *other_aff, int type) { #pragma omp master { affinity_mask_t *primary_aff = affinity_mask_alloc(); get_thread_affinity(primary_aff); if (type == CHECK_EQUAL && !affinity_mask_equal(primary_aff, other_aff)) { fprintf(stderr, "error: line %d: primary affinity was not equal\n", line); exit(EXIT_FAILURE); } else if (type == CHECK_NOT_EQUAL && affinity_mask_equal(primary_aff, other_aff)) { fprintf(stderr, "error: line %d: primary affinity was equal\n", line); exit(EXIT_FAILURE); } affinity_mask_free(primary_aff); } } #define CHECK_PRIMARY_THREAD_AFFINITY_EQUAL(other_aff) \ check_primary_thread_affinity(__LINE__, other_aff, CHECK_EQUAL) #define CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(other_aff) \ check_primary_thread_affinity(__LINE__, other_aff, CHECK_NOT_EQUAL) int main() { int i; affinity_mask_t *initial_mask = affinity_mask_alloc(); get_thread_affinity(initial_mask); for (i = 0; i < 10; ++i) { #pragma omp parallel { CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); } CHECK_PRIMARY_THREAD_AFFINITY_EQUAL(initial_mask); } omp_set_max_active_levels(2); for (i = 0; i < 10; ++i) { #pragma omp parallel { CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); #pragma omp parallel CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask); } CHECK_PRIMARY_THREAD_AFFINITY_EQUAL(initial_mask); } affinity_mask_free(initial_mask); return EXIT_SUCCESS; }