1// This test is known to be fragile on NetBSD kernel at the moment.
2// UNSUPPORTED: netbsd
3// RUN: %libomp-compile-and-run
4// RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run
5
6// These compilers don't support the taskloop construct
7// UNSUPPORTED: gcc-4, gcc-5, icc-16
8
9// This test is known to be fragile on NetBSD kernel at the moment,
10// https://bugs.llvm.org/show_bug.cgi?id=42020.
11// UNSUPPORTED: netbsd
12
13/*
14 * Test for taskloop
15 * Method: calculate how many times the iteration space is dispatched
16 * and judge if each dispatch has the requested grainsize
17 * It is possible for two adjacent chunks are executed by the same thread
18 */
19#include <stdio.h>
20#include <omp.h>
21#include <stdlib.h>
22#include "omp_testsuite.h"
23
24#define CFDMAX_SIZE 1120
25
26int test_omp_taskloop_num_tasks()
27{
28 int i;
29 int *tids;
30 int *tidsArray;
31 int count;
32 int result = 0;
33 int num_tasks;
34
35 for (num_tasks = 1; num_tasks < 120; ++num_tasks) {
36 count = 0;
37 tidsArray = (int *)malloc(size: sizeof(int) * CFDMAX_SIZE);
38 tids = tidsArray;
39
40 #pragma omp parallel shared(tids)
41 {
42 int i;
43 #pragma omp master
44 #pragma omp taskloop num_tasks(num_tasks)
45 for (i = 0; i < CFDMAX_SIZE; i++) {
46 tids[i] = omp_get_thread_num();
47 }
48 }
49
50 for (i = 0; i < CFDMAX_SIZE - 1; ++i) {
51 if (tids[i] != tids[i + 1]) {
52 count++;
53 }
54 }
55
56 if (count > num_tasks) {
57 fprintf(stderr, format: "counted too many tasks: (wanted %d, got %d)\n",
58 num_tasks, count);
59 result++;
60 }
61 }
62
63 return (result==0);
64}
65
66int main()
67{
68 int i;
69 int num_failed=0;
70
71 for (i = 0; i < REPETITIONS; i++) {
72 if (!test_omp_taskloop_num_tasks()) {
73 num_failed++;
74 }
75 }
76 return num_failed;
77}
78

source code of openmp/runtime/test/tasking/omp_taskloop_num_tasks.c