1# mode: run
2# tag: openmp, pure3.6
3
4import cython
5from cython.parallel import prange, parallel
6
7
8def prange_regression(n: cython.int, data: list):
9    """
10    >>> prange_regression(10, list(range(1, 4)))
11    19
12    """
13    s: cython.int = 0
14    i: cython.int
15    d: cython.int[3] = data
16
17    for i in prange(n, num_threads=3, nogil=True):
18        s += d[i % 3]
19    return s
20
21
22def prange_with_gil(n: cython.int, x):
23    """
24    >>> sum(3*i for i in range(10))
25    135
26    >>> prange_with_gil(10, 3)
27    135
28    """
29    i: cython.int
30    s: cython.int = 0
31
32    for i in prange(n, num_threads=3, nogil=True):
33        with cython.gil:
34            s += x * i
35
36    return s
37
38
39@cython.cfunc
40def use_nogil(x, i: cython.int) -> cython.int:
41    cx: cython.int = x
42    with cython.nogil:
43        return cx * i
44
45
46def prange_with_gil_call_nogil(n: cython.int, x):
47    """
48    >>> sum(3*i for i in range(10))
49    135
50    >>> prange_with_gil(10, 3)
51    135
52    """
53    i: cython.int
54    s: cython.int = 0
55
56    for i in prange(n, num_threads=3, nogil=True):
57        with cython.gil:
58            s += use_nogil(x, i)
59
60    return s
61