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:03
coleman-x left,
coleman-x joined
00:04
reportable6 joined
00:22
evalable6 joined
00:52
ggoebel left
01:24
linkable6 joined
05:18
kjp_ is now known as kjp
06:02
reportable6 left
06:06
MasterDuke left,
bartolin joined,
japhb_ joined
06:10
jdv_ joined
06:14
timo left,
lizmat left,
MasterDuke left,
harrow left,
japhb left,
ilogger2 left,
Util left,
bartolin_ left,
raydiak left,
jdv left
06:15
timo joined
06:16
lizmat joined,
harrow joined
06:17
Util joined
06:20
raydiak joined
06:25
ilogger2 joined
|
|||
Nicholas | good *, #moarvm | 06:37 | |
unless you're big endian, in which case your morning is still a bit LTA | 06:38 | ||
06:38
patrickb joined
06:50
harrow left
06:53
harrow joined
07:03
reportable6 joined
07:08
ggoebel joined
07:16
Kaipi joined,
ggoebel_ joined
07:18
shareable6_ joined
07:21
shareable6 left,
Kaiepi left,
ggoebel left,
tellable6 left,
tellable6 joined
07:22
childlikempress joined,
moon-child left,
childlikempress is now known as moon-child
07:25
committable6_ joined,
notable6_ joined
07:27
notable6 left,
committable6 left
07:31
samcv_ joined
07:34
samcv left
08:17
jdv_ left,
jdv joined
|
|||
Nicholas | nine: if "all" I am doing is defining MVM_LOG_DEOPTS 1, how do I know if a deopt was "recent"? | 08:22 | |
I can see what the most recent logged thing is before my breakpoint on MVM_exception_throw_adhoc is hit, but I don't know what that then tells me. | 08:23 | ||
08:29
bloatable6 left,
bisectable6 left
08:30
bloatable6 joined,
bisectable6 joined
08:40
Kaipi left
08:42
Kaiepi joined,
reportable6 left
08:43
reportable6 joined
|
|||
nine | 08:48 | ||
moon-child | 08:49 | ||
nine | Nicholas: what does it tell you? | ||
Nicholas | Deopt one requested by interpreter in frame 'raku-multi-plan' (cuid '198') Will deopt 4128 -> 4344 Completed deopt_one in 'raku-multi-plan' (cuid '198') | 08:51 | |
Breakpoint 1, MVM_exception_throw_adhoc (tc=0x10030b90, | |||
(but in 5 lines, not 2) | |||
nine | That's not the same frame as your bisection result. Are there any deopts in 'val' at all? | 08:52 | |
May be worth a try to verify the jit-bisect result manually. Sometimes it's a bit off unfortunately :/ Disabling hash randomization may help getting a stable result | 08:53 | ||
Nicholas | can't see on in val | ||
and I think that this is the same output as last night | |||
and it's a different ppc64 machine. | |||
can't see one in val | |||
usign the first ppc64 machine to grind forwards trying to find the last good rakduo/nqp/MoarVM combo | 08:54 | ||
commit 42b52ec9e392b00b9114b1c213ee4ae14ca4d789 was good | |||
08:55
linkable6 left
09:05
ggoebel__ joined
09:07
jdv left,
jdv joined
09:12
jdv_ joined
09:14
ggoebel_ left,
jdv left,
moon-child left,
moon-child joined
|
|||
jnthnwrthngtn | Nicholas: I always disable hash randomization when doing spesh/JIT bissects, because it reliably makes them useless | 09:34 | |
(In fact, I'd probably have been better disabling it throughout the new-disp work and reenabling it before merge... :)) | 09:36 | ||
nine | I wonder if it'd have a measurable cost to make it possible to disable hash randomization via an environment variable? | 09:41 | |
jnthnwrthngtn | I think it'd be tested on some hot paths, but it maybe possible to arrange things so not | 09:42 | |
lizmat | it would be nice to have it environment variable settable | 09:44 | |
nine | It'd be an MVM_LIKELY(tc->instance->hash_randomize) per hash we construct | 09:46 | |
lizmat | that feels expensive? | ||
jnthnwrthngtn | Hmm, despite the vast improvement there are still 13754 attempts to transition a full dispatch cache in the p6-mqtt thing. | 09:47 | |
Nicholas | it also needs to be a check on that (or similar) at the start of every string we feed into siphash | ||
jnthnwrthngtn | That'd be the most costly place, I guess? | 09:49 | |
nine | Nicholas: does it? I don't see any checks for MVM_HASH_RANDOMIZE there? | ||
Nicholas | actually, not. but it's the setup of tc->instance->hashSecrets[0] and tc->instance->hashSecrets[1] that also needs to be changed to a fixed value (ie 0) if hash randomsiation is disabled | 09:52 | |
else one gets different results from MVM_string_hash_code for each run, and that will make different hash ordering | |||
(too) | |||
nine | Yes. I didn't mention that because it's a one time thng | 09:53 | |
Nicholas | true. I was confused. But it's still "don't forget..." | ||
jnthnwrthngtn | Ah, then maybe not too terribly costly | 09:56 | |
Should we worry about folks setting the env var instead of fixing their busted code/tests? :) | 10:03 | ||
timo | could require -DDEBUG for that perhaps | ||
then it will be available mostly to devs, but normal users don't get the performance hit | 10:04 | ||
dogbert17 | m: &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; grep(Str) # correct? GH #4543 | 10:11 | |
camelia | ( no output ) | ||
timo | m: &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; grep.(Str) | 10:14 | |
camelia | 5===SORRY!5=== Error while compiling <tmp> Calling grep() will never work with signature of the proto (Mu, |) at <tmp>:1 ------> 3od CALL-ME (|) { say "Got a call"; }} ; 7ā5grep.(Str) |
||
timo | m: &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; &grep.(Str) | ||
camelia | ( no output ) | ||
timo | feels a little strange to put a CALL-ME on a sub, though that's kind of what nativecall does | 10:15 | |
the normal way to do this would be with wrap though, right? | |||
Geth | MoarVM/hash_randomization_environment_variable: c6c7041781 | (Stefan Seifert)++ | 6 files Support disabling hash randomization via environment variable This makes it easier to debug and get useful results from e.g. jit-bisect.pl. |
||
nine | timo: what NativeCall used to do | ||
dogbert17 | c: 2021.09 &grep does role :: { method CALL-ME (|) { say "Got a call"; }} ; grep(Str) | ||
committable6_ | dogbert17, Ā¦2021.09: Ā«Got a callā¤Ā» | ||
jnthnwrthngtn | Even if we reinstate paying attention to the mixed-in CALL-ME, it's not going to impact any callsites already bound to an outcome pre-mixin. | 10:24 | |
The immutability of the lexpad post-CHECK time really should be considered to extend to Routines installed into it at compile-time also. | |||
However, we can't just forbid `does` on a Routine because that's a perfectly fine thing for a trait to be doing. | 10:25 | ||
lizmat | but does are at compile time, generally, no? | 10:27 | |
*those | |||
Geth | MoarVM: 1420640ab2 | (Jonathan Worthington)++ | 3 files Add a way to request non-installation of a DP In some cases, we may know that we are only recording a new dispatch program because of a transient situation. For example, a megamorphic by type method dispatcher may end up in record mode because the class in question didn't have a cached flat method table yet. Once that situation is resolved, an already installed dispatch program could start to match. Thus provide a way for a dispatcher to indicate that it's not worth the installation of the current dispatch program, so we can hopefully avoid one cause of piling up a mass of programs at the callsite beyond the point we realize it's megamorphic. |
10:29 | |
jnthnwrthngtn | lizmat: Yes, they are, and it's possible that the issue was golfed from such a situation too. | 10:30 | |
Hm, that plus a matching NQP commit are not quite so helpful as hoped... | 10:32 | ||
lunch, bbl | |||
lizmat | jnthnwrthngtn: yeah, basicallt from 8.0 to 7.9 for MQTT::Client test | 10:36 | |
*basically | |||
ah, missed the NQP one: with the NQP one, it's down to 7.8 for me | 10:43 | ||
10:48
Altai-man joined
|
|||
Nicholas | OK, first (of many?) big endian bug appears in MoarVM between 720b1aa169de2fb508f7ae80e095b89fad30af4b and 649c9ccad21debf80fec48025b824bad07464785 | 10:52 | |
actually, end is tigher than that. It's present at e9be25809ccfdf13b9db4beeba2a4f9cf0feb535 (which changes which op is reported as NYI) | 10:53 | ||
nine | So, just 12K lines of diff to comb :D | ||
Nicholas | I'm trying to get down to 1 commit | 10:54 | |
nine | Lets hope it will be the actual commit introducing the broken code, not just a commit unlocking some previously broken optimization | 10:56 | |
Though even the latter can point us in the right direction | |||
Nicholas | even if it's the latter, it reduces the number of thigns to look for | ||
remember, I don't udnerstand spesh. but I do understand C :-) | |||
10:56
linkable6 joined
|
|||
Nicholas | OK, it's wierder still. It's commit edb9e5bc04c1232799c378779681ba9a4096a898 | 10:58 | |
edb9e5bc04c1232799c378779681ba9a4096a898 / 27d0b9ff6e0e86bf8763daef7927a8216f6a145b / b21bf9a80e380b17f72cd34b63d40552b8c79ed3 is bad (gets a NYI) | 10:59 | ||
10:59
linkable6 left
|
|||
Nicholas | edb9e5bc04c1232799c378779681ba9a4096a898^ / 27d0b9ff6e0e86bf8763daef7927a8216f6a145b / b21bf9a80e380b17f72cd34b63d40552b8c79ed3 is good | 10:59 | |
11:00
linkable6 joined
|
|||
nine | Huh...can't claim that the error is blatantly obvious to me. But then, if it were I'd probably have avoided it in the first place | 11:02 | |
Nicholas | prior to that commit, only 1 line does new_operands[3].lit_ui32 = deopt_index; | ||
which size *should* a deopt_index be? | |||
nine | why deopt_index? | 11:04 | |
Nicholas | it's assigned to lit_ui32 | ||
I'm suspicious about alignment in unions | |||
nine | The commit does new_operands[2].lit_ui32 = MVM_disp_inline_cache_get_slot(...). And the latter does return an MVMuint32 | 11:05 | |
And there are 4 other places that do exactly the same | |||
Nicholas | but only 1 is uncommented? | 11:06 | |
and I don't know if it is reachable | |||
nine | No? optimize_getlexstatic does exactly the same | 11:07 | |
sp_assertparamcheck's arguments are defined in oplist as r(int64) sslot uint32 and write_instructions in codegen.c reads ins->operands[i].lit_ui32 for MVM_operand_uint32 parameters. So assigning to lit_ui32 should be safe, shouldn't it? | 11:13 | ||
11:13
ggoebel__ left
|
|||
Nicholas | well, I believe so | 11:13 | |
nine | Nicholas: can it really be something as basic as GET_UI32 in interp.c? | 11:19 | |
Nicholas | I really dobut it | 11:20 | |
new strangeness - I stuck a breakpoint on sp_assertparamcheck and ok is 1 both times | |||
11:21
ggoebel__ joined
|
|||
timo | turned off jit before? | 11:21 | |
Nicholas | timo: this is ppc64 | ||
timo | ah, of course | ||
you're debugging endianness issues | |||
Nicholas | JIT is "NYI" :-) | ||
timo | SMOP, surely | 11:22 | |
Nicholas | FSA_SIZE_DEBUG and valigrind find an invalid write at interp.c:248 | 11:33 | |
OP(extend_i16): | 11:34 | ||
GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).i16; | |||
before this spesh problem. | |||
so, the real bug is earlier... | |||
timo | huh, is that not targeting a 64bit register? | ||
Nicholas | unavoidable lunch& | 11:36 | |
timo | non-maskable interlunch | 11:37 | |
11:38
ggoebel__ left
12:03
reportable6 left,
reportable6 joined
12:15
rypervenche left
12:29
japhb_ is now known as japhb,
rypervenche joined
13:25
[Coke] is now known as CokeZero,
CokeZero is now known as [Coke]
|
|||
jnthnwrthngtn | lizmat: Yeah, it's something. Also it's now pretty close to what it was before new-disp for me. | 13:33 | |
(A bit slower, but not by that much.) | |||
nine | jnthnwrthngtn: looks like Inline::Perl5's slow down doesn't have anything to do with the method cache or find_best_dispatchee no longer existing. Looks more like optimized NativeCall sub bodies are no longer used | 13:35 | |
Have to confirm the latter though. Profiler's too broken to tell from that | |||
timo | :o | 13:36 | |
jnthnwrthngtn | Profiler's broken? In a way specific to nativecall, or? | 13:37 | |
(I've used it quite a bit recently) | |||
nine | Well for one running with --profile is super slow compared to before. I also don't get a call graph anymore | 13:38 | |
[Coke] | build seems broken on windows again. Might be me trying to force a build of all 3 bits from one config line. | ||
nine | Have to change trains. May be a bit | ||
jnthnwrthngtn | nine: Odd, I was seeing much smaller profiler output | ||
(For the things I tried) | |||
Including finally being able to do CORE.setting | |||
So I guess there's something different about this case | 13:39 | ||
nine | testing CSV's csp-ip5xs.pl | 13:45 | |
profile time seems to grow exponentially with the number of rows | |||
[Coke] | seeing many more warnings in moarvm build today, weird. | 13:46 | |
nine | 16K rows take half a minute, 100K rows take noeth of half an hour | 13:47 | |
[Coke] | (wonder if I accidentally deleted some lines yesterday.) | ||
jnthnwrthngtn | o.O | 13:48 | |
I'd guess perf would show up something of interest | |||
Nicholas | I'm really strugglign with this big endian stuff. | 14:00 | |
[Coke] | updated compiler warnings: gist.github.com/coke/4626a2760c314...794c55f2ac | ||
Nicholas | In that, I end up with valgrind reporting garbage reads (or writes) with spesh enabled | 14:01 | |
but from interp.c and non spesh ops | |||
jnthnwrthngtn | Normal ops are executed in spesh code | ||
Garbage as in uninitialized or out of bounds? | 14:02 | ||
Nicholas | but if I build the same version on x86_64 with (the same) paranoia, all is happy | ||
jnthnwrthngtn | oh, writes implies the latter | ||
Nicholas | ==1619710== Address 0x119f62d8 is not stack'd, malloc'd or (recently) free'd | ||
==1619710== Invalid read of size 8 | |||
jnthnwrthngtn | Can you breakpoint it and get the register index it's trying to read? | ||
timo | perhaps even `call MVM_dump_bytecode(tc)` | 14:03 | |
Nicholas | no, I can't see how I can | 14:04 | |
valgrind reports different errors from a gdb run | |||
so I'm not getting a SEGV when usign gdb | |||
timo | in theory, doesn't valgrind also expose a gdbserver interface? | 14:06 | |
can you also get it to complain with asan? | |||
i think asan has an env var option that lets you abort() when such an access happens | |||
jnthnwrthngtn | This is odd, some inline caches reach full entries even though I don't think that should be possible any more... | 14:11 | |
Or rather, in a situation I think it shouldn't be possible | 14:12 | ||
yeah, this is weird, it should be boring | 14:17 | ||
A simple method call | |||
With a huge variance in invocant type | 14:18 | ||
oh | 14:20 | ||
It's boot-boolify | 14:22 | ||
It guards on type | 14:23 | ||
nine | Not kiddimg: they just told us that they have to reboot the train. The IT Crowd was far more visionary than I thought | 14:39 | |
[A[A | 14:47 | ||
jnthnwrthngtn | Seems there is a little benefit in running latest dispatch program first (in order to get the megamorphic handler added most recently) | 14:51 | |
Nicholas | I didn't know that ASAN had "UNKNWON" in its vocab: ==1629517==The signal is caused by a UNKNOWN memory access. | 15:11 | |
lizmat | cosmic ray? | ||
neutrino? | 15:13 | ||
WIMP? | 15:14 | ||
Geth | MoarVM: f452513c57 | (Jonathan Worthington)++ | src/disp/inline_cache.c Attempt latest dispatch program first This means that for megamorphic sites that install a program to handle everything, we'll use that ahead of the rest. Rationale: * The dispatch programs we stacked up before installing the megamorphic one are liable to regularly fail, and so less efficient to attempt ... (7 more lines) |
||
MoarVM: c7237e9c83 | (Jonathan Worthington)++ | 2 files Translate dispatch ops used at megamorphic sites So that we will be able to at least JIT compile the HOW access and hash lookup. |
|||
lizmat | seems to gain another .1 on MQTT-Client test | 15:30 | |
jnthnwrthngtn | Yeah, that's the kind of magnitude I saw now | 15:31 | |
How does it compare on your machine to the pre-new-disp measurement? | 15:32 | ||
lizmat | I don't think I have a proper local one | ||
jnthnwrthngtn | ah, ok, I was asking 'cus I don't on this box either | 15:33 | |
But I think we're probably within 10% now | |||
lizmat | yeah, feels like | 15:34 | |
jnthnwrthngtn | Given this is one of the worst cases for the new-disp model (explosions of types all over the place), that's not too bad. | 15:35 | |
boot-boolify handles the megamorphic stuff quite badly | 15:36 | ||
Figuring out a solution for that would likely help, I'm just not too sure what it'll look like yet | |||
Probably pushing some amount of it out of the VM and into userspace | 15:37 | ||
lizmat | well, that's what you've been doing a lot of lately anyway, right? | ||
jnthnwrthngtn | Yup :) | ||
lizmat | so that would be a good thing, no? | ||
jnthnwrthngtn | I just need to decide how far to go with it, is all | 15:38 | |
lizmat | right.... and I guess more userland stuff, means more warmup time | ||
jnthnwrthngtn | Do we toss the boolification spec entirely in MoarVM and do a full dispatch solution, for example. | ||
Yes, there's that | |||
Anyway, 10% slowdown is much more manageable than factor of 7 slowdown. | 15:40 | ||
lizmat | indeed :) | 15:41 | |
although 10% speedup would be better :-) | 16:06 | ||
[Coke] | :P | 16:07 | |
lizmat | yeah, I know :-) | 16:08 | |
[Coke] | ok. on windows today, I am getting failed to load library 'dynext\perl6_ops_moar.dll' at gen\moar\BOOTSTRAP\v6c.nqp:1134 (<ephemeral file>:) | ||
moarvm and nqp appear to have built and installed... | |||
ugh. nevermind. | 16:10 | ||
timo | the perils of using Configure.pl to build all three parts? | 16:11 | |
[Coke] | (typo in the PATH setup, so while the --prefix was pulling from the right spot, trying to run the installed nqp later was not great. | ||
jnthnwrthngtn | lizmat: I suspect if we find a way to cache the derived regex languages between EVALs we'll gain at least that. | ||
[Coke] | timo: of NOT using, in this case. writing a .bat file to help me force all 3 to build at master | 16:12 | |
master/HEAD | |||
timo | oh my | 16:13 | |
nine | Really looks like NativeCall is not using the generated function bodies anymore. Except during BEGIN time (just to make it weird) | 16:16 | |
16:18
MasterDuke joined
|
|||
nine | No, it's not BEGIN vs. runtime either | 16:20 | |
[Coke] | nope, fixed my typo, still can't build rakudo on head. wtf. | 16:29 | |
Geth | MoarVM: 6cdb0846c5 | (Jonathan Worthington)++ | src/6model/reprs/ReentrantMutex.c Fix segfault when GCing ReentrantMutex We cannot clone a ReentrantMutex. In the event that we attempt to do so, an object is allocated, but then not initialized. That lack of initialization would lead to a NULL pointer dereference when we tried to GC the lock. (We don't need to take care of this anywhere else, because the clone never leaks out to userspace; an exception is thrown before it can.) |
16:31 | |
timo | oh wow | ||
16:31
coleman-x left
|
|||
nine | jnthnwrthngtn: when _do_ we fail to initialize a mutex? And can we actually recover in that situation? | 16:33 | |
jnthnwrthngtn | nine: When we allocate the memory (in the GC), then call `copy_to`, and it throws | 16:35 | |
The GC still needs to clear up the allocation | |||
hah, I wrote a Rakudo test to cover it, then realized that if I push it it'll SEGV unless I do version bumps... | 16:36 | ||
nine | Looks like the generated bodies that do get used are created by the CHECK phaser NativeCall exports: github.com/rakudo/rakudo/blob/mast...kumod#L792 | 16:41 | |
But that should really be all of them. Without the CHECK phaser we don't call any generated bodies at all. With it only some | 16:46 | ||
I really can't find a system in this | 17:08 | ||
17:09
linkable6 left
|
|||
timo | is what jnthn just committed to rakudo about nativecall? | 17:09 | |
ah, no it's about the other exaple from earlier today | |||
nine | It's about why Inline::Perl5 is now twice as slow | 17:10 | |
timo | i meant mixing CALL-ME into a proto | ||
nine | Ah, sorry, misread your sentence. Sounds like that, yes | 17:11 | |
jnthnwrthngtn | What I just committed fixes a reported regression | 17:16 | |
17:23
patrickb left
17:34
Altai-man left
|
|||
jnthnwrthngtn | Time to go home, rest, etc. | 17:34 | |
18:03
reportable6 left
18:10
linkable6 joined
|
|||
lizmat | ... | 18:57 | |
19:04
reportable6 joined
|
|||
jnthnwrthngtn | Goodness, that was a filling dinner... | 20:42 | |
nine: I've been pondering what NativeCall might look like if really done to take advantage of new-disp. My rough idea: | 20:47 | ||
1. Add a new dispatch terminal (along with value, constant, invoke bytecode, etc.) which is to invoke an FFI function. | |||
2. Can add guards, decont Scalar containers, and add unboxings if needed as part of the dispatch program, so there's not much conversion work left in the final thing. | |||
3. It specializes into guards and an op like `sp_nativecall`, which is what it then used on platforms where we can to JIT the native call. | |||
Note that this means that the location we make a native call can end up, in the JIT case, with the C call itself emitted, so we're not even dependent on inlining of anything, nor any QAST generation, etc. | |||
MasterDuke | so i'm not terribly surprised, since that one was trickier, but reverting the jitting of scsetobj in github.com/MoarVM/MoarVM/pull/1552 got it farther. now nqp build but there's an error building rakudo i've never seen before | 20:53 | |
`NMAKE : fatal error U1077: 'C:\Strawberry\perl\bin\perl.exe' : return code '0xff` | 21:03 | ||
i guess this means (at least) two of the ops are incorrect. ugh, another round of reverting to find out which one... | 21:04 | ||
timo | well that's super odd | 21:41 | |
we use perl for the exprjit compiler don't we? is that the part that asplode? | |||
does nmake output more info? maybe with --no-silent-build? | 21:42 | ||
MasterDuke | it's somewhere in stage parse, since stage start finished | 22:06 | |
dev.azure.com/MoarVM/MoarVM/_build...b312016e60 | |||
timo | ah, that's the "run_early_build_rakudo.pl" or whatever it's called | 22:09 | |
and it quite possibly just forwards the exit status from the moarvm process itself | |||
MasterDuke | i'm not really regretting now making a PR right away and just adding each new commit to it | 22:16 | |
*now really | |||
*not making | |||
[Coke] | can roll things back and do a PR, no? | 22:18 | |
MasterDuke | eh, i'm kind of in the middle now | 22:19 | |
[Coke] | fair enough | 22:27 |