Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
384 commits
Select commit Hold shift + click to select a range
a2df663
fmt
pavpanchekha Nov 14, 2025
c8c9670
Try with _way_ more enodes
pavpanchekha Nov 18, 2025
3582f56
Make sound-/ rules normal rules
pavpanchekha Nov 18, 2025
2f1c6eb
Stop the silliness
pavpanchekha Nov 20, 2025
67efedb
D'oh!
pavpanchekha Nov 21, 2025
b4136dd
disable egglog
JonasRegehr Nov 21, 2025
4d46e75
Merge branch 'even-more-sound-rules' into grow-libm
JonasRegehr Nov 21, 2025
82ea54e
Add extra lines at end of fpcore
JonasRegehr Nov 21, 2025
1501dc4
Remove unsound from schedule
JonasRegehr Nov 21, 2025
c4d10e6
100k node limit
JonasRegehr Nov 22, 2025
860601a
50 k enodes deduplication
JonasRegehr Nov 22, 2025
596a8f2
150k enodes
JonasRegehr Nov 22, 2025
84cbad2
100k som
JonasRegehr Nov 22, 2025
90f270f
Update nightly.sh
JonasRegehr Nov 22, 2025
23224e0
Delete bench/PROJ directory
JonasRegehr Nov 22, 2025
1827c6d
proj
JonasRegehr Nov 24, 2025
4daa021
oops
JonasRegehr Nov 24, 2025
41ab100
add helmholtz.fpcore
JonasRegehr Jan 11, 2026
5babfad
50k enodes
JonasRegehr Jan 11, 2026
75c8350
Add log1pmd
JonasRegehr Jan 12, 2026
a0de791
Add keplerian.fpcore
JonasRegehr Jan 12, 2026
72fc22c
change fpcore name
JonasRegehr Jan 12, 2026
156144d
New generate candidates strat
JonasRegehr Jan 19, 2026
0167ec7
oops
JonasRegehr Jan 19, 2026
4e1a79c
more changes to generate-candidates
JonasRegehr Jan 19, 2026
2582405
helmholtz
JonasRegehr Jan 20, 2026
13d4b77
keplerian
JonasRegehr Jan 20, 2026
7a36efb
update instructions
JonasRegehr Jan 21, 2026
81bf75b
add longley-rice
JonasRegehr Jan 21, 2026
edb11c2
add orbitalMotion.fpcore
JonasRegehr Jan 23, 2026
1a883d5
log info when generating candidates
JonasRegehr Jan 23, 2026
0db5c19
improve logging
JonasRegehr Jan 23, 2026
1476368
update logging
JonasRegehr Jan 23, 2026
c1772a6
try pushing holes
JonasRegehr Jan 23, 2026
cd54cd3
take cost into account when adding accelerators
JonasRegehr Jan 23, 2026
191948d
move old get-subexprs away
JonasRegehr Jan 23, 2026
86d1aa7
factor cost into selection
JonasRegehr Jan 24, 2026
10d59cf
clean generate-candidates
JonasRegehr Jan 24, 2026
6acc6b0
move grow platform location
JonasRegehr Jan 24, 2026
bb3990c
prevent oom
JonasRegehr Jan 25, 2026
7c75221
run on proj
JonasRegehr Jan 25, 2026
473bbdb
oops
JonasRegehr Jan 25, 2026
f1861a3
helmholtz
JonasRegehr Jan 26, 2026
331d320
keplerian
JonasRegehr Jan 26, 2026
67ea9d1
update report page
JonasRegehr Jan 27, 2026
4bcd1a8
Minor refactor
JonasRegehr Jan 30, 2026
cfa8d84
try implication pass
JonasRegehr Jan 30, 2026
130c4ad
Implication pass working?
JonasRegehr Feb 2, 2026
c0f59db
drop num-points, new get subexprs
JonasRegehr Feb 2, 2026
62d879e
don't show 0 count accelerators
JonasRegehr Feb 2, 2026
b158af3
4k points
JonasRegehr Feb 2, 2026
1219eb6
8k points
JonasRegehr Feb 2, 2026
dcae336
100k nodes
JonasRegehr Feb 2, 2026
9cc466c
old get-subexpres
JonasRegehr Feb 2, 2026
c2cf382
print grow platform
JonasRegehr Feb 2, 2026
d25a3a8
50k nodes
JonasRegehr Feb 2, 2026
71fab07
evaluate keplerian
JonasRegehr Feb 2, 2026
baaa5f2
Merge branch 'main' into grow-libm
JonasRegehr Feb 2, 2026
54034a8
test math
JonasRegehr Feb 2, 2026
04e4ba3
revert unsound rules change
JonasRegehr Feb 2, 2026
feae73f
changes to make main work
JonasRegehr Feb 2, 2026
0d78b75
print sampling error
JonasRegehr Feb 2, 2026
9e0ecd6
orbitalmotion
JonasRegehr Feb 3, 2026
8e021bf
Merge branch 'main' into grow-libm
JonasRegehr Feb 3, 2026
8fa0839
Merge branch 'main' into evaluate-growlibm
JonasRegehr Feb 3, 2026
fc1db7a
file endings
JonasRegehr Feb 3, 2026
8be753b
proj
JonasRegehr Feb 6, 2026
7fe13a6
full herbie
JonasRegehr Feb 7, 2026
d73bb26
better implication pass
JonasRegehr Feb 8, 2026
0ce41ec
accuracy-aware cutting, 2 iters
JonasRegehr Feb 9, 2026
2b36293
log better info
JonasRegehr Feb 9, 2026
233cb3d
push holes exhaustive
JonasRegehr Feb 9, 2026
788b0e5
helmholtz
JonasRegehr Feb 9, 2026
635a991
add new accelerators, move to own file
JonasRegehr Feb 11, 2026
7a75968
add new accelerators
JonasRegehr Feb 16, 2026
d4214ff
update grown platform
JonasRegehr Feb 16, 2026
633e60e
update timing
JonasRegehr Feb 16, 2026
c18943d
tweak makefile for linux
JonasRegehr Feb 16, 2026
4b5d0e4
ignore timing drivers and benchmark
JonasRegehr Feb 16, 2026
72e148c
add new get-subexprs method
JonasRegehr Feb 16, 2026
2c95c8f
just run on vanilla and grow platform
JonasRegehr Feb 16, 2026
49efa6a
parameterize some things, orbital motion
JonasRegehr Feb 16, 2026
36b5ae2
add accelerators to report page
JonasRegehr Feb 16, 2026
e3f7163
new accelerators, orbital motion
JonasRegehr Feb 17, 2026
0b1d78b
add implies function
JonasRegehr Feb 17, 2026
201a960
proj
JonasRegehr Feb 17, 2026
a4625d2
proj
JonasRegehr Feb 17, 2026
4c84c00
fix accelerator compile warning
JonasRegehr Feb 17, 2026
7a8a3b5
keplerian
JonasRegehr Feb 17, 2026
bf1aaa9
oops
JonasRegehr Feb 17, 2026
39704b0
add specific proj platform, bump endoes
JonasRegehr Feb 18, 2026
06ff4b6
rm -rf reports
JonasRegehr Feb 18, 2026
2c95339
report actual counts
JonasRegehr Feb 18, 2026
3d7cad1
32000 enodes
JonasRegehr Feb 18, 2026
10d5fca
basilisk-pform
JonasRegehr Feb 18, 2026
bb3c6d8
track correct accelerators
JonasRegehr Feb 20, 2026
bdc717a
faster powcos
JonasRegehr Feb 20, 2026
2564179
cheap accelerators
JonasRegehr Feb 20, 2026
509b236
Only sample once
JonasRegehr Feb 20, 2026
0e37290
Sample with seed
JonasRegehr Feb 20, 2026
9971013
fix basisilk platform and fpcores
JonasRegehr Feb 20, 2026
ece201e
more enodes, fixed fpcores
JonasRegehr Feb 20, 2026
f12991b
helmholtz
JonasRegehr Feb 21, 2026
2d5ee48
log more data
JonasRegehr Feb 21, 2026
7bec15b
proj
JonasRegehr Feb 21, 2026
c20cd29
add coolprop platform and acceleartor
JonasRegehr Feb 21, 2026
96e648f
evaluate coolprop
JonasRegehr Feb 21, 2026
41f57f1
update gitignore
JonasRegehr Feb 21, 2026
2a56cb5
revert more enodes
JonasRegehr Feb 21, 2026
6036668
add helmholtz.fpcore
JonasRegehr Feb 21, 2026
0f1a39d
fix implication
JonasRegehr Feb 21, 2026
39227f0
Fix deduplication
JonasRegehr Feb 22, 2026
771af8e
cool
JonasRegehr Feb 22, 2026
153acbb
fix counting logic and reorganize a bit
JonasRegehr Feb 22, 2026
19aa26c
scratch
JonasRegehr Feb 22, 2026
13bc7ce
pbrt
JonasRegehr Feb 22, 2026
4249522
Add transport-routines.fpcore
JonasRegehr Feb 23, 2026
f57ac92
Make sure candidates include an interesting op
JonasRegehr Feb 23, 2026
3ef2768
Add table generation code
JonasRegehr Feb 23, 2026
c1d67e9
proj
JonasRegehr Feb 23, 2026
7cad5fe
basilisk
JonasRegehr Feb 23, 2026
90c3e15
Add fixed depth cutting
JonasRegehr Feb 23, 2026
bf45de0
full bench
JonasRegehr Feb 24, 2026
a8f8cfc
actually dump herbie intermediates
JonasRegehr Feb 26, 2026
fa900d6
no cuts
JonasRegehr Feb 26, 2026
d492fb9
small performance fix and fix candidate-expr filter
JonasRegehr Feb 26, 2026
fb1afe4
use egglog
JonasRegehr Feb 27, 2026
6c29060
basilisk
JonasRegehr Feb 27, 2026
e7bd4f6
batch egg calls
JonasRegehr Feb 27, 2026
f719b9f
proj
JonasRegehr Feb 27, 2026
08fc181
up batch size
JonasRegehr Feb 27, 2026
3f3ddc5
min-width not width
JonasRegehr Feb 27, 2026
eca50f1
get rid of ifs again
JonasRegehr Feb 27, 2026
77fb724
improve verdcos
JonasRegehr Feb 28, 2026
7630a60
coolprop
JonasRegehr Feb 28, 2026
1c38fb5
fix egg batching
JonasRegehr Feb 28, 2026
f5236a7
Don't crash from egraph unsoundness, n! alpha-rename
JonasRegehr Feb 28, 2026
7337838
add new coolprop accelerators
JonasRegehr Mar 2, 2026
5e3956d
auto generate plot
JonasRegehr Mar 2, 2026
06e0a90
proj
JonasRegehr Mar 2, 2026
f6e1877
timed costs
JonasRegehr Mar 2, 2026
1ebcfbd
autotuned vanilla
JonasRegehr Mar 3, 2026
1389d70
basilisk
JonasRegehr Mar 3, 2026
089b931
filter 1 count
JonasRegehr Mar 3, 2026
3463b09
try above op cutting
JonasRegehr Mar 4, 2026
15c9d9d
cool prop
JonasRegehr Mar 4, 2026
78cb01f
proj
JonasRegehr Mar 6, 2026
7a0cc3b
call make install and rustup update
JonasRegehr Mar 6, 2026
c642176
top 1k by count/cost
JonasRegehr Mar 6, 2026
32b4734
16000 enodes
JonasRegehr Mar 6, 2026
cf04229
try herbie20 costs
JonasRegehr Mar 6, 2026
dc4eb93
32k enodes
JonasRegehr Mar 6, 2026
f7e640d
coolprop
JonasRegehr Mar 6, 2026
b4052d5
use c tuned numbers
JonasRegehr Mar 6, 2026
38c3fdd
oops
JonasRegehr Mar 6, 2026
6fce220
full tuned costs
JonasRegehr Mar 7, 2026
020e8c6
new tuned costs
JonasRegehr Mar 7, 2026
46a6700
time ops on nightly
JonasRegehr Mar 7, 2026
b9b1493
make driver directory
JonasRegehr Mar 7, 2026
a4a897a
don't suppress error and add -lm
JonasRegehr Mar 7, 2026
eefe056
find accelerator path on linux
JonasRegehr Mar 7, 2026
1498743
lower before sampling
JonasRegehr Mar 7, 2026
9ae2953
timing numbers from nightly
JonasRegehr Mar 7, 2026
e826cf1
Update Makefile
JonasRegehr Mar 7, 2026
a7141c3
basilisk
JonasRegehr Mar 7, 2026
2a5baee
mac tuned
JonasRegehr Mar 8, 2026
76b842c
coolprop
JonasRegehr Mar 8, 2026
e635855
basilisk
JonasRegehr Mar 8, 2026
c6d23ab
update with mac tuned values
JonasRegehr Mar 8, 2026
6dc324a
evaluate coolprop
JonasRegehr Mar 8, 2026
256f0d5
16k enodes
JonasRegehr Mar 8, 2026
1a3ccd7
basilisk
JonasRegehr Mar 8, 2026
7bdfe0e
evaluate all
JonasRegehr Mar 9, 2026
54b1253
mkdir
JonasRegehr Mar 9, 2026
017dbf4
make platform dir
JonasRegehr Mar 9, 2026
f62a15c
add pform to report page
JonasRegehr Mar 10, 2026
f482385
fix seed
JonasRegehr Mar 10, 2026
e4588b6
implication based on wrong bits
JonasRegehr Mar 10, 2026
8dce2b6
use back justified numbers
JonasRegehr Mar 10, 2026
b2d63d0
proj
JonasRegehr Mar 11, 2026
44ce956
Diagnose missing kR phipp term
pavpanchekha Mar 11, 2026
5bdbbdf
just proj
JonasRegehr Mar 11, 2026
94b9e36
don't run scripts
JonasRegehr Mar 12, 2026
5b14d11
evaluate all
JonasRegehr Mar 12, 2026
6530d28
retuned
JonasRegehr Mar 13, 2026
a0536a6
add sinquot
JonasRegehr Mar 13, 2026
818fc26
add new eval scripts and move them
JonasRegehr Mar 13, 2026
b9f311a
timeops and makefile update
JonasRegehr Mar 13, 2026
051c413
Add evaluate-histograms
JonasRegehr Mar 13, 2026
d81e9c5
Faster powcosN, pow1ms
JonasRegehr Mar 16, 2026
5416c22
just basilisk
JonasRegehr Mar 16, 2026
4a357cd
Actually just basilisk
JonasRegehr Mar 16, 2026
1947e6b
dump all final alts
JonasRegehr Mar 16, 2026
5a22f06
faster but less accurate powcosN
JonasRegehr Mar 16, 2026
a402c88
consistant seed
JonasRegehr Mar 16, 2026
be97076
faster powcos
JonasRegehr Mar 16, 2026
1e2deac
full evaluate
JonasRegehr Mar 16, 2026
6beed1a
mathjs
JonasRegehr Mar 16, 2026
7e55331
95% implication
JonasRegehr Mar 16, 2026
3fadd14
output timing numbers
JonasRegehr Mar 16, 2026
32cf0ce
Add has-accelerator to test
JonasRegehr Mar 16, 2026
4d6f655
switch table rows
JonasRegehr Mar 16, 2026
95e977b
proj
JonasRegehr Mar 16, 2026
95e7547
ignore more
JonasRegehr Mar 16, 2026
58ec277
oops wrong path
JonasRegehr Mar 16, 2026
2571cac
timeline
JonasRegehr Mar 17, 2026
ac4155e
get accelerators from test
JonasRegehr Mar 17, 2026
cebe34c
simplify timeline generation
JonasRegehr Mar 17, 2026
3330320
log time after urgency run
JonasRegehr Mar 17, 2026
de74fae
gitignore + formatting
JonasRegehr Mar 17, 2026
13c73db
Cut like the paper
JonasRegehr Mar 17, 2026
4d1fc8e
Update table generation script
JonasRegehr Mar 17, 2026
38c18e3
don't divide
JonasRegehr Mar 17, 2026
a5cca5b
pbrt
JonasRegehr Mar 17, 2026
ca86f04
old cuts
JonasRegehr Mar 17, 2026
5574880
disable proofs
JonasRegehr Mar 17, 2026
783914b
proj
JonasRegehr Mar 17, 2026
4e1f1e4
coolprop
JonasRegehr Mar 17, 2026
616eab0
basilisk
JonasRegehr Mar 17, 2026
3597a5c
coolprop
JonasRegehr Mar 17, 2026
0723faf
no transport routines
JonasRegehr Mar 17, 2026
06cef3e
Merge branch 'main' into grow-libm
JonasRegehr Mar 22, 2026
c12f2fc
Get error using herbie sample
JonasRegehr Mar 22, 2026
684c44a
Update eval scripts
JonasRegehr Mar 30, 2026
61790c4
Merge branch 'main' into evaluate-growlibm
JonasRegehr Mar 30, 2026
2f454e0
Merge branch 'evaluate-growlibm' into grow-libm
JonasRegehr Mar 30, 2026
53eba7c
line endings
JonasRegehr Mar 30, 2026
fb1fe8f
remove wrong proj
JonasRegehr Mar 30, 2026
0f8cee7
Merge branch 'main' into grow-libm
JonasRegehr Apr 22, 2026
ea26a24
misc fixes
JonasRegehr Apr 22, 2026
7459c9b
fix benchmarks for diff
JonasRegehr Apr 22, 2026
c3f1707
line endings
JonasRegehr Apr 22, 2026
35ba6ac
Shrink diff
JonasRegehr Apr 22, 2026
e4853f5
shrink diff
JonasRegehr Apr 22, 2026
8471504
make it run again
JonasRegehr Apr 22, 2026
fbcf4a9
remove has accelerator alt
JonasRegehr Apr 23, 2026
01200b8
use dedup exprs
JonasRegehr Apr 23, 2026
4663fd8
rem make-operator-impl
JonasRegehr Apr 23, 2026
ae93e39
correct proj
JonasRegehr Apr 23, 2026
9ed79f7
pbrt and makefile for cs5110
JonasRegehr Apr 29, 2026
3db06c9
pbrt.fpcore
JonasRegehr Apr 29, 2026
2aac1a5
Merge branch 'main' into grow-libm
JonasRegehr May 11, 2026
582fb76
fix generate-candidates
JonasRegehr May 11, 2026
9bcbbeb
use new platform extension framework
JonasRegehr May 11, 2026
cd2e242
shrink diff
JonasRegehr May 11, 2026
0d84754
shrink diff
JonasRegehr May 11, 2026
93f4f6e
don't need get-sample
JonasRegehr May 11, 2026
6c7ded7
Merge branch 'main' into grow-libm
JonasRegehr May 13, 2026
16e5de3
undo ignore unsupported bench
JonasRegehr May 13, 2026
724b881
fix output
JonasRegehr May 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 55 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
.PHONY: help install egg-herbie nightly index start-server deploy coverage
UNAME_S := $(shell uname -s)
LIB_EXT := so
LIB_FLAGS := -shared -fPIC

