mirror of
https://github.com/exaloop/codon.git
synced 2025-06-03 15:03:52 +08:00
* 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>
63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
"""
|
|
MathWorld: "Hundred-Dollar, Hundred-Digit Challenge Problems", Challenge #3.
|
|
http://mathworld.wolfram.com/Hundred-DollarHundred-DigitChallengeProblems.html
|
|
|
|
The Computer Language Benchmarks Game
|
|
http://benchmarksgame.alioth.debian.org/u64q/spectralnorm-description.html#spectralnorm
|
|
|
|
Contributed by Sebastien Loisel
|
|
Fixed by Isaac Gouy
|
|
Sped up by Josh Goldfoot
|
|
Dirtily sped up by Simon Descarpentries
|
|
Concurrency by Jason Stitt
|
|
Adapted for Codon by @arshajii
|
|
"""
|
|
|
|
from time import time
|
|
|
|
DEFAULT_N = 260
|
|
|
|
def eval_A(i, j):
|
|
return 1.0 / ((i + j) * (i + j + 1) // 2 + i + 1)
|
|
|
|
def eval_times_u(func, u):
|
|
return [func((i, u)) for i in range(len(list(u)))]
|
|
|
|
def part_At_times_u(i_u):
|
|
i, u = i_u
|
|
partial_sum = 0.
|
|
for j, u_j in enumerate(u):
|
|
partial_sum += eval_A(j, i) * u_j
|
|
return partial_sum
|
|
|
|
def part_A_times_u(i_u):
|
|
i, u = i_u
|
|
partial_sum = 0.
|
|
for j, u_j in enumerate(u):
|
|
partial_sum += eval_A(i, j) * u_j
|
|
return partial_sum
|
|
|
|
def eval_AtA_times_u(u):
|
|
return eval_times_u(part_At_times_u, eval_times_u(part_A_times_u, u))
|
|
|
|
def bench_spectral_norm(loops):
|
|
range_it = range(loops)
|
|
total = 0.
|
|
for _ in range_it:
|
|
u = [1.] * DEFAULT_N
|
|
v = None
|
|
for dummy in range(10):
|
|
v = eval_AtA_times_u(u)
|
|
u = eval_AtA_times_u(v)
|
|
vBv = vv = 0.
|
|
for ue, ve in zip(u, v):
|
|
vBv += ue * ve
|
|
vv += ve * ve
|
|
total += vBv + vv
|
|
return total
|
|
|
|
t0 = time()
|
|
print(bench_spectral_norm(100))
|
|
t1 = time()
|
|
print(t1 - t0)
|