|
github.com/moarvm/moarvm | IRC logs at colabti.org/irclogger/irclogger_logs/moarvm Set by AlexDaniel on 12 June 2018. |
|||
|
03:00
sivoais_ left,
sivoais joined
06:59
patrickb joined
|
|||
| nwc10 | good *, #moarvm | 07:10 | |
| jnthn: OK, so, I had a bit of inspiration on how to attack the problem | 07:11 | ||
| turns out that spesh assumes that hash entries don't move once they exist | |||
| specifically sp_gethashentryvalue | |||
| I'm not sure that I like this assumption. I think (not yet tested) that it can remain valid by introducing a level of indirection. But, yes, lots of 8 bytes and cache misses | 07:12 | ||
| but | 07:13 | ||
| I think also that it's possible to product 2 branches - one where hash entries move and that spesh optimisation is disabled, and one with indirection where it is not | |||
| and (if both get to the point of passing) | |||
| benchmark! | |||
| nine | If in doubt, remove that spesh optimization. It's just saving one hash lookup. If hashes become faster, the opt wouldn't do so much good anymore anyway :) | 07:29 | |
| nwc10 | well, I don't yet know what else we would hit | 07:32 | |
| I've found this by running under ASAN, and malloc/copy/free the hash contents on each insert or delete | |||
| nine | I don't think anyone else was audacious enough to rely on this... | 07:39 | |
| nwc10 | we will see (at least as far as spectest) | 07:40 | |
| but not yet, as I have a bit of $ork to get done | |||
|
07:40
MasterDuke joined
|
|||
| MasterDuke | nine: i thought the opt saved two hash look ups and a lock? | 07:41 | |
| nine | MasterDuke: only part of that relies on the hash entry not moving IIRC | 07:42 | |
| MasterDuke | oh, yeah, that makes sense | 07:43 | |
| nwc10 | OK, interesting, it's: | 07:50 | |
| MVMHashEntry *entry = MVM_str_hash_fetch_nt(tc, hashtable, sym_facts->value.s); | |||
| if sym_facts isn't visible to NQP code, then *it* can become a hash-with-indirection | |||
| and the rest not | |||
| but let's leave that as a future idea | |||
| and yes, that might mean in the future that MVMHash needs to fork into a second variant with the indirection | 07:51 | ||
| if we do want these sorts of hashes visible to NQP | |||
|
07:51
sena_kun joined
|
|||
| nwc10 | sena_kun: I might have found it (my problem). See recent scrollback. | 07:52 | |
| but I have to babysit the work $thing for a bit | |||
| so can't hack on this | |||
| or the linux isntall on the laptop to my right | |||
| this tank of a laptop that has a BIOS sufficiently old that it won't USB boot :-( | 07:53 | ||
| its future role is "USB disk caddy" :-) | 07:54 | ||
| (well, mobile device photo backup target) | |||
| oh, I'm misreading that line | 07:59 | ||
| it's *hashtable* that matters | |||
| and that is visible to the world | |||
| anyway, the $ork thing has a new bit of logging, and, interesting.... | 08:00 | ||
| sena_kun | nwc10, sounds interesting, good luck with sorting it out. :) | ||
| tellable6 | 2020-07-16T21:24:52Z #raku-dev <patrickb> sena_kun: I'm totally stumped on this one! This builds fine locally and all the tests are green. No idea why nuking should be necessary, but did you try that? | ||
| nwc10 | also, I realised that there's a potentially (somewhat nutty) optimsation possible with going to a *single* memory block for a hash (including the control structure in that block) | 08:04 | |
| hash copy is | |||
| 1) malloc | |||
| 2) memcpy | |||
| 3) fix up the write barriers | |||
|
08:24
vrurg left
08:25
vrurg joined
08:29
vrurg left
|
|||
| nwc10 | bother. that's not it | 08:40 | |
|
09:12
Altai-man_ joined
09:14
sena_kun left
|
|||
| jnthn | morning o/ | 09:30 | |
| nwc10 | \o | 09:31 | |
|
09:48
vrurg joined
09:49
vrurg left,
vrurg joined
11:10
dogbert17 joined
11:13
sena_kun joined
11:14
Altai-man_ left
11:44
vrurg left
11:49
vrurg joined
11:54
vrurg left
|
|||
| nwc10 | dear @all | 11:56 | |
| so my error message is this: | |||
| Method 'hash' not found for invocant of class 'Capture' | |||
| IIRC I know which rakudo source file that gets reported from | 11:57 | ||
| but underyling this - what is actually going wrong? Where in the C code should be looking? | |||
| as in "I see that we throw this from method_not_found_error in src/Perl6/bootstrap.c/BOOTSTRAP.nqp" but how did we get there? | 11:59 | ||
| jnthn | Full stack trace? | 12:02 | |
| Exception handlers run on the top of the stack before unwinding, so in principle we can see how we got there | |||
| Methods resolution currently fist looks in the method cache hanging off the STable | |||
| *first | 12:03 | ||
| Which is a hash | |||
| nwc10 | paste.scsys.co.uk/592242 | 12:04 | |
| "is a hash" ought to be the cause here | 12:05 | ||
| but it's now built with some agressive reallcation | |||
| (at least it should be, and it found the thing in spesh in the nqp build) | |||
| but that backtraces is with MVM_SPESH_DISABLE | |||
| this will all be down somewhere in MVM_6model_find_method() ? | 12:13 | ||
| jnthn | Yes | 12:19 | |
| And the hash in question is the method cache one hanging off STable | 12:20 | ||
| nwc10 | Which gets deserialised, it seems, or at least, can do | ||
| but I was curious which bit of C code I needed to hack in some extra "logging" | |||
| but "it's not spesh, it's not the subtle one of taking the address of the HashEntry struct (because ASAN triggers on that), and it gets 100% through NQP" | 12:22 | ||
| and it's not (other) undefined behaviour | |||
| jnthn | I'd probably instrument find_method | ||
| nwc10 | (oh wait, or is it. this hasn't yet been attacked with valgrind since I added the agressive malloc/copy/free) | ||
| jnthn | (the one you mentioned) | ||
| nwc10 | OK, yes, that looks like the candidate | ||
| that or "attack the weeds in the garden" | |||
| jnthn | And see what lookups in the cache fail/succeed | 12:23 | |
|
12:30
vrurg joined
|
|||
| jnthn | Friday afternnon really isn't the time to dig back into the dispatcher stuff...guess I'll give it a couple of days next week. | 12:46 | |
| lizmat | use nqp; my $l := nqp::list_i(42); dd nqp::existspos($l,1) | 12:50 | |
| evalable6 | 0 | ||
| lizmat | use nqp; my $l := nqp::list_i(42); dd nqp::existspos($l,0) | ||
| m: use nqp; my $l := nqp::list_i(42); dd nqp::existspos($l,0) | |||
| camelia | MVMArray: atpos expected int register in block <unit> at <tmp> line 1 |
||
| lizmat | weird, huh ? | ||
| jnthn | I don't think existspos actually makes sense on a non-object list | 12:51 | |
| nwc10 | jnthn: were you planning to POETS, or just to find something shorter to do? | 12:52 | |
| lizmat | jnthn: you're right, but shouldn't it explode as well if the element does not exist ? | ||
| jnthn | lizmat: existspos is sugar for elems + isnull(atpos(...)) | 12:53 | |
| And elems comes first | |||
| lizmat | yeah, figured it'd be something like that | 12:54 | |
| jnthn | nwc10: I'll do some more RakuAST bits, 'cus that's mostly swapped in still :) | ||
| nwc10 | ah righto | 12:55 | |
| jnthn | Also figure I should get some work in on things, 'cus I've got 2 weeks afk vacation coming up :) | 12:56 | |
| nwc10 | cool. | 12:57 | |
| jnthn | (From Thursday) | ||
| nwc10 | you plan to "head for the hills" before the release :-) | 12:58 | |
|
13:12
Altai-man_ joined
13:15
sena_kun left
|
|||
| timotimo | jnthn: looking forward to your next dispatcher hacking :) | 13:19 | |
| jnthn | .oO( or is it "run to the hills"? :) ) |
13:33 | |
| grr, whichever end I pick to unravel next, I find it has a yak attached... | 13:38 | ||
| timotimo | yaks love to do tug-of-war, i assume that's what's going on here | 13:39 | |
| moritz | drink a yakuccino, maybe it's better afterwards :D | 13:40 | |
| jnthn | Turns out I really need to figure out the whole implicit topic thing | ||
| I actually wanted to do exception handlers next but those end up implying the same thing :) | 13:41 | ||
| nwc10 | does the beer fridge have a yak attached? | 13:47 | |
| or hiding inside? | |||
| timotimo | ah, this is RakuAST work | 13:48 | |
| jnthn | I'm quite sure the beer fridge is yak free | 13:49 | |
| timotimo: yes | 13:50 | ||
| Well, by this point I have a newly written failing test and a cup of tea... | |||
| nwc10 | "I'm quite sure the beer fridge is yak free" -- that sounds like an interesting challenge for April 1st. Would probbly need an inside collaborator | ||
| timotimo | jnthn: is there any specific reason why we can't move getcode + takeclosure closer to before we invoke/use the thing for the first time? | 13:58 | |
| like, i would assume we can skip doing that for if/elsif/else branches where we only invoke one of the n | 14:00 | ||
| jnthn | Well maybe but then what if it's in a loop? | 14:01 | |
| timotimo | right, we'll have to move it before the first branch that is relevant to the usage site i guess | 14:04 | |
| the latest block that dominates it perhaps | 14:05 | ||
| that doesn't seem right | |||
| the latest block that dominates both it and the exit block? | |||
| there's certainly prior art for this simple question :) | 14:07 | ||
| put it right in front of the thing, then do loop-invariant-code-motion or whatever | 14:08 | ||
|
14:18
AlexDaniel left
14:21
vrurg left
14:24
vrurg joined
|
|||
| nwc10 | jnthn: so I have hacked MVM_6model_find_method a bit | 14:48 | |
| it seems that it calls find_method, for "hash", finds a NQPRoutine | |||
| and yet still it goes wrong soon after. | 14:49 | ||
| so, random cargo-cult first thought - is something not rooted? | |||
| jnthn | Is it a concrete NQPRoutine, not a type object? | 14:51 | |
| nwc10 | er, yes, hangon, I don't know that yet. | ||
| flags = 16 | 14:52 | ||
| I need to look that up | |||
| MVM_CF_SECOND_GEN = 16, | 14:53 | ||
| no, it's not a type object | |||
| jnthn | OK, then at that point things seem legit | ||
| nwc10 | :-) | ||
| "it all goes horribly wrong" is still in the future | 14:54 | ||
| so, I suspect what I now do is | |||
| 1) take a break, because I'm still a bit fried | |||
| then | |||
| 2) build master in another tree, with the same extra code and same breakpoint | |||
| and see where they diverge | |||
| although if I'm feeling lazy I could just set a hardware watchopoint on flags and see where it goes next | 14:55 | ||
| odd. nowhere. it goos "boom" | 14:56 | ||
| ie the backtrace | |||
|
14:59
zakharyas joined
|
|||
| nwc10 | jnthn: it says that it's 88 bytes, and the STable says that it's "NQPRoutine". This means that I can't cast that 88 byets to some C structure and look it it from gdb? | 15:02 | |
|
15:09
SmokeMachine left,
SmokeMachine joined
|
|||
| nine | nwc10: I'd expect an NQPRoutine to be a P6opaque object. In a debug build you can call MVM_dump_p6_opaque(tc, obj) from gdb to get at its data | 15:10 | |
| If you're interested in low level stuff, just cast it to MVMP6opaque* | 15:11 | ||
| Also useful: call MVM_dump_backtrace(tc) and MVM_dump_bytecode(tc) to find out where you actually are exactly and get an idea how a value ended up in a register | |||
| nwc10 | No symbol "MVM_dump_p6_opaque" in current context. | ||
|
15:13
sena_kun joined
|
|||
| nwc10 | and git grep ca't find it | 15:13 | |
|
15:14
Altai-man_ left
|
|||
| nine | MVM_dump_p6opaque | 15:16 | |
| nwc10 | NQPRoutine.new(#`(from NQPRoutine) $!do, $!signature, $!dispatchees, $!dispatch_cache, $!dispatch_order, $!clone_callback, $!onlystar=0) | ||
| whee | |||
| and then I have to know how to do pointer arithmetic to figure out what to cast ot (MVMObject*) ? | 15:17 | ||
| nine | Looks like it hardly doesn't contain data | 15:18 | |
| nwc10 | OK. | 15:23 | |
| I think I'm about to be AFK | |||
| nine | The dumper works recursively already | ||
| The whole point of that is to not need to do the pointer arithmetic :) | 15:24 | ||
|
16:09
patrickb left
17:12
Altai-man_ joined
17:14
sena_kun left
18:04
leont left
18:10
zakharyas left
18:53
zakharyas joined
19:13
sena_kun joined
19:14
Altai-man_ left
|
|||
| nwc10 | the problem seems actually to be earlier | 19:43 | |
| in that, master never hits "find_method" for "hash" | 19:44 | ||
| I now have a very chatty set of output from master and my branch | |||
| and I'm starting to dig into the diffs | |||
|
20:29
zakharyas left
20:43
squashable6 left,
squashable6 joined
|
|||
| timotimo | i think i want to do another attempt at named mallocs/callocs and named fsa allocs, and why not also named spesh allocs just for fun | 21:01 | |
| moritz | my malloc is called Fred! :D | 21:03 | |
| MasterDuke | what do you mean named? | 21:04 | |
| timotimo | mostly turning "thing = (Type *)MVM_malloc(count * sizeof(Type))" into "MVM_MALLOCOBJ(count, Type)", but also there's then a systemtap probe point in there that lets you collect stats and such for allocations "by type" | 21:07 | |
| er, of course it would be "thing = MVM_MALLOCOBJ(count, Type)" | 21:08 | ||
| there'll have to be yet another piece of probing in the build system for moarvm ... | 21:09 | ||
| at some point we will have to run those in parallel, LOL | |||
|
21:12
Altai-man_ joined
|
|||
| timotimo | or a flag that turns it on | 21:12 | |
|
21:14
sena_kun left
21:15
MasterDuke left
|
|||
| lizmat | hmmm pl6anet.org down? | 21:21 | |
| timotimo | i think the greater internet is having a bit of a hiccup at this very moment? | ||
| lizmat | nope, it dropped out of DNS ? | ||
| yeah, same for raku.org | 21:22 | ||
| moritz | I get the IPs 104.18.59.39 and 172.67.215.46 for raku.org | 21:23 | |
| lizmat | dig @8.8.8.8 A raku.org | ||
| nada | |||
| moritz | and the response is SLOOOW | 21:24 | |
| makes me wonder if the .org TLD servers fail | |||
| lizmat | dig @8.8.8.8 A perlmonks.org # works | 21:25 | |
| moritz | a dig @8.8.8.8 SOA raku.org takes 5 seconds here | 21:26 | |
| lizmat | pinging rba | ||
| moritz | wtf? | ||
| timotimo | don't we have "our own" dns server for our domains? | 21:27 | |
| moritz | according to whois, the raku.org nameservers are VAL.NS.CLOUDFLARE.COM and CLINT.NS.CLOUDFLARE.COM | ||
| and dig @VAL.NS.CLOUDFLARE.COM raku.org errors out with "connection timed out; no servers could be reached" | 21:28 | ||
| timotimo: you mean a hidden primary? | |||
| timotimo | i did get an error from somewhere in cloudflare with a "broken gateway" when loading a pastebin | ||
| moritz | so cloudflare b0rked? | ||
| lizmat | VAL.NS.CLOUDFLARE.COM doesn't resolve for me | ||
| so something is really borked | 21:29 | ||
| timotimo | hearing chatter of cloudflare being down from others | ||
| moritz | 173.245.58.234 172.64.32.234 108.162.192.234 | ||
| timotimo | how do you fall back when cloudflare goes down LOL | 21:33 | |
|
21:34
patrickb joined
|
|||
| moritz | www.cloudflarestatus.com/ | 21:42 | |
| "Cloudflare is investigating issues with Cloudflare Resolver and our edge network in certain locations." | 21:43 | ||
| seems it's kinda working again | 21:44 | ||
| lizmat | yeah, looks like | 21:48 | |
| *phew* | |||
|
22:52
patrickb left
23:13
sena_kun joined
23:14
Altai-man_ left
23:18
sena_kun left
|
|||