Welcome to the main channel on the development of MoarVM, a virtual machine for NQP and Rakudo (moarvm.org). This channel is being logged for historical purposes.
Set by lizmat on 24 May 2021.
00:02 reportable6 left 00:25 Kaipi joined, Kaiepi left 02:06 frost joined 04:02 notable6 left, releasable6 left, bisectable6 left, sourceable6 left, evalable6 left, linkable6 left, shareable6 left, quotable6 left, benchable6 left, committable6 left, unicodable6 left, greppable6 left, tellable6 left, coverable6 left, nativecallable6 left, bloatable6 left 04:03 statisfiable6 left, releasable6 joined, bloatable6 joined, committable6 joined 04:04 statisfiable6 joined, notable6 joined, shareable6 joined, greppable6 joined, coverable6 joined 04:05 sourceable6 joined, benchable6 joined, evalable6 joined 04:06 nativecallable6 joined 04:39 squashable6 joined 05:10 lizmat left, Voldenet left 05:11 Voldenet joined, lizmat joined 05:13 camelia left, nine left, nine joined 05:25 bisectable6 joined 06:05 reportable6 joined 06:12 linkable6 joined, unicodable6 joined 07:10 tellable6 joined
Nicholas good *able6, #moarvm 07:25
MasterDuke i spun up my win10 vm last night to track down the (hopefully final) windows bug in my gmp branch. but then i realized it was late on a sunday and i didn't really want to do debugging on windows. so i killed virtual mechanical dinosaurs instead 07:51
07:54 lizmat left, lizmat joined 07:57 patrickb joined
patrickb MasterDuke++ # being reasonable by keeping things -Ofun 07:59
nine MasterDuke: virtual mechanical dinosaurs? Ha! Same here :) 08:25
MasterDuke nine: also playing horizon zero dawn? or has the next one been released already? 08:34
08:36 brrt joined
brrt \o 08:37
Nicholas o/
MasterDuke brrt: while you're here. is there a way to invert the result of a function call in the lego jit? it's easy in the template jit, but i don't know how to do it in src/jit/graph.c 08:39
nine MasterDuke: Yes, currently in my first New Game+ 08:41
MasterDuke ah, nice. this is my first time playing it (i've gotten years behind in my games) 08:42
patrickb Just noticed that moarvm.org/roadmap.html and moarvm.org/features.html are largely out of date. 08:44
moarvm.org/contributing.html still has freenode on it 08:46
brrt MasterDuke: I thought there was a way but I don't recall 08:47
MasterDuke k. it's easy enough to add an argument to just flip the return value 08:48
brrt there isn't, yet.
but, there is `MVMJitRvMode` which will allow you to add stuff
Nicholas patrickb: I think it's possible to make PRs against github.com/MoarVM/moarvm.org/ 08:49
MasterDuke i meant it's easy in this case to add an argument to the function i'd be calling. but interesting, i hadn't thought about a new MVMJitRVMode... 08:53
patrickb Nicholas: I thought about creating a PR, but figured, that especially for the roadmap and features pages I don't have a broad and deep enough insight into the current state of things and where potential for improvement is / what the plans are to make a decent update.
Nicholas makes sense. 08:54
brrt that's what we use MVMJitRvMode for, also for dereference and stuff
Nicholas I should add that I have no idea how things get from that repository to deployment and publication
10:07 brrt left 10:18 frost left
jnthnwrthngtn Any commits to the master branch will be automatically deployed in 10-15 minutes 10:25
(for moarvm.org, that is)
10:34 quotable6 joined
Geth MoarVM: 2f5c21fb65 | (Nicholas Clark)++ | src/core/str_hash_table.c
Fix another bug in MVM_str_hash_fsck().

Calling `MVM_str_hash_entries` when just the control structure was allocated
  (the empty hash optimisation) would trigger an assertion failure.
We need to check `control->cur_items` and `control->max_items` explicitly. It also makes sense to check for `control` being NULL and handling that case
  (instead of segfaulting).
10:58 brrt joined 11:32 brrt left 12:03 reportable6 left 12:04 reportable6 joined 13:10 Kaipi left, Kaiepi joined
lizmat and yet another Rakudo Weekly News hits the Net: rakudoweekly.blog/2021/07/26/2021-...in-summer/ 13:27
jnthnwrthngtn lizmat++ 13:37
lizmat: I guess "branche" is a typo
nine lizmat: dogbert17++ has helped a lot with new-disp as well by finding reproducible ways to provoke the segfaults I then fixed 13:40
lizmat jnthnwrthngtn: indeed, fixed :-) 13:41
added dogbert17++ 13:42
nine lizmat++
jnthnwrthngtn Turns out that I left the commit where I was going to debug the SSA version splitting thing at home. No matter; support for `callwith`/`nextwith` also needs doing :) 13:44
Altai-man jnthnwrthngtn, gods bless you. 13:52
dogbert17 hooray, I'm a celebrity :) 14:01
sometimes I get spurious test fails with the message 'No subtests run'. When I rerun the test everything is ok. 14:20
but this time I got a coredump 14:21
nine, timo: is it possible to extract anything of interest from this: gist.github.com/dogbert17/0825eaf6...0f8604eb65 14:25
jnthnwrthngtn dogbert17: That'd imply spesh_cand is somehow bogus; no idea how 14:26
It could be unlucky timing
dogbert17 it *feels* timing related 14:27
jnthnwrthngtn Hm, my first idea doesn't quite make sense
dogbert17 darn
jnthnwrthngtn I wondered if it was because we didn't initilize ->spesh_cand to NULL before doing the logging, so it'd be a bogus pointer when we walk the callstack 14:28
MasterDuke that's on new-disp?
jnthnwrthngtn But no, I can see the nulling right above it
MasterDuke: Must be, since MVM_frame_dispatch is in the stacktrace and that doesn't exist on master :)
MasterDuke heh. hard to argue with that logic 14:29
dogbert17 I guess I'll have to run with --no-optimize for a while hoping that the problem returns 14:36
jnthnwrthngtn m: say 1325 / 1349 14:43
evalable6 0.982209 14:44
dogbert17 passing tests?
jnthnwrthngtn Yeah, +4 higher than the best number I've seen so far, but we're gradually losing more due to missing fixes from `master`, so I think the work I just did for `callwith` on methods got us 6 new fully passing test files 14:45
dogbert17 that's really cool. Are you considering a rebase? 14:46
jnthnwrthngtn Sometime later this week. 14:47
They're a little inconvenient for everyone working on the new-disp branches
dogbert17 so how many tests are left if we ignore master
jnthnwrthngtn Don't know exactly, but I think less than 20 14:50
jnthnwrthngtn gets more tea and then has a go at making callwith work with the wrap dispatcher 14:51
15:05 patrickb left 15:24 patrickb joined
jnthnwrthngtn Hurrah, now all but 1 of the wrap tests passes 16:04
The failing one being thanks to the wrong exception type when there's no resumable dispatch in scope. 16:05
MasterDuke jnthnwrthngtn: are is(true|false)_s going to become dispatchers? 16:09
jnthnwrthngtn No 16:11
There's nothing to dispatch
They work on a str register
And always do the same thing 16:12
[Coke] moarvm.org - don't think the source for this is in a repo...
... dammit, didn't review! :)
MasterDuke oh. right. timo mentioned that earlier. everyone forget i asked that question (again)...
Nicholas [Coke]: has the tide in your coffee cup gone out? 16:13
[Coke] Nicholas: well, I didn't try to add the gatorade powder to the coffee today, so I guess I'm doing better.
Nicholas :-) 16:14
[Coke] afks to do some errands.
jnthnwrthngtn Quite a lot of new passing tests with wrap callwith fixed up, alas no new entirely passing test files to add to the tally.
Altai-man [Coke], what's wrong with moarvm.org? 16:22
jnthnwrthngtn Altai-man: It was mentioned in backlog that it still mentions freednode 16:23
Altai-man jnthnwrthngtn, ah, on the contributing page, alright. I thought I screwed something up with a release.
jnthnwrthngtn No :)
Altai-man btw, no https is apparently a point of annoyance for it as well. :( 16:24
jnthnwrthngtn moarvm.org/ # works fine? 16:32
Altai-man ah, you're right 16:33
Geth MoarVM/new-disp: df38d6b7fa | (Jonathan Worthington)++ | 3 files
Allow configurable "no resumption in scope" error
jnthnwrthngtn m: say 1328 / 1349 17:23
evalable6 0.984433
jnthnwrthngtn Home time o/ 17:24
Altai-man maybe it's time for a blin run 17:27
17:31 brrt joined
MasterDuke this is backwards progress. i jitted is(true|false)_s and got my test runtime to increase from 0.37s to 0.43s 17:38
brrt oops.... 17:50
MasterDuke anyone see anything terribly wrong about gist.github.com/MasterDuke17/87042...659d8d216f ? 17:53
my test case is `my int $a := 0; my $b; my int $s := nqp::time; my str $si := ~$s; while $a < 100_000_000 { if $si eq "" { $b := 3 } else { $b := 5 }; ++$a }; say(nqp::time - $s); say($b)` in nqp 17:54
nqp: my int $a := 0; my $b; my int $s := nqp::time; my str $si := ~$s; while $a < 10_000_000 { if $si eq "" { $b := 3 } else { $b := 5 }; ++$a }; say(nqp::time - $s); say($b) 17:58
oh, camelia is down
nine: ^^^
but wow. that version above take ~0.37s locally. if the loop body is instead `$b := $s eq "" ?? 3 !! 5;` it takes ~5.8s 18:00
18:02 reportable6 left 18:05 reportable6 joined
MasterDuke each version only has 14 frames. but the if does no garbage collections and the ternary version does 1144 gcs. 100% of the extra time is spent in gc 18:05
nine So what's the ternary version allocating? 18:18
MasterDuke VMString
100000004 of them vs 6 18:19
nine Wait a minuge. In one it's $si eq "" in the other it's $s eq "" 18:23
MasterDuke they have different --target=optimize, but each version is essentially the same as their body. if, condition, bind, value, bind, value vs bind, if, condition value, value
doh 18:24
now ternary is only ~0.04s slower 18:25
nine ha 18:26
MasterDuke profiles look identical, except ternary is slower, but no obvious reason why 18:27
nine what's the margin of error?
MasterDuke don't know exactly. results are relatively consistent 18:28
fastest ternary was 0.410s, slowest if was 0.379 18:29
over ~10 runs of each
same with MVM_SPESH_BLOCKING=1 18:32
seems like the difference is probably still there with spesh disabled 18:35
18:43 camelia joined
nine m: say "glad to be back" 18:43
camelia glad to be back
MasterDuke nqp: my int $a := 0; my $b; my int $s := nqp::time; my str $si := ~$s; while $a < 100_000_000 { $b := $si eq "" ?? 3 !! 5; ++$a }; say(nqp::time - $s); say($b) 18:45
camelia 382541405
MasterDuke nqp: my int $a := 0; my $b; my int $s := nqp::time; my str $si := ~$s; while $a < 100_000_000 { if $si eq "" { $b := 3 } else { $b := 5 }; ++$a }; say(nqp::time - $s); say($b)
camelia 346955696
nine nqp: my int $a := 0; my $b; my int $s := nqp::time; my str $si := ~$s; my $three := 3; my $five := 5; while $a < 10_000_000 { $b := $si eq "" ?? $three !! $five; ++$a }; say(nqp::time - $s); say($b) 18:58
camelia 31529592
nine nqp: my int $a := 0; my int $b; my int $s := nqp::time; my str $si := ~$s; while $a < 10_000_000 { $b := $si eq "" ?? 3 !! 5; ++$a }; say(nqp::time - $s); say($b) 18:59
camelia 36367617
nine nqp: my int $a := 0; my int $b; my int $s := nqp::time; my str $si := ~$s; while $a < 10_000_000 { $b := $si eq "" ?? 3 !! 5; ++$a }; say(nqp::time - $s); say($b)
camelia 39076562
MasterDuke both are a little bit faster with the $three/$five, but the difference between the two remains (locally) 19:00
19:07 brrt left
MasterDuke perf shows ~%22 spent in MVM_coerce_istrue_s in the fastest version, but yeah, my jitting makes it worse (i assume it's not the jits fault, but the added branch in MVM_coerce_istrue_s 19:09
nine Well it comes down to a single set instruction that makes the difference. The ternary version actually writes the result into a temporary register in the branches and at the end writes from the temporary to the target register. The if/else version writes to the target directly.
MasterDuke nice find. is the temp reg use in the ternary version necessary? 19:10
nine Not even spesh can eliminate this additional set, because we cross a PHI boundary
MasterDuke huh. i've always thought of ternary as same-to-faster than if/else 19:11
nine Well...obviously no, because there's an equivalent version that gets by without it. But, writing a code generator that pulls this off might be a bit tricky
It looks easy in a case like $a := $cond ?? $b !! $c; But ternaries are not just used in assignments. For something like foo($cond ?? $a !! $b) you very much need that register for the result. 19:14
nqp: my int $a := 0; my int $b; my int $s := nqp::time; my str $si := ~$s; while $a < 10_000_000 { $si eq "" ?? ($b := 3) !! ($b := 5); ++$a }; say(nqp::time - $s); say($b) 19:17
camelia 35218600
nine This compiles to exactly the same as the if/else version
MasterDuke well, i guess if it's any consolation, both nqp and rakudo have only a couple lines that match `git grep -P '^\s*\$\w+ := .*\?\?'` 19:20
which actually kind of surprises me 19:21
oh, a few more if you use \S+ instead of \w+ 19:22
and a lot of other are broken up over multiple lines and won't match that regex 19:24
[Coke] Didn't lizmat do a bunch of work to replace unoptimized raku/nqp code with more optimized nqp calls? wouldn't surprise me if that's why 19:25
... also I wonder if once new-disp hits if we can consider unrolling some of that.
MasterDuke `git grep -P -P '^\s*[$@%]\S+\s+:= .*\?\?'` finds some more 19:27
i also find it crazy that literal numbers in nqp are slower than binding a variable to the number and then using the variable. how difficult would that be to optimize? 19:33
nine Well the $foo := $cond ?? $a !! $b pattern does lend itself well to static optimization. 19:42
The issue with the literal numbers is that they will get boxed for every loop iteration, while my version with $three and $five pulls that boxing out of the loop. 19:43
The my int $b; version of course doesn't have the boxing overhead in the first place 19:44
MasterDuke hm, right 19:46
lizmat so: $foo := $cond ?? a !! b is bad ?? 19:55
MasterDuke it's a tiny bit slower than $cond ?? ($foo := a) !! ($foo := b) 19:59
i wouldn't go about mass re-writing any of nqp/rakudo yet 20:03
nine It's really very tiny bit slower 20:05
lizmat but isn't that more bytecode, and thus less likely to inline?
nine by about one instruction in the loop 20:06
timo i'm thinking since the exprjit currently doesn't cross bb boundaries, we're leaving a little on the table in terms of performance when emitting the actual assembly code 20:13
[Coke] (rewrite) no, not without a clear advantage, agreed.
timo nine: when you say that one set tthat we can't eliminate crosses a phi boundary, can we perhaps change what writes to that register to write to the register that set writes to? 20:14
nine Well it's certainly possible, since there is the equivalent version that gets by without the temp register. Getting it right may just be tricky. 20:16
20:21 linkable6 left, evalable6 left
timo here's an idea, put the ++$a in front, before the ??!! 20:24
don't think it'll actually do a lot 20:25
but it'd put the add operation into the first block's exprjit tree
MasterDuke oh wow, that is a bunch faster 20:26
nqp: my int $a := 0; my int $b := 0; my int $s := nqp::time; while $a < 1_000_000_000 { $b := $a < 100 ?? 3 !! 4; ++$a; }; say(nqp::time - $s); say($b) 20:27
camelia 1639696338
MasterDuke nqp: my int $a := 0; my int $b := 0; my int $s := nqp::time; while $a < 1_000_000_000 { ++$a; $b := $a < 100 ?? 3 !! 4; }; say(nqp::time - $s); say($b)
camelia 1421361707
MasterDuke i get about the same results locally with MVM_SPESH_BLOCKING=1 20:28
nqp: my int $a := 0; my int $b := 0; my int $s := nqp::time; while $a < 1_000_000_000 { ++$a; $a < 100 ?? ($b := 3) !! ($b := 4); }; say(nqp::time - $s); say($b) 20:29
camelia 1651706311
MasterDuke now that version is slower
timo so just noise?
MasterDuke yes. no. dunno 20:30
maybe we'd need to look at more realistic code to see the difference
optimizing/benchmarking is hard, i'm going to go kill some more virtual mechanical dinosaurs 20:31
20:35 patrickb left
timo good choice 20:37
21:23 linkable6 joined 22:23 evalable6 joined
jnthnwrthngtn m: say 1330 / 1349 22:29
camelia 0.985915
jnthnwrthngtn 3 more from callwith/nextwith support for multi dispatch
ah, sorry, 2 more 22:30