02:09
vendethiel joined
|
|||
dalek | arVM: 4df2030 | hoelzro++ | src/io/procops.c: Track process state when spawning children This is prepare for a fix around closing standard input and race conditions 9befd69 | hoelzro++ | src/ (4 files): Revert "Track whether or not a capture owns its callsite" This reverts commit 02d5241997ae7b5a2dc1ce1f1a8bd1fa3884258b. |
02:17 | |
02:17
dalek joined
02:21
tokuhiro_ joined
06:25
Ven joined
06:55
FROGGS joined
07:54
FROGGS joined
07:59
brrt joined
08:26
Ven joined
08:39
Ven joined
|
|||
Ven 's learning about all those weird registers things, on his way to enlightenment 'bout computers and VM... | 09:25 | ||
I certainly understand more thing of that big JIT file now... But damn you, gnu asm... | |||
timotimo++ for motivating me to do so :P | 09:26 | ||
brrt | Ven++ for trying to learn :-) | 09:30 | |
can i help you? | |||
with anything? | |||
for example, with the options to convert to intel asm format? :-) | |||
Ven | I've been given this great chart: upload.wikimedia.org/wikipedia/com...rs_svg.svg which has helped me a lot already :D | 09:31 | |
brrt | oh, yes, that seems useful | ||
Ven | I got my code to do what I wanted it to do (store char in the stack, increment char unless char='z', then set it to 'a'; print it using a syscall). I'm trying to rewrite it to be a function call now | ||
brrt | that will be fun | 09:32 | |
Ven | seems the output (with cat -e) is "M-I^B^B", I think I'm not really there now XD | ||
brrt | :-) | ||
nwc10 | hoelzro: unfortunately 02d5241997ae7b5a2dc1ce1f1a8bd1fa3884258b creates a use-after-free bug: paste.scsys.co.uk/499584 | 09:35 | |
from that stack trace, I hope that the solution is simple. It looks like the use is just after the free, and so could be fixed by some re-ordering or somesuch | 09:36 | ||
Ven wonders why gcc -O2 -S sometimes generates -4(%rbp), sometimes -1(%rbp) in the program, for what seemed to be equivalent | 09:48 | ||
moritz | moon phase | ||
Ven | aah, I got it. I forgot to fill %eax before using %al.. | 09:50 | |
brrt wonders why Ven is using lower registers at all | 09:51 | ||
Ven | it's just a char, so a byte | ||
at least that's what I got.. | |||
ooh, I used cmp, not cmpb. fixed now! | 10:10 | ||
10:49
Peter_R joined
10:53
zakharyas joined,
mtj_ joined
10:58
mtj_ joined
11:21
Ven joined
|
|||
brrt | Ven: i can totally recommend intel syntax | 11:22 | |
in intel syntax, it's not movb | |||
or cmpb | |||
masak .oO( I can call you Betty, and baby, you can call me %al ) | |||
Ven | yeah, that works :) | ||
brrt | but cmp byte foo, byte bar | ||
actually, typcally | |||
cmp byte [rbp-1], al; | |||
lol masak | |||
an anyway, i find it kind of handy when things like operand size are explicit rather than encoded into the operand in a single character | 11:23 | ||
Ven | well, it's supposed to be an exercise for the students: if they're done with the C version, they have to rewrite it. and the school decided to tell people to use gnu asm. so, I'm writing a correction in case any of them submits a solution | ||
(they seem to prefer slacking to that. honestly, I can somewhat get it..) | |||
brrt | .... | ||
well, yeah | |||
anyway, i know this is officially a matter of taste | 11:24 | ||
but i find intel asm to be *much* more legible and explicit about things | |||
actually, just as explicit, but the explicit things are more visible, i guess | |||
Ven | yeah, from looking around the internet (trying to answer my questions), everybody recommended intel synta | 11:31 | |
+x. but oh well. I guess it's still very valuable an experience | 11:32 | ||
brrt | yes, i agree | 11:34 | |
and fun, if you get the hang of it | |||
well, thats my opinion at least | |||
Ven | oh, I need to take a break every few hours because my head hurts a lot, but it's amazing at the same time :-) | 11:45 | |
11:50
co-gnome joined
12:04
co-gnome joined
12:27
co-gnome joined
12:31
mtj_ joined
12:55
Ven joined
|
|||
cognominal_ watches the register chart. Things have evolved since the 6502 and Z80... | 13:15 | ||
13:15
FROGGS joined
|
|||
brrt | yeah, although 'regular' code just uses xmm* and the gpr | 13:16 | |
13:43
synbot6 joined
|
|||
hoelzro | nwc10++ # running address sanitizers on spec tests | 13:50 | |
I'll revert that commit for now, and stuff it into a branch | 13:51 | ||
timotimo | or shall i just try to fix it? | 13:52 | |
13:53
tokuhiro_ joined
|
|||
timotimo | hoelzro: i wonder if it would have been easier to set up the tracking of malloc info via nativecall | 13:53 | |
hoelzro | timotimo: possibly, but I didn't want any possible leaks with nativecall to interfere with my measurements | 13:54 | |
although I could've tested for that first =) | |||
timotimo | right | ||
i'd be interested in such leaks with nativecall | 13:55 | ||
dalek | arVM/callsite-memory-leak: f7a176b | hoelzro++ | src/ (4 files): Restore "Track whether or not a capture owns its callsite" This reverts commit 9befd69353643bff3a529aa5bea8101cd574fa29. |
13:56 | |
nwc10 | hoelzro: couldn't you simply have branched that from the parent of the revert commit? | 13:57 | |
hoelzro | I suppose so | 13:59 | |
then I could've just dealt with the restoration during the merge | |||
timotimo | huh, just some simple re-ordering? | 14:01 | |
i don't actually see how it's read just after being freed ā¦ | |||
hoelzro | I think it's another situation like copy_to | ||
I haven't looked into this new situation, though | |||
when I have time, I might just add a reference count to callsites | 14:02 | ||
timotimo | OK :) | ||
... reference count :\ | |||
especially since that has some ramifications with multi-threading stuff | 14:09 | ||
hoelzro | eesh, good point | 14:27 | |
well, I'll have time to think about it =) | |||
commute & | |||
timotimo | have a good one! | 14:31 | |
14:54
tokuhiro_ joined
|
|||
hoelzro | fg | 15:04 | |
15:30
Ven joined
15:55
Ven joined
|
|||
timotimo | jnthn: i didn't actually look yet, but i'm pretty sure the code i was talking about used failure to signal the fallback "outwards" | 16:16 | |
jnthn | hmm | 16:17 | |
But they should get GC'd really | |||
timotimo | where should i look to find out if backtraces are being kept around and such? | ||
jnthn | So I'm curious how that can happen | ||
Well, see how many MVMExceptions are alive maybe | |||
timotimo | i wonder if the existence of the DESTROY method tickles a bug somewhere? | ||
jnthn | Oh, 'cus it goes on the finalization queue? Maybe but I can't see quite how offhand. | 16:18 | |
timotimo | right | ||
hmm. see how many MVMExceptions are alive ... how exactly? :P | 16:21 | ||
with the heap analyzer? | |||
jnthn | Doesn't the profiler track them? | 16:23 | |
And retention/promotion rates? :) | |||
Maybe we don't label exception creation well enough? | |||
timotimo | i built something to that effect at some point, but it remained buggy | ||
jnthn | s/label/instrument/ | 16:24 | |
timotimo | mhm | ||
huh | 16:25 | ||
it seems like we don't instrument those at all yet | |||
jnthn | wow :) | ||
timotimo | anything beyond newexception that needs that? | 16:26 | |
also, we don't specialize newexception into fastcreate? | |||
ah, because it wants the stacktrace | |||
bleh. i should have put this code into a git repository before doing so many different things with it | 16:27 | ||
also, i should have it on my desktop, too %) | |||
16:31
Ven joined
|
|||
timotimo | i don't actually see a "newexception" show up in the speshlog and a perl6 -e 'my @a; for ^1000 { @a[$_] // Inf }' doesn't show any exceptions allocated | 16:38 | |
jnthn | hm, curious | 16:39 | |
dinner time & | |||
16:52
ilbot3 joined
16:53
moritz joined
16:54
psch joined
16:55
tokuhiro_ joined
|
|||
timotimo | perhaps i shouldn't just have put more and more and more 0s at the end of that number? | 17:01 | |
17:07
Util joined
|
|||
timotimo | once in throw and once in THROW for each, it seems like | 17:13 | |
perhaps the nqp::isconcrete($!ex) is never 1? | 17:14 | ||
@a[$_] actually just returns (Any), obviously | 18:05 | ||
i would have to go for -1 | |||
the speed difference between accessing @a[-$_] and accessing @a[$_] is tremendous | 18:06 | ||
at least this little "benchmark" shows the "gc times increase more and more" problem nicely | 18:09 | ||
18:09
vendethiel joined
|
|||
timotimo | but the gen2 roots just fluctuate rather than growing steadily | 18:10 | |
on the other hand, about 800 KB end up promoted, which i don't really understand | |||
wait what | 18:20 | ||
we're allocating 19999 instances of Perl6::Metamodel::ModuleHow ?! | |||
jnthn | o.O | ||
wtf! | |||
HOW is that happening?! | |||
timotimo | am i seeing this right ?! | 18:21 | |
jnthn | If so, then it's an interesting find... :) | ||
bbiab | |||
timotimo | or is it just something returning an instance of ModuleHOW that gets interpreted as allocated? | ||
nope, that's totally the method new from the ModuleHOW that's allocating these | 18:24 | ||
lizmat | timotimo: is ther much difference between @a.AT-POS($_) and @a.AT-POS(-$_) ? | 18:38 | |
18:38
FROGGS[tab] joined
|
|||
FROGGS[tab] | o/ | 18:38 | |
timotimo | lizmat: i'm just investigating in another direction right now | 18:40 | |
which is: | 18:42 | ||
why do we create two new ModuleHOW whenever we fail something | |||
oh wow | |||
fail() is more expensive than fail("test") in that way | |||
perhaps it's the default value for the payload argument? | |||
18:57
tokuhiro_ joined
18:58
cognominal joined
|
|||
dalek | arVM: c8173b7 | TimToady++ | src/6model/reprs/NFA.c: log nfa offsets into string this allows us to calculate how many times a position was lexed |
19:05 | |
arVM: c393c4e | TimToady++ | src/ (2 files): add rudimentary timing to dynvar logs |
|||
MoarVM: 3ffc453 | TimToady++ | src/ (3 files): | |||
MoarVM: do better at not counting logging time | |||
MoarVM: | |||
MoarVM: (the old code assumed that it takes no time to log dynvar lookups) | |||
jnthn | Looks like somebody's gearing up for some perf work :) | 19:32 | |
timotimo | i had dreamt about building a regex performance analysis thing that'd point out how hot each of the source characters is | 19:46 | |
okay, so why would self.bless(:$exception) cause ModuleHOW.new to be invoked twice? | 19:47 | ||
jnthn | Why do I immediately start thinking how to construct regexes that make certain letters hot to spell naughty things out of innocent words? :) | ||
hoelzro | cdn.meme.am/instances2/500x/2168198.jpg | ||
jnthn | timotimo: I...no idea...what is the BUILD doing? | ||
:P | 19:48 | ||
timotimo | jnthn: i'm having a hard time finding that out ā¦ | 19:50 | |
it kind of looks like a "die" is being called somewhere in there | |||
"for good measure" ?!? | |||
oh | |||
Backtrace gets created via try { die() } | 19:51 | ||
that at least explains why we get an X::AdHoc created for every exception we create | |||
jnthn | Every exception, or every Failure? | 19:53 | |
lizmat | every Backtrace.new | ||
timotimo | what liz said | ||
Failure's BUILD creates the new Backtrace object | 19:54 | ||
lizmat | I have no idea why it works that way | ||
timotimo | however | ||
if $!exception is set, it uses its backtrace instead | |||
lizmat | that line is from 2011 | ||
comment on commit de3997a73635a627c007b: make Backtrace.new() DWIM | 19:55 | ||
timotimo | this still doesn't tell me how the flying fuck we end up creating new ModuleHOW instances :) | ||
jnthn | timotimo: Chase the callgraph until you find that node? :) | 19:56 | |
lizmat | well, not having a die in there, would help speed up all warnings, I would think | ||
timotimo | tried to, failed | 19:57 | |
peppering the code with note("blah") at the moment | 20:02 | ||
could perhaps have to do with Backtrace::Frame? | |||
maybe we would have wanted to put that inside the Backtrace class instead? | |||
soon it'll be food time and my search will be interrupted | 20:04 | ||
jnthn | timotimo: Maybe easiest is just to make ModuleHOW.new dump a backtrace every time it's called (you'll need to do it at NQP level) | 20:05 | |
timotimo | i wanted to do that | 20:07 | |
i asked what the best way was, and i didn't get an answer :) | 20:08 | ||
i've found the offending line | |||
it's try { die() } | |||
i'll have a look at how die() is implemented | |||
jnthn | Oh | 20:09 | |
try { nqp::die(''); CATCH { nqp::say(join("\n", nqp::backtracestrings($_))) } } | 20:12 | ||
timotimo: ^^ | |||
timotimo | thanks | ||
that'll help a lot :) | 20:13 | ||
i'm about to have noms | 20:18 | ||
jnthn | enjoy :) | 20:19 | |
timotimo | gist.github.com/timo/a8ff4eb12e11f1d10db5 | ||
i think it's about the default value for die($payload = ...) | |||
because it uses CALLER::CALLER::... | |||
jnthn | Oh... | ||
timotimo | the very same code is used in Failure and Exception a bunch of times | 20:20 | |
jnthn | We should probably teach the static optimizer to simplify CALLER::CALLER::symbol | ||
(Into the nqp ops) | 20:21 | ||
timotimo | something involving nqp::callerctx(nqp::callerctx(nqp::curctx))? | ||
okay, AFK for noms now | |||
jnthn | right | 20:22 | |
20:24
vendethiel joined
20:30
Ven joined
20:34
colomon joined
20:45
tokuhiro_ joined,
leont joined
|
|||
lizmat | jnthn: perhaps putting in those nqp ops now would already help ? | 21:00 | |
timotimo | that'd be nice, especially since this is perhaps the only place we really stumble over this | ||
jnthn | lizmat: Could do, otoh relying on an optimization in CORE.setting is a great way to make sure it keeps working :P | 21:07 | |
tadzik | oh, exploitable :) | 21:08 | |
lizmat | jnthn: I just wanted to speed up things now... if we can wait for the static optimizer to pick up on this, that's fine by me too :-) | 21:09 | |
leont | jnthn: what is the current state of the async io? (specially processes, but the rest too)? | ||
How feasible would it be for someone who isn't particularly familiar with moar to help out on it? | |||
jnthn | lizmat: I think the static optimizer patch will be relatively easy | 21:10 | |
leont: Depends what you are familiar with, I guess. If working with the libuv API is already something comfortable, that helps. | 21:11 | ||
leont | I've looked over it before, it looked straightforward enough | ||
jnthn | leont: The processes bit I know a copule of people have been polishing of late, to deal with various corner caess. | 21:12 | |
timotimo | lizmat: i'd personally appreciate if you put that in | ||
jnthn | leont: So far as I can tell it's in decent shape. | ||
leont | Should recompile I guess, last time I tried I hit issues | 21:13 | |
timotimo | lizmat: in the mean time, i'll check @a[-$_] vs @a[$_] against @a.AT-POS(-$_) vs @a.AT-POS($_) | ||
jnthn | Also, I've been continuing to hunt down and fix pesky concurrency bugs. | ||
(Such wonders as type finalization timing issues in concurrent GC sweeps...) | 21:14 | ||
timotimo | jnthn: did you see hoelzro's problem about callsites we're leaking? | 21:15 | |
jnthn | timotimo: Yeah, but I simply don't have the brane for it this week with teaching, travel, etc. | 21:16 | |
timotimo | totally acceptable | 21:17 | |
hoelzro | timotimo: I dug in a bit earlier; I think that callsites are shared more than my patch accounts for | 21:19 | |
timotimo | mhh | 21:22 | |
hoelzro | my patch only deals with CallCapture objects that refer to the same callsite | 21:23 | |
I'm pretty sure frames do a lot moar | |||
timotimo | mhh, i see | 21:24 | |
lizmat: the difference between [] and AT-POS is negligible | |||
lizmat | ok, that's good to know... | ||
timotimo | right | 21:25 | |
the difference is most probably just the crazy overhead from the whole failure thing | |||
lizmat | if there was a significant difference, we would have a problem :0) | ||
timotimo | this is 80 seconds vs 0.8 seconds for 100_000 accesses | ||
that's negative indices vs positive indices | |||
lizmat | and posiitive indices with [] vs positive indices with AT-POS ? | 21:26 | |
timotimo | 0.84 vs 0.83 | 21:27 | |
lizmat | I guess you need to increase until a runtime of several seconds :-) | ||
timotimo | sure | 21:28 | |
jnthn | It'll still be similar percentage wise :P | ||
lizmat | well, it's really .74 vs .73 :-) | ||
jnthn | *nod* | 21:29 | |
Mostly these are just "wait for MoarVM's inliner to get smarter" though :) | |||
lizmat | true | 21:30 | |
timotimo | 33.3s vs 29.14s for 5_000_000 accesses | ||
these are accesses to not-yet-existing elements, fwiw | |||
so scalars with a whence and all that | 21:31 | ||
lizmat | m: say .73/74; say 29.14/33.3 | ||
camelia | rakudo-moar dd46c3: OUTPUTĀ«0.009865ā¤0.875075ā¤Ā» | ||
jnthn | Odd that the difference increaess... | ||
timotimo | could be that the gc hadn't kicked in before or something like that? | 21:32 | |
21:32
colomon joined
|
|||
jnthn | Mebbe | 21:32 | |
timotimo | can i simply translate CALLER::CALLER:: to nqp::callerctx(nqp::callerctx(nqp::ctx)) in CALLER::CALLER::.EXISTS_KEY(...) and ::('...')? | 21:35 | |
or do i need a ctxlexpad there? | 21:36 | ||
i probably do | |||
jnthn | I'd just look for cases that end in an indexing operation | 21:37 | |
An even then maybe only constant ones | |||
e.g. when we would never actually expose a pseudo-package | |||
timotimo | oh, i was going to do the hand-optimization first | ||
jnthn | ah :) | 21:38 | |
Then yeah, can do it that way | |||
jnthn should rest up for tomorrow's class | |||
'night | |||
timotimo | i'm apparently syntax-wronging right now | ||
good rest, jnthn! | |||
have fun in class :) | |||
ah, preclimit trouble, probably | 21:39 | ||
it didn't like "and", so i used && instead | 21:44 | ||
time perl6 -e 'my @a; for ^100_000 { @a.AT-POS(-$_) // Inf };' | 21:45 | ||
47.61user 0.30system 0:48.03elapsed 99%CPU (0avgtext+0avgdata 851208maxresident)k | 21:46 | ||
that's not quite 2x better, but it's noticable | |||
but anyway, improving &fail is probably worthwhile | |||
we want people to use this facility, too | |||
in this case it's about improving die, actually | 21:47 | ||
maybe we shouldn't be using a perl6-level die() to create & throw the exception we use to get the backtrace from | |||
lizmat | perhaps we need fail to be cheaper, only create the Backtrace if really necessary | ||
timotimo | whoa | 21:48 | |
lizmat | whoa ? | ||
timotimo | the run time for that is 70% GC | ||
lizmat | yeah, lot's of garbage created in a fail | ||
timotimo | 9899901 Scalars getting allocated from inside BUILDALL | 21:49 | |
sorry | |||
not scalar, BOOTCode | |||
so closures being taken | |||
only 299997 + 299997 Scalars from BUILDALL and another 299997 from backtrace (Exception's backtrace method; why does it allocate scalars??) | 21:50 | ||
hash's AT-KEY allocates another 299997 | 21:51 | ||
fail also allocates scalars: 199998 of them | |||
ah, ok, the number of gen2 roots is climbing a whole lot again there | 21:53 | ||
the last ~50 gc runs (out of 719) take >100ms each | |||
[Coke] | I'm having trouble githubbing from hack. | 22:00 | |
hoelzro | [Coke]: what kind of trouble? | 22:01 | |
hoelzro just cloned rakudo on hack sans problems | |||
[Coke] | just hangs. | ||
timotimo | i wonder how that one anon block inside BUILDALL gets to deopt | 22:02 | |
hoelzro | [Coke]: what operation(s) hang? | 22:03 | |
[Coke] | git push; git pull --rebase | 22:10 | |
hoelzro | both of them hang? | 22:12 | |
22:25
oetiker joined
|
|||
timotimo | so here's a data point | 22:33 | |
using NativeCall to get at puts() is quite a bit faster than nqp::say | |||
but NativeCall also has a whole bunch of overhead still | |||
so we^WI really need to put in direct synchronous I/O | 22:36 | ||
lizmat | :-) | 22:46 | |
22:51
tokuhiro_ joined
|
|||
timotimo | huh | 23:25 | |
actually | |||
it seems like libuv also offers synchronous IO - at least on files - and we're using that | |||
huh. but only for files, not for streams | 23:26 | ||
right, our implementation of say() will epoll_wait between every instance of say | 23:27 | ||
leont | That makes sense | 23:35 | |
timotimo | it does? | 23:40 | |
epoll_wait(5, {}, 1024, 0) = 0 | |||
what does that even mean? | |||
hm, well, at least it won't block or wait at all | 23:41 | ||
leont | It means it did a non-blocking wait for at most 1024 events | 23:47 | |
And it didn't return any events | |||
timotimo | ok, that's what i expected | 23:54 |