xref: /llvm-project/openmp/runtime/test/tasking/omp_taskloop_num_tasks.c (revision ed5fe64581f4f076c00d5e57caff1ff746d57c79)
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 Peyton int 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 Peyton int 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