1// RUN: %libomp-cxx-compile-and-run
2
3#include <omp.h>
4
5#include <algorithm>
6#include <cassert>
7#include <chrono>
8#include <thread>
9#include <vector>
10
11// AIX runs out of resource in 32-bit if 4*omp_get_max_threads() is more
12// than 64 threads with the default stack size.
13#if defined(_AIX) && !__LP64__
14#define MAX_THREADS 64
15#endif
16
17void dummy_root() {
18 // omp_get_max_threads() will do middle initialization
19 int nthreads = omp_get_max_threads();
20 std::this_thread::sleep_for(rtime: std::chrono::milliseconds(1000));
21}
22
23int main(int argc, char *argv[]) {
24 int N = std::min(a: std::max(a: std::max(a: 32, b: 4 * omp_get_max_threads()),
25 b: 4 * omp_get_num_procs()),
26 b: std::numeric_limits<int>::max());
27
28#if defined(_AIX) && !__LP64__
29 if (N > MAX_THREADS)
30 N = MAX_THREADS;
31#endif
32
33 std::vector<int> data(N);
34
35 // Create a new thread to initialize the OpenMP RTL. The new thread will not
36 // be taken as the "initial thread".
37 std::thread root(dummy_root);
38
39#pragma omp parallel for num_threads(N)
40 for (unsigned i = 0; i < N; ++i) {
41 data[i] = i;
42 }
43
44#pragma omp parallel for num_threads(N + 1)
45 for (unsigned i = 0; i < N; ++i) {
46 data[i] += i;
47 }
48
49 for (unsigned i = 0; i < N; ++i) {
50 assert(data[i] == 2 * i);
51 }
52
53 root.join();
54
55 return 0;
56}
57

source code of openmp/runtime/test/tasking/hidden_helper_task/capacity_mix_threads.cpp