diff options
Diffstat (limited to 'docs/implementation')
| -rw-r--r-- | docs/implementation/kclaims.html | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/docs/implementation/kclaims.html b/docs/implementation/kclaims.html index 8627b228..837ac1c2 100644 --- a/docs/implementation/kclaims.html +++ b/docs/implementation/kclaims.html @@ -51,16 +51,26 @@ <span class='Number'>0.557255985</span> <span class='Value'>seconds</span> <span class='Value'>time</span> <span class='Value'>elapsed</span> </pre> -<p>Here's the BQN call that builds <a href="https://github.com/dzaima/CBQN">CBQN</a>'s object code sources:</p> +<p>Here are the BQN calls that build <a href="https://github.com/dzaima/CBQN">CBQN</a>'s object code sources, and this website:</p> <pre> <span class='Function'>Performance</span> <span class='Value'>counter</span> <span class='Value'>stats</span> <span class='Value'>for</span> <span class='String'>'</span><span class='Value'>.</span><span class='Function'>/</span><span class='Value'>genRuntime</span> <span class='Function'>/</span><span class='Value'>home</span><span class='Function'>/</span><span class='Value'>marshall</span><span class='Function'>/BQN/</span><span class='String'>'</span><span class='Head'>:</span> - <span class='Number'>241</span><span class='Separator'>,</span><span class='Number'>224</span><span class='Separator'>,</span><span class='Number'>322</span> <span class='Value'>cycles</span><span class='Head'>:</span><span class='Value'>u</span> - <span class='Number'>5</span><span class='Separator'>,</span><span class='Number'>452</span><span class='Separator'>,</span><span class='Number'>372</span> <span class='Value'>icache_16b.ifdata_stall</span><span class='Head'>:</span><span class='Value'>u</span> - <span class='Number'>829</span><span class='Separator'>,</span><span class='Number'>146</span> <span class='Value'>cache</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> - <span class='Number'>6</span><span class='Separator'>,</span><span class='Number'>954</span><span class='Separator'>,</span><span class='Number'>143</span> <span class='Function'>L1-</span><span class='Value'>dcache</span><span class='Function'>-</span><span class='Value'>load</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> - <span class='Number'>1</span><span class='Separator'>,</span><span class='Number'>291</span><span class='Separator'>,</span><span class='Number'>804</span> <span class='Function'>L1-</span><span class='Value'>icache</span><span class='Function'>-</span><span class='Value'>load</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>232</span><span class='Separator'>,</span><span class='Number'>456</span><span class='Separator'>,</span><span class='Number'>331</span> <span class='Value'>cycles</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>4</span><span class='Separator'>,</span><span class='Number'>482</span><span class='Separator'>,</span><span class='Number'>531</span> <span class='Value'>icache_16b.ifdata_stall</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>707</span><span class='Separator'>,</span><span class='Number'>909</span> <span class='Value'>cache</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>5</span><span class='Separator'>,</span><span class='Number'>058</span><span class='Separator'>,</span><span class='Number'>125</span> <span class='Function'>L1-</span><span class='Value'>dcache</span><span class='Function'>-</span><span class='Value'>load</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>1</span><span class='Separator'>,</span><span class='Number'>315</span><span class='Separator'>,</span><span class='Number'>281</span> <span class='Function'>L1-</span><span class='Value'>icache</span><span class='Function'>-</span><span class='Value'>load</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> - <span class='Number'>0.098228740</span> <span class='Value'>seconds</span> <span class='Value'>time</span> <span class='Value'>elapsed</span> + <span class='Number'>0.103811282</span> <span class='Value'>seconds</span> <span class='Value'>time</span> <span class='Value'>elapsed</span> + + <span class='Function'>Performance</span> <span class='Value'>counter</span> <span class='Value'>stats</span> <span class='Value'>for</span> <span class='String'>'</span><span class='Value'>.</span><span class='Function'>/</span><span class='Value'>gendocs</span><span class='String'>'</span><span class='Head'>:</span> + + <span class='Number'>5</span><span class='Separator'>,</span><span class='Number'>633</span><span class='Separator'>,</span><span class='Number'>327</span><span class='Separator'>,</span><span class='Number'>936</span> <span class='Value'>cycles</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>494</span><span class='Separator'>,</span><span class='Number'>293</span><span class='Separator'>,</span><span class='Number'>472</span> <span class='Value'>icache_16b.ifdata_stall</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>8</span><span class='Separator'>,</span><span class='Number'>755</span><span class='Separator'>,</span><span class='Number'>069</span> <span class='Value'>cache</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>37</span><span class='Separator'>,</span><span class='Number'>565</span><span class='Separator'>,</span><span class='Number'>924</span> <span class='Function'>L1-</span><span class='Value'>dcache</span><span class='Function'>-</span><span class='Value'>load</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> + <span class='Number'>265</span><span class='Separator'>,</span><span class='Number'>985</span><span class='Separator'>,</span><span class='Number'>526</span> <span class='Function'>L1-</span><span class='Value'>icache</span><span class='Function'>-</span><span class='Value'>load</span><span class='Function'>-</span><span class='Value'>misses</span><span class='Head'>:</span><span class='Value'>u</span> + + <span class='Number'>2.138414849</span> <span class='Value'>seconds</span> <span class='Value'>time</span> <span class='Value'>elapsed</span> </pre> <p>And the Python-based font tool I use to build <a href="https://mlochbaum.github.io/BQN/fonts.html">font samples</a> for this site:</p> <pre> <span class='Function'>Performance</span> <span class='Value'>counter</span> <span class='Value'>stats</span> <span class='Value'>for</span> <span class='String'>'</span><span class='Value'>pyftsubset</span> <span class='Value'>[…more</span> <span class='Value'>stuff]</span><span class='String'>'</span><span class='Head'>:</span> @@ -74,15 +84,17 @@ <span class='Number'>0.215698059</span> <span class='Value'>seconds</span> <span class='Value'>time</span> <span class='Value'>elapsed</span> </pre> <p>Dividing the stall number by total cycles gives us percentage of program time that can be attributed to L1 instruction misses.</p> -<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=Ikoi4oC/IkJRTiLigL8iUHl0aG9uIiDiiY3LmCAxMDAgw5cgNTbigL81LjTigL8yNSDDtyAxXzQ1N+KAvzI0MeKAvzQ5OQ==">↗️</a><pre> <span class='String'>"J"</span><span class='Ligature'>‿</span><span class='String'>"BQN"</span><span class='Ligature'>‿</span><span class='String'>"Python"</span> <span class='Function'>≍</span><span class='Modifier'>˘</span> <span class='Number'>100</span> <span class='Function'>×</span> <span class='Number'>56</span><span class='Ligature'>‿</span><span class='Number'>5.4</span><span class='Ligature'>‿</span><span class='Number'>25</span> <span class='Function'>÷</span> <span class='Number'>1_457</span><span class='Ligature'>‿</span><span class='Number'>241</span><span class='Ligature'>‿</span><span class='Number'>499</span> +<a class="replLink" title="Open in the REPL" target="_blank" href="https://mlochbaum.github.io/BQN/try.html#code=bCDihpAgIkoi4oC/IkJRTiLigL8iQlFOIuKAvyJQeXRob24iCmwg4omNy5ggMTAwIMOXIDU24oC/NC414oC/NDk04oC/MjUgw7cgMV80NTfigL8yMzLigL81XzYzM+KAvzQ5OQ==">↗️</a><pre> <span class='Value'>l</span> <span class='Gets'>←</span> <span class='String'>"J"</span><span class='Ligature'>‿</span><span class='String'>"BQN"</span><span class='Ligature'>‿</span><span class='String'>"BQN"</span><span class='Ligature'>‿</span><span class='String'>"Python"</span> + <span class='Value'>l</span> <span class='Function'>≍</span><span class='Modifier'>˘</span> <span class='Number'>100</span> <span class='Function'>×</span> <span class='Number'>56</span><span class='Ligature'>‿</span><span class='Number'>4.5</span><span class='Ligature'>‿</span><span class='Number'>494</span><span class='Ligature'>‿</span><span class='Number'>25</span> <span class='Function'>÷</span> <span class='Number'>1_457</span><span class='Ligature'>‿</span><span class='Number'>232</span><span class='Ligature'>‿</span><span class='Number'>5_633</span><span class='Ligature'>‿</span><span class='Number'>499</span> ┌─ ╵ "J" 3.843514070006863 - "BQN" 2.240663900414938 + "BQN" 1.939655172413793 + "BQN" 8.76974968933073 "Python" 5.01002004008016 ┘ </pre> -<p>So, roughly 4%, 2%, and 5%. The cache miss counts are also broadly in line with these numbers. Note that full cache misses are pretty rare, so that most misses just hit L2 or L3 and don't suffer a large penalty. Also note that instruction cache misses are mostly lower than data misses, as expected.</p> -<p>Don't get me wrong, I'd love to improve performance even by 2%. But it's not exactly world domination, is it? And it doesn't matter how cache-friendly K is, that's the absolute limit.</p> +<p>So, roughly 4%, 2 to 9%, and 5%. The cache miss counts are also broadly in line with these numbers. Note that full cache misses are pretty rare, so that most misses just hit L2 or L3 and don't suffer a large penalty. Also note that instruction cache misses are mostly lower than data misses, as expected.</p> +<p>Don't get me wrong, I'd love to improve performance even by 2%. But it's not exactly world domination, is it? The perf results are an upper bound for how much these programs could be sped up with better treatment of the instruction cache. If K is faster by more than that, it's because of other optimizations.</p> <p>For comparison, here's <a href="https://codeberg.org/ngn/k">ngn/k</a> (which does aim for a small executable) running one of its unit tests—test 19 in the a20/ folder, chosen because it's the longest-running of those tests.</p> <pre> <span class='Function'>Performance</span> <span class='Value'>counter</span> <span class='Value'>stats</span> <span class='Value'>for</span> <span class='String'>'</span><span class='Value'>..</span><span class='Function'>/</span><span class='Value'>k</span> <span class='Number'>19</span><span class='Value'>.k</span><span class='String'>'</span><span class='Head'>:</span> @@ -94,4 +106,4 @@ <span class='Number'>1.245378356</span> <span class='Value'>seconds</span> <span class='Value'>time</span> <span class='Value'>elapsed</span> </pre> -<p>The stalls are less than 1% here, so maybe the smaller executable is paying off in some way. I can't be sure, because the programs being run are very different: <code><span class='Number'>19</span><span class='Value'>.k</span></code> is 10 lines while the others are hundreds of lines long. But I don't have a longer K program handy to test with (and you could always argue the result doesn't apply to Whitney's K anyway). Again, it doesn't matter much: the point is that the absolute most the other interpreters could gain from being more L1-friendly is about 5% on those fairly representative programs.</p> +<p>The stalls are less than 1% here, so maybe the smaller executable is paying off in some way. I can't be sure, because the programs being run are very different: <code><span class='Number'>19</span><span class='Value'>.k</span></code> is 10 lines while the others are hundreds of lines long. But I don't have a longer K program handy to test with (and you could always argue the result doesn't apply to Whitney's K anyway). Again, it doesn't matter much: the point is that the absolute most the other interpreters could gain from being more L1-friendly is about 10% on those fairly representative programs.</p> |
