
Add support to the runtime for 6.0 spec features that allow num_threads clause to take a list, and also make use of the strict modifier. Provides new compiler interface functions for these features.
104 lines
3.7 KiB
C
104 lines
3.7 KiB
C
// RUN: %libomp-compile && env OMP_NUM_THREADS=2,2,2,2,2 OMP_THREAD_LIMIT=16 \
|
|
// RUN: %libomp-run
|
|
#include <stdio.h>
|
|
#include "omp_testsuite.h"
|
|
|
|
// When compiler supports num_threads clause list format and strict modifier,
|
|
// remove the following and use num_threads clause directly
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
int __kmpc_global_thread_num(void *loc);
|
|
void __kmpc_push_num_threads_list(void *loc, int gtid, unsigned length,
|
|
int *list);
|
|
void __kmpc_push_num_threads_strict(void *loc, int gtid, int nth, int sev,
|
|
const char *msg);
|
|
void __kmpc_push_num_threads_list_strict(void *loc, int gtid, unsigned length,
|
|
int *list, int sev, const char *msg);
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
int test_omp_parallel_num_threads_strict() {
|
|
int num_failed = 0;
|
|
|
|
// Test regular runtime warning about exceeding thread limit.
|
|
// Tolerate whatever value was given.
|
|
#pragma omp parallel reduction(+ : num_failed) num_threads(22)
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 22);
|
|
|
|
// Test with 4 threads and strict -- no problem, no warning.
|
|
__kmpc_push_num_threads_strict(NULL, __kmpc_global_thread_num(NULL), 4, 1,
|
|
"This warning shouldn't happen.");
|
|
#pragma omp parallel reduction(+ : num_failed) // num_threads(strict:4)
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() == 4);
|
|
|
|
// Exceed limit, specify user warning message. Tolerate whatever was given.
|
|
__kmpc_push_num_threads_strict(NULL, __kmpc_global_thread_num(NULL), 20, 1,
|
|
"User-supplied warning for strict.");
|
|
#pragma omp parallel reduction(+ : num_failed)
|
|
// num_threads(strict:20) severity(warning)
|
|
// message("User-supplied warning for strict.")
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 20);
|
|
|
|
// Exceed limit, no user message, use runtime default message for strict.
|
|
// Tolerate whatever value was given.
|
|
__kmpc_push_num_threads_strict(NULL, __kmpc_global_thread_num(NULL), 21, 1,
|
|
NULL);
|
|
#pragma omp parallel reduction(+ : num_failed) // num_threads(strict:21)
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 21);
|
|
|
|
// Exceed limit at top level. Should see user warning message.
|
|
int threads3[2] = {24, 2};
|
|
__kmpc_push_num_threads_list_strict(NULL, __kmpc_global_thread_num(NULL), 2,
|
|
threads3, 1,
|
|
"User-supplied warning on strict list.");
|
|
#pragma omp parallel reduction(+ : num_failed)
|
|
// num_threads(strict:24,2) severity(warning)
|
|
// message("User-supplied warning on strict. list") // 1st level
|
|
{
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 24);
|
|
#pragma omp parallel reduction(+ : num_failed) // 2nd level
|
|
{
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 2);
|
|
}
|
|
}
|
|
|
|
// No strict limit at top level. Regular runtime limiting applies.
|
|
__kmpc_push_num_threads_list(NULL, __kmpc_global_thread_num(NULL), 2,
|
|
threads3);
|
|
#pragma omp parallel reduction(+ : num_failed)
|
|
// num_threads(24,2) // 1st level
|
|
{
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 24);
|
|
#pragma omp parallel reduction(+ : num_failed) // 2nd level
|
|
{
|
|
#pragma omp single
|
|
num_failed = num_failed + !(omp_get_num_threads() <= 2);
|
|
}
|
|
}
|
|
|
|
return (!num_failed);
|
|
}
|
|
|
|
int main() {
|
|
int i;
|
|
int num_failed = 0;
|
|
|
|
for (i = 0; i < REPETITIONS; i++) {
|
|
if (!test_omp_parallel_num_threads_strict()) {
|
|
num_failed++;
|
|
}
|
|
}
|
|
return num_failed;
|
|
}
|