67 lines · c
1// RUN: %libomp-compile -D_GNU_SOURCE2// RUN: env OMP_NUM_THREADS=2,2 KMP_AFFINITY=reset,granularity=thread,compact %libomp-run3// REQUIRES: linux4 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 012#define CHECK_NOT_EQUAL 113 14void check_primary_thread_affinity(int line, affinity_mask_t *other_aff,15 int type) {16 #pragma omp master17 {18 affinity_mask_t *primary_aff = affinity_mask_alloc();19 get_thread_affinity(primary_aff);20 if (type == CHECK_EQUAL && !affinity_mask_equal(primary_aff, other_aff)) {21 fprintf(stderr, "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(primary_aff, other_aff)) {25 fprintf(stderr, "error: line %d: primary affinity was equal\n", line);26 exit(EXIT_FAILURE);27 }28 affinity_mask_free(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 37int main() {38 int i;39 affinity_mask_t *initial_mask = affinity_mask_alloc();40 get_thread_affinity(initial_mask);41 42 for (i = 0; i < 10; ++i) {43 #pragma omp parallel44 {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 parallel53 {54 CHECK_PRIMARY_THREAD_AFFINITY_NOT_EQUAL(initial_mask);55 56 #pragma omp parallel57 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(initial_mask);65 return EXIT_SUCCESS;66}67