1a815cbb0SMichal Gorny // This test is known to be fragile on NetBSD kernel at the moment. 2a815cbb0SMichal Gorny // UNSUPPORTED: netbsd 393e17cfeSJonathan Peyton // RUN: %libomp-compile-and-run 493e17cfeSJonathan Peyton // RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run 55b57eb4bSJonas Hahnfeld 65b57eb4bSJonas Hahnfeld // These compilers don't support the taskloop construct 75b57eb4bSJonas Hahnfeld // UNSUPPORTED: gcc-4, gcc-5, icc-16 85b57eb4bSJonas Hahnfeld 9a815cbb0SMichal Gorny // This test is known to be fragile on NetBSD kernel at the moment, 10a815cbb0SMichal Gorny // https://bugs.llvm.org/show_bug.cgi?id=42020. 11a815cbb0SMichal Gorny // UNSUPPORTED: netbsd 12a815cbb0SMichal Gorny 1393e17cfeSJonathan Peyton /* 1493e17cfeSJonathan Peyton * Test for taskloop 15*ed5fe645SKelvin Li * Method: calculate how many times the iteration space is dispatched 1693e17cfeSJonathan Peyton * and judge if each dispatch has the requested grainsize 1793e17cfeSJonathan Peyton * It is possible for two adjacent chunks are executed by the same thread 1893e17cfeSJonathan Peyton */ 1993e17cfeSJonathan Peyton #include <stdio.h> 2093e17cfeSJonathan Peyton #include <omp.h> 2193e17cfeSJonathan Peyton #include <stdlib.h> 2293e17cfeSJonathan Peyton #include "omp_testsuite.h" 2393e17cfeSJonathan Peyton 2493e17cfeSJonathan Peyton #define CFDMAX_SIZE 1120 2593e17cfeSJonathan Peyton test_omp_taskloop_num_tasks()2693e17cfeSJonathan Peytonint test_omp_taskloop_num_tasks() 2793e17cfeSJonathan Peyton { 2893e17cfeSJonathan Peyton int i; 2993e17cfeSJonathan Peyton int *tids; 3093e17cfeSJonathan Peyton int *tidsArray; 3193e17cfeSJonathan Peyton int count; 3293e17cfeSJonathan Peyton int result = 0; 3393e17cfeSJonathan Peyton int num_tasks; 3493e17cfeSJonathan Peyton 3593e17cfeSJonathan Peyton for (num_tasks = 1; num_tasks < 120; ++num_tasks) { 3693e17cfeSJonathan Peyton count = 0; 3793e17cfeSJonathan Peyton tidsArray = (int *)malloc(sizeof(int) * CFDMAX_SIZE); 3893e17cfeSJonathan Peyton tids = tidsArray; 3993e17cfeSJonathan Peyton 4093e17cfeSJonathan Peyton #pragma omp parallel shared(tids) 4193e17cfeSJonathan Peyton { 4293e17cfeSJonathan Peyton int i; 4393e17cfeSJonathan Peyton #pragma omp master 4493e17cfeSJonathan Peyton #pragma omp taskloop num_tasks(num_tasks) 4593e17cfeSJonathan Peyton for (i = 0; i < CFDMAX_SIZE; i++) { 4693e17cfeSJonathan Peyton tids[i] = omp_get_thread_num(); 4793e17cfeSJonathan Peyton } 4893e17cfeSJonathan Peyton } 4993e17cfeSJonathan Peyton 5093e17cfeSJonathan Peyton for (i = 0; i < CFDMAX_SIZE - 1; ++i) { 5193e17cfeSJonathan Peyton if (tids[i] != tids[i + 1]) { 5293e17cfeSJonathan Peyton count++; 5393e17cfeSJonathan Peyton } 5493e17cfeSJonathan Peyton } 5593e17cfeSJonathan Peyton 5693e17cfeSJonathan Peyton if (count > num_tasks) { 5793e17cfeSJonathan Peyton fprintf(stderr, "counted too many tasks: (wanted %d, got %d)\n", 5893e17cfeSJonathan Peyton num_tasks, count); 5993e17cfeSJonathan Peyton result++; 6093e17cfeSJonathan Peyton } 6193e17cfeSJonathan Peyton } 6293e17cfeSJonathan Peyton 6393e17cfeSJonathan Peyton return (result==0); 6493e17cfeSJonathan Peyton } 6593e17cfeSJonathan Peyton main()6693e17cfeSJonathan Peytonint main() 6793e17cfeSJonathan Peyton { 6893e17cfeSJonathan Peyton int i; 6993e17cfeSJonathan Peyton int num_failed=0; 7093e17cfeSJonathan Peyton 7193e17cfeSJonathan Peyton for (i = 0; i < REPETITIONS; i++) { 7293e17cfeSJonathan Peyton if (!test_omp_taskloop_num_tasks()) { 7393e17cfeSJonathan Peyton num_failed++; 7493e17cfeSJonathan Peyton } 7593e17cfeSJonathan Peyton } 7693e17cfeSJonathan Peyton return num_failed; 7793e17cfeSJonathan Peyton } 78