1
0
mirror of https://github.com/exaloop/codon.git synced 2025-06-03 15:03:52 +08:00
codon/test/core/pipeline.codon
A. R. Shajii e1016f9e9a
Upgrade to LLVM 15 (#56)
* Upgrade to LLVM 15 (WIP)

* Call `setPresplitCoroutine()` on coro LLVM funcs

* Use new pass manager

* Update deps

* Update docs

* Fix exceptions on M1

* Add libunwind

* Use Orc and JITLink for "codon run"

* JITLink integration

* Fix callback

* Fix strbuf, fix GC root registration

* Fix test init

* Fix llvm function

* Fix pickle, float atomics

* Add TargetLibraryAnalysis

* Use new LLVM pass manager in GPU codegen

* Fix libunwind linking

* Fix libunwind

* Fix GPU passes

* Don't link libunwind explicitly

* Bump version

* Update plugins for new pass manager

* Fix bash error

* Fix GPU GV extraction

* Move simd module to experimental folder

* Update file read

* Add benchmark programs

* Add dynamic tuple

* Fix parser tuple slicing bug

* Make DynamicTuple interoperable with Tuple

* Fix DynamicTuple GPU interop

* Dockerize builds

* Simplify CMake

* Revert "Simplify CMake"

This reverts commit 08d2920349b5033750b54b4fb7aaa9bac264b750.

Co-authored-by: Ibrahim Numanagić <ibrahimpasa@gmail.com>
2022-10-14 09:31:10 -04:00

101 lines
1.6 KiB
Python

from threading import Lock, RLock
n = 0
f = 0.0
g = f32(0.0)
@atomic
def inc(_):
global n, f, g
n += 1
f += 1.0
g += f32(1.0)
return 0
@atomic
def dec(_):
global n, f, g
n -= 1
f -= 1.0
g -= f32(1.0)
return 0
lock = Lock()
def inc_lock(_):
global n
with lock:
n += 1
return 0
def dec_lock(_):
global n
with lock:
n -= 1
return 0
rlock = RLock()
def inc_rlock(_):
global n
with rlock:
n += 1
return 0
def dec_rlock(_):
global n
with rlock:
n -= 1
return 0
def foo(_):
yield 0
@test
def test_parallel_pipe(m: int):
global n, f
n, f = 0, 0.0
range(m) |> iter ||> inc
assert n == m
assert f == float(m)
assert g == f32(m)
range(m) |> iter ||> dec
assert n == 0
assert f == 0.0
assert g == f32(0.0)
range(m) |> iter ||> inc |> dec
assert n == 0
assert f == 0.0
assert g == f32(0.0)
n = 0
range(m) |> iter ||> inc_lock
assert n == m
range(m) |> iter ||> dec_lock
assert n == 0
range(m) |> iter ||> inc_lock |> dec_lock
assert n == 0
n = 0
range(m) |> iter ||> inc_rlock
assert n == m
range(m) |> iter ||> dec_rlock
assert n == 0
range(m) |> iter ||> inc_rlock |> dec_rlock
assert n == 0
@test
def test_nested_parallel_pipe(m: int):
global n
n = 0
range(m) |> iter ||> inc |> foo ||> dec
assert n == 0
test_parallel_pipe(0)
test_parallel_pipe(1)
test_parallel_pipe(10)
test_parallel_pipe(10000)
test_nested_parallel_pipe(0)
test_nested_parallel_pipe(1)
test_nested_parallel_pipe(10)
test_nested_parallel_pipe(10000)