ifeq ($(UNAME_S), Darwin)
LIB_EXT := dylib
LIB_FLAGS := -dynamiclib
endif

.PHONY: help install egg-herbie nightly index start-server deploy coverage compile-accelerators time-ops evaluate-proj evaluate-basilisk evaluate-coolprop evaluate generate

help:
@echo "Type 'make install' to install Herbie"
Expand Down Expand Up @@ -46,7 +55,51 @@ minimal-distribution:
[ ! -f herbie ] || (raco distribute herbie-compiled herbie && rm herbie)

nightly:
bash infra/nightly.sh bench reports --threads 2
make generate

generate:
bash growlibm/generate.sh

time-ops:
mkdir -p growlibm/timing/drivers
make compile-accelerators
python3 growlibm/timing/time_ops.py

evaluate:
make evaluate-proj
make evaluate-basilisk
make evaluate-coolprop

evaluate-proj:
bash growlibm/evaluate.sh bench/proj/ reports proj

evaluate-basilisk:
bash growlibm/evaluate.sh bench/orbital-motion.fpcore reports basilisk

evaluate-coolprop:
bash growlibm/evaluate.sh bench/helmholtz.fpcore reports coolprop

compile-accelerators:
clang $(LIB_FLAGS) -O3 -o growlibm/accelerators/libaccelerators.$(LIB_EXT) \
growlibm/accelerators/accelerators.c \
growlibm/accelerators/cosquot.c \
growlibm/accelerators/e_rem_pio2.c \
growlibm/accelerators/powcos.c \
growlibm/accelerators/invgud.c \
-lm

