// RUN: %libomp-cxx-compile -fopenmp-version=51
// RUN: %libomp-run | FileCheck %s --check-prefix OMP51
#include <stdio.h>
#include <omp.h>
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;
}