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:05 reportable6 joined 00:35 evalable6 joined 01:36 linkable6 joined 04:38 evalable6 left, linkable6 left 04:40 evalable6 joined
Nicholas #moarvm *, good 05:25
05:40 evalable6 left 06:02 reportable6 left 06:04 reportable6 joined 06:41 Altai-man left, linkable6 joined 06:42 sena_kun joined 06:43 evalable6 joined 07:13 moon-child left, moon-child joined
Nicholas was it something I said? :-) 07:21
07:23 MasterDuke left 07:28 MasterDuke joined
nine good, good, #moarvm 07:43
MasterDuke #moarvm good, coffee good, t/02-rakudo/15-gh_1202.t segfaults bad 07:46
Nicholas so that bug was rather hard to figure out. In future, can we stick to creating easy bugs please? Thanks in advance :-) 07:47
*I* thought that jnthnwrthngtn had some idea about causes of (at least one class of) bugs in t/02-rakudo/15-gh_1202.t and that something big blocked fixing cleanly. But I forget whether that was new-disp, Raku-AST, $other, or "I'm confused and it wasn't" 07:48
nine MasterDuke: is there something special required to reproduce that segfault?
MasterDuke you'd have to ask dogbert17. i tried running a stripped down t/02-rakudo/15-gh_1202.t, but never got a segv. maybe i'd taken too much out 07:49
but i've seen tens of times now in the CI runs for my prs 07:50
nine 15-gh_1202.t has always been troublesome on s390
MasterDuke timo was chatting with dogbert17 about it recently, don't remember if you were in that conversation
colabti.org/irclogger/irclogger_lo...10-03#l112 07:51
i very rarely hit it locally 07:52
08:08 MasterDuke left 08:12 TempIRCLogger__ left, Nicholas left 08:21 MasterDuke joined
MasterDuke i've also seen a couple random fails due to t/02-rakudo/reproducible-builds.t 08:21
08:24 TempIRCLogger__ joined, Nicholas joined 08:48 ggoebel left
jnthnwrthngtn moarning o/ 09:24
tellable6 2021-10-04T18:10:00Z #moarvm <vrurg_> jnthnwrthngtn Is there any reason to have a unique per-compunit GLOBAL at compile time and only install the primary one for run-time? I think we have an error caused by this design.
Nicholas \o 09:25
jnthnwrthngtn: it compiles [the setting] - ship it!
jnthnwrthngtn Goodness folks typed a lot here while I was having a long weekend away...
Nicholas a fun trip? 09:26
jnthnwrthngtn .tell vrurg It's about separate compilation; the compilation of a module should start with an empty GLOBAL and accumulate the things that are `use`d by it. 09:27
tellable6 jnthnwrthngtn, I'll pass your message to vrurg
nine jnthnwrthngtn: sorry, didn't know we should take a break :)
jnthnwrthngtn Nicholas: "it compiles" - on little endian? 09:28
Nicholas: Yes, there was good food and good beer and some nice places to walk around. :) 09:29
Nicholas both!
jnthnwrthngtn Oh, wait, big endian is the one it was busted on... :)
I guess this coffee isn't working yet.
Nicholas (we don't talk about mixed endian)(we don't need to. UV doesn't do PDP-whatever-it-was)
jnthnwrthngtn Gah, you beat me to "only both" :P 09:30
Nicholas actually, also, I have no idea if anyone has produced a C compiler for the crazy legacy things that defines an ordering in memory for 64 bit integers
nine jnthnwrthngtn: Is this a sensible approach? github.com/rakudo/rakudo/compare/n...nativecall Now working on that foreign-func dispatch terminal 09:32
jnthnwrthngtn Looking at github.com/MoarVM/MoarVM/pull/1557, 1) sorry, I can't count, 2) maybe we should get update_ops.raku to spit out constants for op length and use them in the interpreter.
MasterDuke something like `cur_op += MVM_OP_LENGTH_decont`? 09:34
jnthnwrthngtn nine: Hmm. That CUSTOM-DISPATCHER thing probably works although I note that means you can never .wrap a native routine
MasterDuke: Something like
nine: Though maybe that's "no, we don't support that" :) 09:35
nine jnthnwrthngtn: it does work. But yes, that wrapping issue is a drawback
jnthnwrthngtn Well, I mean "works as a design", it looked like it'd work as in actually function
nine Ok. Well, it's my first idea for a hook for custom dispatchers 09:36
jnthnwrthngtn An alternative idea I had was a registry of role + dispatcher name, and if there are entries in that registry, before going down the raku-invoke path for a Routine, we'd see if one of those roles is done, and if so use the alternative dispatcher.
(That is, we'd end up in raku-invoke, and this would be a final thing before we do the default thing of "extract $!do and invoke it" 09:37
That'd mean we're already past the wrapping, multis, etc.
Nicholas jnthnwrthngtn: I wasn't sure if it was worth updating all the things to also generate constants for op size and then churning all the C code. 09:38
jnthnwrthngtn Yeah, it's quite the churn
nine I could also shuffle around the code a bit to achieve the same with CUSTOM-DISPATCHER. I used that for wrap because it nicely demonstrates the capability and to make it performance neutral with what we had
Nicholas it takes quite a lot of unfortunate circumstances simultaneously to manage to get it wrong, but not have immediate catastrophic failure 09:39
dogbert17 jnthnwrthngtn: github.com/rakudo/rakudo/issues/4548 might be of interest after your coffee has started to take effect
jnthnwrthngtn Nicholas: Fair.
nine If we wanted wrappable native routines, all I have to do is bring the special casing of WRAPPERS back to the dispatchers
jnthnwrthngtn nine: I think this extension point should be looked for in raku-invoke, not in raku-call and several other places 09:40
nine Should .wrap still use the extension point or should I just revert that part? 09:41
jnthnwrthngtn It can be a method, I just kinda wanted to keep stuff specific to dispatchers out of userspace
I'd keep it distinct from .wrap handling
nine k
jnthnwrthngtn We've already had situations in the past where folks grumbled that, for example, multi dispatch didn't properly compose with native calls 09:42
Probably we shouldn't create the same limitation on wrappers
(I think the multi case is all fixed up now, though)
MasterDuke re churn, --ignore-rev (or the file of commits to ignore) introduced in git 2.23 could be useful 09:43
jnthnwrthngtn Nicholas: So, the endian stuff is fixed enough I probably don't need to follow it too closely when reading up on things, or there's still outstanding issues there? 09:45
Nicholas it's fixed.
you can enjoy the chaos, without needing to think to hard about the details 09:46
too hard
09:48 linkable6 left, evalable6 left
MasterDuke interesting, github.com/MoarVM/MoarVM/pull/1555...85ec768341 reliably succeeds on linux/mac, but reliably dies in stage parse on windows with `NMAKE : fatal error U1077: 'C:\Strawberry\perl\bin\perl.exe' : return code '0xff'` 10:09
i hoped github.com/MoarVM/MoarVM/pull/1555...09dda2651d would fix it, but nope 10:10
jnthnwrthngtn github.com/rakudo/rakudo/issues/4549 is rather odd 10:15
"failed to load library 'dynext\perl6_ops_moar.dll'"
MasterDuke and it doesn't happen in our CI jobs 10:16
nine Yeah, I suspect a local issue 10:17
dogbert17 nine: I haven't found a good way to repro the SEGV, the best I have is: 'while MVM_SPESH_NODELAY=1 ./rakudo-m -Ilib t/02-rakudo/15-gh_1202.t; do :; done'
nine dogbert17: k
dogbert17 it tends to fail after 10-20 iterations
worse is the fact that running this test under rakudo-gdb-m leads to a hang on my machine (deadlock ?) 10:19
nine jnthnwrthngtn: putting the CUSTOM-DISPATCHER check in raku-invoke has a bit of a downside as well: one can then not just delegate to raku-invoke to actually invoke the original body 10:24
Of course it's not impossible. But a bit inconvenient and takes a little more dibbing into internals 10:25
I guess that's worth being able to wrap native routines though. I can easily see a use for that. 10:26
jnthnwrthngtn nine: Hm, would we want to invoke the original body? Not in the NativeCall case at least... 10:28
nine: But if you have the $!do then it's a case of feeding it to boot-code, so maybe not a huge pain.
nine Certainly not for NativeCall. But since it's a generic hook, I can see cases where one would just mangle the arguments a bit. Or only redirect dispatch in some cases but not in all of them. 10:29
But yes, it's an inconvenience but not a blocker.
jnthnwrthngtn We could in principle insert yet another layer, but while that'd have no impact once the dispatch program is recorded, it would have one on callsite setup time, which is worth some consideration. 10:32
(Since we've already regressed startup time an amount) 10:33
dogbert17: The coffee apparently sufficed for #4548. :)
nine That's why I figured using the generic hook for wrappers would be a good idea, since the number of checks we do for an unwrapped case would have been exactly the same 10:34
But then I'll leave it up to MoarVM hackers to make it fast anyway :D 10:35
Wait.....that'd be us again
MasterDuke jnthnwrthngtn: fyi, new-disp broke the rakudo jvm build. part of it was figured out (removed some nqp::getcoderef's to follow a change to the moarvm specific code), but it currently dies trying to do some role mixin
bartolin said he'd try and fix it 10:36
jnthnwrthngtn MasterDuke: Argh, so I busted that too. :( Sorry. 10:37
dogbert17++ for digging up lots of older issues that are fixed by new-disp 10:41
MasterDuke no worries (and further fyi, the part that was figured out hasn't been committed, because i wasn't 100% sure it was correct)
nine jnthnwrthngtn: pushed an updated commit implementing what we discussed 10:44
jnthnwrthngtn Thanks, I'll take a look after lunch 11:01
dogbert17 jnthnwrthngtn++: coffee for the win :) 11:06
nine: did you see gist.github.com/dogbert17/a07d0bb2...66c9d6dc8c 11:07
nine dogbert17: seen it. Trying to reproduce. But I'm tempted to leave it for when I'm back home. The factor 8 difference in processing power between my laptop and desktop does make a noticable difference in fun investigating such issues 11:22
MasterDuke nine: you still have a bunch of tabs in that commit, down to ~line 680 11:33
nine Oh, indeed. Must have turned off paste mode too late or something 11:40
Pushed yet again 11:41
jnthnwrthngtn: your new NativeCall tests seem to fail on s390x: build.opensuse.org/public/build/ho...akudo/_log 11:44
Native callback must be a code handle 11:45
11:58 Xliff joined
Xliff Hello, #moarvm 11:58
12:02 reportable6 left 12:03 reportable6 joined
jnthnwrthngtn nine: huh, that's odd 12:03
nine: On that platform is it using libffi rather than dyncall? 12:06
Geth MoarVM: e28e06ded2 | (Jonathan Worthington)++ | src/core/nativecall_libffi.c
Correct libffi/dyncall discrepancy
jnthnwrthngtn Hopefully that will do it
MasterDuke nine: the build log seems to show it's using an old nqp and moar for the build
[ 79s] ===/usr/bin/nqp-m version 2021.09 is outdated, 2021.09-125-g6add04b expected. 12:10
[ 79s] ===
[ 79s] Using /usr/bin/nqp-m (version 2021.09 / MoarVM 2021.09).
nine MasterDuke: I noticed. But if it were that old, everything would fail because of missing nqp::dispatch 12:12
So I figure that's a bogus message
MasterDuke right 12:13
nine I think I have all the code together for a boot-foreign-code dispatch terminal which ends up calling MVM_nativecall_invoke. Now to wire it up at the higher level and see how it explodes 12:21
jnthnwrthngtn nine++ 12:26
nine: At github.com/rakudo/rakudo/compare/n...6R271-R275 it's assumed that the thing being invoked is a always constant at that callsite, but that may not actually be the case; in principle one could do `my &callee = $foo ?? &one-native-sub !! &another-native-sub; callee(42)`. 12:35
nine jnthnwrthngtn: but callee is already tracked? If we end up calling a different native sub, shouldn't that guard trigger? 12:42
Xliff dir 12:43
12:49 Xliff left 12:50 evalable6 joined 12:51 linkable6 joined
ugexe . .. illegal_files Documents 12:54
jnthnwrthngtn nine: I believe its type is tracked, but I don't see any literal guard being established. 13:03
13:05 ggoebel joined
jnthnwrthngtn See at github.com/rakudo/rakudo/blob/mast....nqp#L2467 for how we branch over the two situations as an optimization 13:05
(Thus telling the runtime that if the Code object is a constant then we can assume the $!do is a constant, but otherwise we can't assume that and have to track and use the $!do) 13:06
For the native call case, we can in the constant case further assume that the native call is already set up, but should probably guard against that in the non-constant case 13:07
(By checking some attribute that will be unset if it's not setup for example)
nine ok
[Coke] anyone see anything wrong with this dumb batch file? gist.github.com/coke/d3ef45869600e...bd9325ac0d 13:10
Trying to do separate builds into a specific dir, but the last rakudo step there seems to be ignoring the INSTALL_DIR\bin in the path.. 13:11
13:11 patrickb joined
[Coke] with the prefix specified, I am not sure the PATH even matters. 13:13
MasterDuke yeah, i don't think the you need the prefix in the path
i don't have the prefix i use in the path (on linux) 13:14
on a different topic, my jit of scsetobj, scsetcode, and getcomp all reliably fail on windows 13:15
so i think i'm going to remove them from the latest PR so it's clean, and then hopefully it can be merged and the others figured out in a separate PR 13:16
[Coke] jnthnwrthngtn: ah. I think I just cut and pasted from the wrong build failure window. 13:25
I'll try to update with the correct trace and the data on the binaries you asked for
13:41 ggoebel left 13:54 sena_kun left 13:55 sena_kun joined 14:03 Altai-man joined 14:04 sena_kun left
MasterDuke ok, github.com/MoarVM/MoarVM/pull/1555 is green across the board. anybody care to take a look? 14:09
14:15 Altai-man_ joined 14:17 Altai-man_ left
Geth MoarVM: MasterDuke17++ created pull request #1558:
Change CI job strategy from matrix to parallel
14:52 ggoebel joined 14:57 Xliff joined 15:11 ggoebel left 15:13 ggoebel joined 15:46 patrickb left
nine So the boot-foreign-code dispatcher seems to work and calls MVM_native_invoke and the native function runs and gets correct parameters. But then it fails with: "Dispatch callback failed to delegate to a dispatcher" 16:23
jnthnwrthngtn nine: Did you do all of 1) add a new kind of dispatch program outcome, 2) add a function to set that, and have your boot-foreign-code implementation call it, 3) add a new dispatch op, 4) wire up the dispatch program assembler to spit that op out? 16:29
(The outcomes are 1:1 with the dispatch terminals, pretty much) 16:30
nine jnthnwrthngtn: I may be missing step 4. 16:32
jnthnwrthngtn Ah, there's also a 2.5, which is to handle it in the switch statement that processes the different outcomes in the record phase. 16:33
Which is probably the one with a `default` that spits out the error you see 16:34
nine The error I get is from MVM_disp_program_record_end case MVM_DISP_OUTCOME_EXPECT_DELEGATE: 16:35
jnthnwrthngtn Oh. That is not the outcome a terminal should have
Can I see a diff or something?
nine gist.github.com/niner/ce782bfcf5ee...be78e34375 16:36
The actual call happens in case MVM_DISP_OUTCOME_FOREIGNFUNCTION: 16:37
jnthnwrthngtn Ah, right, we don't actually invoke bytecode 16:45
ah, but the unwind is being handled 16:46
This certainly doesn't happen on some follow-up call, e.g. control never returns after the native call? 16:48
Hm, I don't spot the problem. What's on the C callstack when we oops? 16:51
nine It does reach the "note "dispatch ended";" after the "nqp::dispatch('boot-foreign-code', $callee.call, $new_capture)" in the raku-nativecall dispatcher on the first run. But does not succeed in printing the result of the native call. 16:53
Backtrace: gist.github.com/niner/c281cb03ce3a...c919ba79bf 16:54
jnthnwrthngtn Sure, but dispatcher-delegate doesn't actually call a dispatcher, it just sets where we will delegate 16:55
Ah, I have a guess; what does the Rakudo side of this look like?
You'd need to delegate to boot-foreign-code, not use it 16:56
That's probably the issue
nine gist.github.com/niner/89b2a8996f0c...5a59ad0e28
jnthnwrthngtn ah yes 16:57
nqp::dispatch('boot-foreign-code', $callee.call, $new_capture);
Should be:
nqp::dispatch('boot-syscall', 'dispatcher-delegate', 'boot-foreign-code', $delegate_capture);
nine Aaah...that even makes sense
jnthnwrthngtn Where $delegate_capture is $new_capture, but with $callee.call inserted at the start
nine Turns out I had the correct expectation when I wrote the original code for MVM_nativecall_args. But then I adjusted the code to the faulty caller :) 17:06
Oh, very nice. 17:21
Tests start passing :) What's missing now is deconting of arguments 17:22
jnthnwrthngtn yay :) 17:26
nine: For Scalar we can just do it as part of the dispatch program. For Proxy, probably it needs something like the multi-dispatcher trick :)
(With the ProxyReaderFactory and the resumption)
nine I'm stealing pass-decontainerized for now 17:28
jnthnwrthngtn Yeah, that'll do it :) 17:30
17:38 linkable6 left, evalable6 left
nine Almost all tests passing now :) 17:41
jnthnwrthngtn Wow. nine++
Now "all" that's left will be to add a sp_nativecall or so, translate it, and JIT it :D 17:42
nine Need to port that callback logic as well
Child's play :D
jnthnwrthngtn Ah yes, to unwrap the code object
Also vastly cheaper :)
(To do it in the dispatch program)
nine Alas, despite the Deutsche Bahn doing its utmost to give me more time for hacking, even this train ride ends soon. But then, I got some 2.5 extra hours, so I shouldn't complain ;) 17:43
Nicholas will they also pay you for the extra hacking time they gave you? 17:44
nine If I manage to get past their bureaucracy. Raku - sponsored by Deutsche Bahn :D 17:46
MasterDuke has all the low-hanging fruit in been picked? 17:51
*in MVM_string_utf8_decodestream
huh. perf thinks 42% of its time is spent on `mov 0x30(%rsp),%rdi` 17:58
18:03 reportable6 left
MasterDuke huh, i think it's saying that's in the slow path, but the slow path was only taken 60k times (compared to 45m for the fast path) 18:04
18:05 reportable6 joined 18:10 [Coke] left 18:13 [Coke] joined 18:33 tealecloud joined 18:39 ggoebel left, ggoebel joined, linkable6 joined 18:41 evalable6 joined
lizmat SPA: the Rakudo Weekly News is like the Deutsche Bahn: delayed (until tomorrow) 18:48
MasterDuke we may want to investigate switching utf8 decoders. the benchmark at github.com/bdonlan/branchless-utf8 gives me 541.333398 MB/s for the one we use, but 708.000084 MB/s for a branchless version and 945.333446 MB/s for a simd version 18:50
slightly different numbers, but same ordering with both gcc and clang 18:52
lizmat don't we have a custom decoder that handles NFG ? 18:54
MasterDuke github.com/MoarVM/MoarVM/blob/mast...8.c#L3-L63 is what we use, it's tested in that benchmark 18:56
[Coke] ugh. I now have no working raku installed on my windows box. 18:57
(managed to eff up my "system" install while testing out HEAD)
18:59 ggoebel left
MasterDuke whoops, that fork of the benchmark that added the simd version had an older version of the one we're using. with the correct version of what we're using, i get 697.333416 MB/s. that's slightly faster than the branchless version, so no reason to switch to that. but the simd version is ~250MB/s faster 19:19
19:19 moon-child left, moon-child joined 19:26 childlikempress joined, moon-child left 19:43 childlikempress left 19:47 moon-child joined
MasterDuke dirtyhandscoding.github.io/posts/u...ction.html looks like it might be another good option 19:55
20:02 moon-child left 20:03 moon-child joined
jnthnwrthngtn I suspect the performance challenge with UTF-8 decoding in MoarVM is not so much the UTF-8 decoding into codepoints, but rather the NFG calculation from those codepoints. 20:06
MasterDuke of course the actual utf8 decoding isn't really our bottleneck. using the benchmark program from ^^^ i read the 1.5gb spesh log file i've been working with in 4.2s using the decoder we use, and 3.2s using one of the faster ones 20:07
but `Nil for "spesh.log".IO.lines; say now - INIT now` takes 32s
oh this is interesting 20:13
`time ./rakudo-m -ne 'Nil' spesh.log` takes 23s 20:14
`time ./rakudo-m -e 'Nil for "spesh.log".IO.lines;'`
takes 33s
20:15 ggoebel joined
[Coke] ok, I tried to do a clean build of rakudo with 2021.09 rakudo (which pulls in the same tag from nqp/MoarVM. I *still* get the failure about perl6-ops. wtf. 20:16
20:29 moon-child left, childlikempress joined
timo double-checked the install paths? is there some kind of debugging tool like LD_DEBUG=all or whatever for windows dll loading? 20:54
to see where it's looking and not finding it?
actually, i don't even know if finding the file is the issue 20:55
[Coke] failed to load library 'dynext\perl6_ops_moar.dll' 20:57
that file exists and appears to be of the right type.
I have tried a fresh command prompt to avoid lingering env vars. 20:58
timo does the error come from dynload or whatever lib we're using to dynamically load libraries 20:59
21:03 ggoebel left
[Coke] Don't know. Trying 2021.08 to see if I can just get a working raku again, either way will see if I can get a debug build to tell me what's going on at HEAD 21:05
timo: I can do a moarvm build with --debug and then I can step through. 21:09
21:16 ggoebel joined, childlikempress is now known as moon-child 21:30 MasterDuke left 22:02 MasterDuke joined 23:02 tellable6 left, bisectable6 left, releasable6 left, notable6 left, unicodable6 left, sourceable6 left, nativecallable6 left, shareable6 left, committable6 left, bloatable6 left, squashable6 left, reportable6 left, statisfiable6 left, greppable6 left, linkable6 left, quotable6 left, benchable6 left, coverable6 left, evalable6 left 23:03 benchable6 joined 23:04 sourceable6 joined, bisectable6 joined 23:05 releasable6 joined, notable6 joined, bloatable6 joined 23:06 evalable6 joined