generate-table:
make compile-accelerators
racket growlibm/eval/generate-table.rkt
pandoc growlibm/eval/accelerator-table.tex -o out.html

make-graphs:
python3 growlibm/eval/evaluate-frontier.py reports/proj PROJ --accelerators-only --max-relative-speedup 1.5
python3 growlibm/eval/evaluate-frontier.py reports/basilisk Basilisk --accelerators-only --max-relative-speedup 2.5
python3 growlibm/eval/evaluate-frontier.py reports/coolprop CoolProp --accelerators-only --max-relative-speedup 2
python3 growlibm/eval/evaluate-best-alt-bars.py reports/proj PROJ
python3 growlibm/eval/evaluate-best-alt-bars.py reports/basilisk Basilisk
python3 growlibm/eval/evaluate-best-alt-bars.py reports/coolprop CoolProp

upgrade:
git pull
Expand Down
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
![Herbie](logo.png)
# GROWLIBM

## Install and Running Growlibm
Run `make generate` to install and run growlibm on the PBRT library

## Dependencies
Racket v8.17
rustc 1.91.0
Python 3.14.0

<!-- ![Herbie](logo.png)


Herbie automatically improves the error of floating point expressions.
Expand Down Expand Up @@ -58,4 +68,4 @@ you can see more examples in `bench/`.

