// This test is known to be fragile on NetBSD kernel at the moment. // UNSUPPORTED: netbsd // RUN: %libomp-compile-and-run // RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run // REQUIRES: openmp-4.5 // These compilers don't support the taskloop construct // UNSUPPORTED: gcc-4, gcc-5, icc-16 // This test is known to be fragile on NetBSD kernel at the moment, // https://bugs.llvm.org/show_bug.cgi?id=42020. // UNSUPPORTED: netbsd /* * Test for taskloop * Method: caculate how many times the iteration space is dispatched * and judge if each dispatch has the requested grainsize * It is possible for two adjacent chunks are executed by the same thread */ #include #include #include #include "omp_testsuite.h" #define CFDMAX_SIZE 1120 int test_omp_taskloop_num_tasks() { int i; int *tids; int *tidsArray; int count; int result = 0; int num_tasks; for (num_tasks = 1; num_tasks < 120; ++num_tasks) { count = 0; tidsArray = (int *)malloc(sizeof(int) * CFDMAX_SIZE); tids = tidsArray; #pragma omp parallel shared(tids) { int i; #pragma omp master #pragma omp taskloop num_tasks(num_tasks) for (i = 0; i < CFDMAX_SIZE; i++) { tids[i] = omp_get_thread_num(); } } for (i = 0; i < CFDMAX_SIZE - 1; ++i) { if (tids[i] != tids[i + 1]) { count++; } } if (count > num_tasks) { fprintf(stderr, "counted too many tasks: (wanted %d, got %d)\n", num_tasks, count); result++; } } return (result==0); } int main() { int i; int num_failed=0; for (i = 0; i < REPETITIONS; i++) { if (!test_omp_taskloop_num_tasks()) { num_failed++; } } return num_failed; }