166 lines
6.8 KiB
C++
166 lines
6.8 KiB
C++
|
// 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;
|
||
|
}
|