Besides `shell`, Herbie has batch the `improve` and `report` commands.
The [documentation](https://herbie.uwplse.org/doc/latest/options.html)
has more details.
has more details. -->
8 changes: 8 additions & 0 deletions growlibm/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
timing/
chassis_tuning/
benchmark
drivers/

libaccelerators.dylib
eval/accelerator-table.tex
accelerators/libaccelerators.dylib
32 changes: 32 additions & 0 deletions growlibm/BenchmarkInstructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
You are tasked with generating new benchmarks for Herbie, a numerical compiler that rewrites floating-point expressions to reduce error.

When you receive a new source file:

1. **Skim for numerically fragile code paths.** Focus on
- Branches guarding against domain violations (division by zero, `fabs` comparisons, overflow checks).
- Expressions wrapped in conditionals, iterative refinements, or polynomial corrections applied only to small ranges.
- Sequences of transcendental functions (`exp`, `asinh`, `atan2`, etc.) composed together.

2. **Score candidate expressions.** Prefer ones that are
- Prone to catastrophic cancellation (differences of comparably sized terms, exponentials combined with reciprocals).
- Already noted as “exact”, “correction”, or “series expansion” code by the source comments.

3. **Isolate the expression.** For each expression:
- Identify the minimal set of variables needed (pull intermediate definitions when helpful).
- Convert to FPCore using lisp syntax.
- Add a `:pre` condition mirroring parameter invarients. Don't worry about adding `:pre` conditions for mathematical domain checks as Herbie's sampler already takes care of this.
- Name the fpcores something reasonable but don't prefix the name with the name of the benchmark file.
- Use `let*` and `let` as needed. Make sure to wrap variable assignment in square brackets in `let` expressions.
- Ensure that `+` and `*` are only used as binary operations.
- Preserve structure instead of using algebraic simplifications.

4. **Validate syntax.** Run

```
racket -y src/main.rkt report --platform vanilla <FPCORE FILE> out
```

Fix any syntax errors Herbie reports (missing parentheses, unsupported identifiers, missing preconditions). Rerun until the file parses cleanly. Warnings about improvement quality are fine; only syntax errors must be resolved. Make sure that the number of FPCores you
add to the file is the same number that appears in the report when you run this command.

Aim for a set of 15–20 expressions that represent the numerical behaviors from the source file. Ideally, this collection will include hard expressions that Herbie has trouble improving.
36 changes: 36 additions & 0 deletions growlibm/accelerator-table.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>growlibm Accelerators</title>
</head>
<body>
<h1>growlibm accelerators</h1>
<table border="1" cellspacing="0" cellpadding="6">
<thead>
<tr>
<th>name</th>
<th>origin</th>
<th>spec</th>
<th>cost</th>
<th>accuracy</th>
<th>cost of spec</th>
<th>accuracy of spec</th>
</tr>
</thead>
<tbody>
<tr><td>cosprod</td><td></td><td><code>(cos (* x y))</code></td><td>12800</td><td>87.99%</td><td>6784</td><td>57.33%</td></tr>
<tr><td>hypot</td><td></td><td><code>(sqrt (+ (* x x) (* y y)))</code></td><td>3200</td><td>99.99%</td><td>1536</td><td>54.45%</td></tr>
<tr><td>invgud</td><td></td><td><code>(log (tan (* (+ (+ x x) (PI)) 1/4)))</code></td><td>25000</td><td>99.87%</td><td>13568</td><td>4.05%</td></tr>
<tr><td>log1pmd</td><td></td><td><code>(log (/ (+ 1 x) (- 1 x)))</code></td><td>3200</td><td>100.00%</td><td>7552</td><td>8.86%</td></tr>
<tr><td>pow1ms</td><td></td><td><code>(pow (* (- 1 x) (- 1 x)) y)</code></td><td>8320</td><td>99.97%</td><td>7232</td><td>73.80%</td></tr>
<tr><td>powcos</td><td></td><td><code>(pow (cos x) y)</code></td><td>64000</td><td>100.00%</td><td>12928</td><td>93.19%</td></tr>
<tr><td>powcos2</td><td></td><td><code>(pow (cos x) 2)</code></td><td>64000</td><td>99.70%</td><td>12928</td><td>99.72%</td></tr>
<tr><td>powcos4</td><td></td><td><code>(pow (cos x) 4)</code></td><td>64000</td><td>99.42%</td><td>12928</td><td>99.38%</td></tr>
<tr><td>powcos6</td><td></td><td><code>(pow (cos x) 6)</code></td><td>64000</td><td>99.08%</td><td>12928</td><td>99.03%</td></tr>
<tr><td>sinprod</td><td>PROJ</td><td><code>(sin (* x y))</code></td><td>12800</td><td>89.11%</td><td>6784</td><td>58.58%</td></tr>
<tr><td>verdcos</td><td></td><td><code>(- (cos (+ x x)) 1)</code></td><td>9600</td><td>99.58%</td><td>6848</td><td>76.48%</td></tr>
</tbody>
</table>
</body>
</html>
68 changes: 68 additions & 0 deletions growlibm/accelerators.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
//clang -dynamiclib -O3 -o libaccelerators.dylib accelerators.c
#include <math.h>
#include <stdio.h>

double sin_xy(double x, double y) {
double p = x * y;
double q = fma(x, y, -p);

double sin_p, cos_p, sin_q, cos_q;
__sincos(p, &sin_p, &cos_p);
__sincos(q, &sin_q, &cos_q);
return fma(sin_p, cos_q, cos_p * sin_q);
}

double cos_xy(double x, double y) {
double p = x * y;
double q = fma(x, y, -p);

double sin_p, cos_p, sin_q, cos_q;
__sincos(p, &sin_p, &cos_p);
__sincos(q, &sin_q, &cos_q);

return fma(cos_p, cos_q, -sin_p * sin_q);
}

double sin_quotient_xy(double x, double y) {
double p = x / y;
double r = fma(-p, y, x);
double q = r / y;

double sin_p, cos_p, sin_q, cos_q;
__sincos(p, &sin_p, &cos_p);
__sincos(q, &sin_q, &cos_q);

return fma(sin_p, cos_q, cos_p * sin_q);
}

double cos_quotient_xy(double x, double y) {
double p = x / y;
double r = fma(-p, y, x);
double q = r / y;

double sin_p, cos_p, sin_q, cos_q;
__sincos(p, &sin_p, &cos_p);
__sincos(q, &sin_q, &cos_q);

return fma(cos_p, cos_q, -sin_p * sin_q);
}

// double approx_sin_xy(double x, double y) {
// double p = x * y;
// double q = fma(x, y, -p);

// double sin_p, cos_p;
// __sincos(p, &sin_p, &cos_p);

// return fma(sin_p, 1, cos_p);
// }

// double approx_cos_xy(double x, double y) {
// double p = x * y;
// double q = fma(x, y, -p);

// double sin_p, cos_p;
// __sincos(p, &sin_p, &cos_p);

// return fma(cos_p, 1, -sin_p);
// }
Loading
Loading