1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
// 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;
}
|