I've found it very difficult to get test/parallel/omp_nested.c to pass consistently across my build environments. The problem is that it creates N^2 threads (it is testing nested parallel regions), and that often exceeds the thread limits on systems with many cores. We do raise the process limits in lit, and that often helps, but if running lit with a smaller number of threads or on a system where we're otherwise resource constrained, this particular test tends to fail (because the runtime cannot create a sufficient number of threads). This seems to work: if the maximum number of threads is more than some small number, then cap the number of threads used for the parallel region. The choice of 4 here is somewhat arbitrary. Differential Revision: https://reviews.llvm.org/D32033 llvm-svn: 306357
47 lines
722 B
C
47 lines
722 B
C
// RUN: %libomp-compile-and-run
|
|
#include <stdio.h>
|
|
#include "omp_testsuite.h"
|
|
|
|
/*
|
|
* Test if the compiler supports nested parallelism
|
|
* By Chunhua Liao, University of Houston
|
|
* Oct. 2005
|
|
*/
|
|
int test_omp_nested()
|
|
{
|
|
#ifdef _OPENMP
|
|
if (omp_get_max_threads() > 4)
|
|
omp_set_num_threads(4);
|
|
#endif
|
|
|
|
int counter = 0;
|
|
#ifdef _OPENMP
|
|
omp_set_nested(1);
|
|
#endif
|
|
|
|
#pragma omp parallel shared(counter)
|
|
{
|
|
#pragma omp critical
|
|
counter++;
|
|
#pragma omp parallel
|
|
{
|
|
#pragma omp critical
|
|
counter--;
|
|
}
|
|
}
|
|
return (counter != 0);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int i;
|
|
int num_failed=0;
|
|
|
|
for(i = 0; i < REPETITIONS; i++) {
|
|
if(!test_omp_nested()) {
|
|
num_failed++;
|
|
}
|
|
}
|
|
return num_failed;
|
|
}
|