// RUN: %libomp-cxx-compile -fopenmp-version=51 // RUN: %libomp-run | FileCheck %s --check-prefix OMP51 #include #include void foo() { #pragma omp parallel num_threads(10) { printf("\ntarget: foo(): parallel num_threads(10)"); } } int main(void) { int tl = 4; printf("\nmain: thread_limit = %d", omp_get_thread_limit()); // OMP51: main: thread_limit = {{[0-9]+}} #pragma omp target thread_limit(tl) { printf("\ntarget: thread_limit = %d", omp_get_thread_limit()); int count = 0; // OMP51: target: thread_limit = 4 // check whether thread_limit is honoured #pragma omp parallel reduction(+:count) { count++; } printf("\ntarget: parallel: count = %d", count); // OMP51: target: parallel: count = {{(1|2|3|4)$}} // check whether num_threads is honoured #pragma omp parallel num_threads(2) { printf("\ntarget: parallel num_threads(2)"); } // OMP51: target: parallel num_threads(2) // OMP51: target: parallel num_threads(2) // OMP51-NOT: target: parallel num_threads(2) // check whether thread_limit is honoured when there is a conflicting // num_threads #pragma omp parallel num_threads(10) { printf("\ntarget: parallel num_threads(10)"); } // OMP51: target: parallel num_threads(10) // OMP51: target: parallel num_threads(10) // OMP51: target: parallel num_threads(10) // OMP51: target: parallel num_threads(10) // OMP51-NOT: target: parallel num_threads(10) // check whether threads are limited across functions foo(); // OMP51: target: foo(): parallel num_threads(10) // OMP51: target: foo(): parallel num_threads(10) // OMP51: target: foo(): parallel num_threads(10) // OMP51: target: foo(): parallel num_threads(10) // OMP51-NOT: target: foo(): parallel num_threads(10) // check if user can set num_threads at runtime omp_set_num_threads(2); #pragma omp parallel { printf("\ntarget: parallel with omp_set_num_thread(2)"); } // OMP51: target: parallel with omp_set_num_thread(2) // OMP51: target: parallel with omp_set_num_thread(2) // OMP51-NOT: target: parallel with omp_set_num_thread(2) // make sure thread_limit is unaffected by omp_set_num_threads printf("\ntarget: thread_limit = %d", omp_get_thread_limit()); // OMP51: target: thread_limit = 4 } // checking consecutive target regions with different thread_limits #pragma omp target thread_limit(3) { printf("\nsecond target: thread_limit = %d", omp_get_thread_limit()); int count = 0; // OMP51: second target: thread_limit = 3 #pragma omp parallel reduction(+:count) { count++; } printf("\nsecond target: parallel: count = %d", count); // OMP51: second target: parallel: count = {{(1|2|3)$}} } // confirm that thread_limit's effects are limited to target region printf("\nmain: thread_limit = %d", omp_get_thread_limit()); // OMP51: main: thread_limit = {{[0-9]+}} #pragma omp parallel num_threads(10) { printf("\nmain: parallel num_threads(10)"); } // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51: main: parallel num_threads(10) // OMP51-NOT: main: parallel num_threads(10) // check combined target directives which support thread_limit // target parallel #pragma omp target parallel thread_limit(2) printf("\ntarget parallel thread_limit(2)"); // OMP51: target parallel thread_limit(2) // OMP51: target parallel thread_limit(2) // OMP51-NOT: target parallel thread_limit(2) #pragma omp target parallel num_threads(2) thread_limit(3) printf("\ntarget parallel num_threads(2) thread_limit(3)"); // OMP51: target parallel num_threads(2) thread_limit(3) // OMP51: target parallel num_threads(2) thread_limit(3) // OMP51-NOT: target parallel num_threads(2) thread_limit(3) #pragma omp target parallel num_threads(3) thread_limit(2) printf("\ntarget parallel num_threads(3) thread_limit(2)"); // OMP51: target parallel num_threads(3) thread_limit(2) // OMP51: target parallel num_threads(3) thread_limit(2) // OMP51-NOT: target parallel num_threads(3) thread_limit(2) // target parallel for #pragma omp target parallel for thread_limit(2) for (int i = 0; i < 5; ++i) printf("\ntarget parallel for thread_limit(2) : thread num = %d", omp_get_thread_num()); // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}} // OMP51-NOT: target parallel for thread_limit(3) : thread num = {{0|1}} // target parallel for simd #pragma omp target parallel for simd thread_limit(2) for (int i = 0; i < 5; ++i) printf("\ntarget parallel for simd thread_limit(2) : thread num = %d", omp_get_thread_num()); // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}} // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}} // OMP51-NOT: target parallel for simd thread_limit(2) : thread num = // {{0|1}} // target simd #pragma omp target simd thread_limit(2) for (int i = 0; i < 5; ++i) printf("\ntarget simd thread_limit(2) : thread num = %d", omp_get_thread_num()); // OMP51: target simd thread_limit(2) : thread num = {{0|1}} // OMP51: target simd thread_limit(2) : thread num = {{0|1}} // OMP51: target simd thread_limit(2) : thread num = {{0|1}} // OMP51: target simd thread_limit(2) : thread num = {{0|1}} // OMP51: target simd thread_limit(2) : thread num = {{0|1}} // OMP51-NOT: target simd thread_limit(2) : thread num = {{0|1}} // target parallel loop #pragma omp target parallel loop thread_limit(2) for (int i = 0; i < 5; ++i) printf("\ntarget parallel loop thread_limit(2) : thread num = %d", omp_get_thread_num()); // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}} // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}} // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}} // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}} // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}} // # OMP51-NOT: target parallel loop thread_limit(2) : thread num = {{0|1}} return 0; }