108bbff4aSSandeep Kosuri // RUN: %libomp-cxx-compile -fopenmp-version=51
208bbff4aSSandeep Kosuri // RUN: %libomp-run | FileCheck %s --check-prefix OMP51
308bbff4aSSandeep Kosuri
408bbff4aSSandeep Kosuri #include <stdio.h>
508bbff4aSSandeep Kosuri #include <omp.h>
608bbff4aSSandeep Kosuri
foo()708bbff4aSSandeep Kosuri void foo() {
808bbff4aSSandeep Kosuri #pragma omp parallel num_threads(10)
908bbff4aSSandeep Kosuri { printf("\ntarget: foo(): parallel num_threads(10)"); }
1008bbff4aSSandeep Kosuri }
1108bbff4aSSandeep Kosuri
main(void)1208bbff4aSSandeep Kosuri int main(void) {
1308bbff4aSSandeep Kosuri
1408bbff4aSSandeep Kosuri int tl = 4;
1508bbff4aSSandeep Kosuri printf("\nmain: thread_limit = %d", omp_get_thread_limit());
1608bbff4aSSandeep Kosuri // OMP51: main: thread_limit = {{[0-9]+}}
1708bbff4aSSandeep Kosuri
1808bbff4aSSandeep Kosuri #pragma omp target thread_limit(tl)
1908bbff4aSSandeep Kosuri {
2008bbff4aSSandeep Kosuri printf("\ntarget: thread_limit = %d", omp_get_thread_limit());
21*c2019c41SMartin Storsjö int count = 0;
2208bbff4aSSandeep Kosuri // OMP51: target: thread_limit = 4
2308bbff4aSSandeep Kosuri // check whether thread_limit is honoured
24*c2019c41SMartin Storsjö #pragma omp parallel reduction(+:count)
25*c2019c41SMartin Storsjö { count++; }
26*c2019c41SMartin Storsjö printf("\ntarget: parallel: count = %d", count);
27*c2019c41SMartin Storsjö // OMP51: target: parallel: count = {{(1|2|3|4)$}}
2808bbff4aSSandeep Kosuri
2908bbff4aSSandeep Kosuri // check whether num_threads is honoured
3008bbff4aSSandeep Kosuri #pragma omp parallel num_threads(2)
3108bbff4aSSandeep Kosuri { printf("\ntarget: parallel num_threads(2)"); }
3208bbff4aSSandeep Kosuri // OMP51: target: parallel num_threads(2)
3308bbff4aSSandeep Kosuri // OMP51: target: parallel num_threads(2)
3408bbff4aSSandeep Kosuri // OMP51-NOT: target: parallel num_threads(2)
3508bbff4aSSandeep Kosuri
3608bbff4aSSandeep Kosuri // check whether thread_limit is honoured when there is a conflicting
3708bbff4aSSandeep Kosuri // num_threads
3808bbff4aSSandeep Kosuri #pragma omp parallel num_threads(10)
3908bbff4aSSandeep Kosuri { printf("\ntarget: parallel num_threads(10)"); }
4008bbff4aSSandeep Kosuri // OMP51: target: parallel num_threads(10)
4108bbff4aSSandeep Kosuri // OMP51: target: parallel num_threads(10)
4208bbff4aSSandeep Kosuri // OMP51: target: parallel num_threads(10)
4308bbff4aSSandeep Kosuri // OMP51: target: parallel num_threads(10)
4408bbff4aSSandeep Kosuri // OMP51-NOT: target: parallel num_threads(10)
4508bbff4aSSandeep Kosuri
4608bbff4aSSandeep Kosuri // check whether threads are limited across functions
4708bbff4aSSandeep Kosuri foo();
4808bbff4aSSandeep Kosuri // OMP51: target: foo(): parallel num_threads(10)
4908bbff4aSSandeep Kosuri // OMP51: target: foo(): parallel num_threads(10)
5008bbff4aSSandeep Kosuri // OMP51: target: foo(): parallel num_threads(10)
5108bbff4aSSandeep Kosuri // OMP51: target: foo(): parallel num_threads(10)
5208bbff4aSSandeep Kosuri // OMP51-NOT: target: foo(): parallel num_threads(10)
5308bbff4aSSandeep Kosuri
5408bbff4aSSandeep Kosuri // check if user can set num_threads at runtime
5508bbff4aSSandeep Kosuri omp_set_num_threads(2);
5608bbff4aSSandeep Kosuri #pragma omp parallel
5708bbff4aSSandeep Kosuri { printf("\ntarget: parallel with omp_set_num_thread(2)"); }
5808bbff4aSSandeep Kosuri // OMP51: target: parallel with omp_set_num_thread(2)
5908bbff4aSSandeep Kosuri // OMP51: target: parallel with omp_set_num_thread(2)
6008bbff4aSSandeep Kosuri // OMP51-NOT: target: parallel with omp_set_num_thread(2)
6108bbff4aSSandeep Kosuri
6208bbff4aSSandeep Kosuri // make sure thread_limit is unaffected by omp_set_num_threads
6308bbff4aSSandeep Kosuri printf("\ntarget: thread_limit = %d", omp_get_thread_limit());
6408bbff4aSSandeep Kosuri // OMP51: target: thread_limit = 4
6508bbff4aSSandeep Kosuri }
6608bbff4aSSandeep Kosuri
6708bbff4aSSandeep Kosuri // checking consecutive target regions with different thread_limits
6808bbff4aSSandeep Kosuri #pragma omp target thread_limit(3)
6908bbff4aSSandeep Kosuri {
7008bbff4aSSandeep Kosuri printf("\nsecond target: thread_limit = %d", omp_get_thread_limit());
71*c2019c41SMartin Storsjö int count = 0;
7208bbff4aSSandeep Kosuri // OMP51: second target: thread_limit = 3
73*c2019c41SMartin Storsjö #pragma omp parallel reduction(+:count)
74*c2019c41SMartin Storsjö { count++; }
75*c2019c41SMartin Storsjö printf("\nsecond target: parallel: count = %d", count);
76*c2019c41SMartin Storsjö // OMP51: second target: parallel: count = {{(1|2|3)$}}
7708bbff4aSSandeep Kosuri }
7808bbff4aSSandeep Kosuri
7908bbff4aSSandeep Kosuri // confirm that thread_limit's effects are limited to target region
8008bbff4aSSandeep Kosuri printf("\nmain: thread_limit = %d", omp_get_thread_limit());
8108bbff4aSSandeep Kosuri // OMP51: main: thread_limit = {{[0-9]+}}
8208bbff4aSSandeep Kosuri #pragma omp parallel num_threads(10)
8308bbff4aSSandeep Kosuri { printf("\nmain: parallel num_threads(10)"); }
8408bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
8508bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
8608bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
8708bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
8808bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
8908bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
9008bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
9108bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
9208bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
9308bbff4aSSandeep Kosuri // OMP51: main: parallel num_threads(10)
9408bbff4aSSandeep Kosuri // OMP51-NOT: main: parallel num_threads(10)
9508bbff4aSSandeep Kosuri
9608bbff4aSSandeep Kosuri // check combined target directives which support thread_limit
9708bbff4aSSandeep Kosuri // target parallel
9808bbff4aSSandeep Kosuri #pragma omp target parallel thread_limit(2)
9908bbff4aSSandeep Kosuri printf("\ntarget parallel thread_limit(2)");
10008bbff4aSSandeep Kosuri // OMP51: target parallel thread_limit(2)
10108bbff4aSSandeep Kosuri // OMP51: target parallel thread_limit(2)
10208bbff4aSSandeep Kosuri // OMP51-NOT: target parallel thread_limit(2)
10308bbff4aSSandeep Kosuri
10408bbff4aSSandeep Kosuri #pragma omp target parallel num_threads(2) thread_limit(3)
10508bbff4aSSandeep Kosuri printf("\ntarget parallel num_threads(2) thread_limit(3)");
10608bbff4aSSandeep Kosuri // OMP51: target parallel num_threads(2) thread_limit(3)
10708bbff4aSSandeep Kosuri // OMP51: target parallel num_threads(2) thread_limit(3)
10808bbff4aSSandeep Kosuri // OMP51-NOT: target parallel num_threads(2) thread_limit(3)
10908bbff4aSSandeep Kosuri
11008bbff4aSSandeep Kosuri #pragma omp target parallel num_threads(3) thread_limit(2)
11108bbff4aSSandeep Kosuri printf("\ntarget parallel num_threads(3) thread_limit(2)");
11208bbff4aSSandeep Kosuri // OMP51: target parallel num_threads(3) thread_limit(2)
11308bbff4aSSandeep Kosuri // OMP51: target parallel num_threads(3) thread_limit(2)
11408bbff4aSSandeep Kosuri // OMP51-NOT: target parallel num_threads(3) thread_limit(2)
11508bbff4aSSandeep Kosuri
11608bbff4aSSandeep Kosuri // target parallel for
11708bbff4aSSandeep Kosuri #pragma omp target parallel for thread_limit(2)
11808bbff4aSSandeep Kosuri for (int i = 0; i < 5; ++i)
11908bbff4aSSandeep Kosuri printf("\ntarget parallel for thread_limit(2) : thread num = %d",
12008bbff4aSSandeep Kosuri omp_get_thread_num());
12108bbff4aSSandeep Kosuri // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}}
12208bbff4aSSandeep Kosuri // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}}
12308bbff4aSSandeep Kosuri // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}}
12408bbff4aSSandeep Kosuri // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}}
12508bbff4aSSandeep Kosuri // OMP51: target parallel for thread_limit(2) : thread num = {{0|1}}
12608bbff4aSSandeep Kosuri // OMP51-NOT: target parallel for thread_limit(3) : thread num = {{0|1}}
12708bbff4aSSandeep Kosuri
12808bbff4aSSandeep Kosuri // target parallel for simd
12908bbff4aSSandeep Kosuri #pragma omp target parallel for simd thread_limit(2)
13008bbff4aSSandeep Kosuri for (int i = 0; i < 5; ++i)
13108bbff4aSSandeep Kosuri printf("\ntarget parallel for simd thread_limit(2) : thread num = %d",
13208bbff4aSSandeep Kosuri omp_get_thread_num());
13308bbff4aSSandeep Kosuri // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}}
13408bbff4aSSandeep Kosuri // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}}
13508bbff4aSSandeep Kosuri // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}}
13608bbff4aSSandeep Kosuri // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}}
13708bbff4aSSandeep Kosuri // OMP51: target parallel for simd thread_limit(2) : thread num = {{0|1}}
13808bbff4aSSandeep Kosuri // OMP51-NOT: target parallel for simd thread_limit(2) : thread num =
13908bbff4aSSandeep Kosuri // {{0|1}}
14008bbff4aSSandeep Kosuri
14108bbff4aSSandeep Kosuri // target simd
14208bbff4aSSandeep Kosuri #pragma omp target simd thread_limit(2)
14308bbff4aSSandeep Kosuri for (int i = 0; i < 5; ++i)
14408bbff4aSSandeep Kosuri printf("\ntarget simd thread_limit(2) : thread num = %d",
14508bbff4aSSandeep Kosuri omp_get_thread_num());
14608bbff4aSSandeep Kosuri // OMP51: target simd thread_limit(2) : thread num = {{0|1}}
14708bbff4aSSandeep Kosuri // OMP51: target simd thread_limit(2) : thread num = {{0|1}}
14808bbff4aSSandeep Kosuri // OMP51: target simd thread_limit(2) : thread num = {{0|1}}
14908bbff4aSSandeep Kosuri // OMP51: target simd thread_limit(2) : thread num = {{0|1}}
15008bbff4aSSandeep Kosuri // OMP51: target simd thread_limit(2) : thread num = {{0|1}}
15108bbff4aSSandeep Kosuri // OMP51-NOT: target simd thread_limit(2) : thread num = {{0|1}}
15208bbff4aSSandeep Kosuri
15308bbff4aSSandeep Kosuri // target parallel loop
15408bbff4aSSandeep Kosuri #pragma omp target parallel loop thread_limit(2)
15508bbff4aSSandeep Kosuri for (int i = 0; i < 5; ++i)
15608bbff4aSSandeep Kosuri printf("\ntarget parallel loop thread_limit(2) : thread num = %d",
15708bbff4aSSandeep Kosuri omp_get_thread_num());
15808bbff4aSSandeep Kosuri // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}}
15908bbff4aSSandeep Kosuri // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}}
16008bbff4aSSandeep Kosuri // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}}
16108bbff4aSSandeep Kosuri // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}}
16208bbff4aSSandeep Kosuri // # OMP51: target parallel loop thread_limit(2) : thread num = {{0|1}}
16308bbff4aSSandeep Kosuri // # OMP51-NOT: target parallel loop thread_limit(2) : thread num = {{0|1}}
16408bbff4aSSandeep Kosuri return 0;
16508bbff4aSSandeep Kosuri }
166