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