01:50
FROGGS_ joined
02:44
retupmoc1 joined,
[Coke]_ joined
02:45
avuserow_ joined,
sergot_ joined,
btyler_ joined
02:52
japhb joined
02:58
FROGGS_ joined
06:57
camelia joined
07:49
FROGGS[mobile]2 joined
09:14
FROGGS[mobile] joined
10:18
camelia joined
12:37
kjs_ joined
13:22
Ven_ joined,
FROGGS[mobile] joined
13:29
vendethiel joined
13:45
zakharyas joined
14:05
FROGGS[mobile]2 joined
|
|||
timotimo | is there any sense in having an op that "merges" strings together when you find they are equal? | 15:35 | |
15:36
Ven_ joined
|
|||
timotimo | like, the eq operator could - given a string from the nursery that's eq to a string in the gen2 - box the string in the gen2 into/assign to the other object and it'd generate less spill-over into the next nursery (or alternatively the gen2) | 15:36 | |
and if we have eqat for a size over a certain threshold, we could generate the substring as a piece of rope | 15:37 | ||
.o( leave it to timotimo to come up with weird optimization opportunities that may or may not be waaaayyy premature ) | 15:38 | ||
15:56
kjs_ joined
|
|||
timotimo | i'm not totally sure what exact properties i have to aggregate in order for the stuff to be correct in the end | 16:34 | |
i'll figure something out. | |||
jnthn | timotimo: I can imagine some kind of interning working... | 16:36 | |
BUT | |||
As soon as you start cheating on immutables, you run the risk of losing the nice thread safety properties immutable things freely give. | |||
timotimo | ah, yes, that's right | 16:38 | |
i think what my code will end up looking will be this: | 16:39 | ||
if the depth is reached, i'll add the "this one's an aggregated node" to the hash and call a different function for all the callees | |||
that way i don't duplicate the setup code for the hash at least | 16:40 | ||
jnthn | Right | ||
Well, at lesat allocation stats and exclusive time want merging | 16:41 | ||
And deopt/spesh counts too | |||
timotimo | OK, let's see | 16:44 | |
hm, will i need to touch the hash of the aggregate node when i'm working through the tree below? | 16:54 | ||
it seems so, as i'll have to remove the times frmo the exclusive time | 16:55 | ||
17:27
Ven_ joined
|
|||
timotimo back from le shopping | 17:56 | ||
i think i'll factor out the "pcn -> hash" part | 17:59 | ||
18:04
Ven_ joined
|
|||
timotimo | jnthn: how come the allocations get emitted after we go through the allocations? | 18:16 | |
18:17
kjs_ joined
|
|||
jnthn looks confusedly at timotimo's question | 18:18 | ||
timotimo | er | ||
after we go through the *callees* | |||
jnthn | Oh... | ||
timotimo | it doesn't seem important | ||
jnthn | It isn't | ||
But allocation profiling was one of the last features I added | |||
So it comes last 'cus it, well, came last :) | 18:19 | ||
timotimo | OK | ||
the code looks like it's a whole lot, but ... | 19:26 | ||
hm. am i finished? | 19:37 | ||
i don't think this is going to compile without lots of massaging %) | 19:38 | ||
src/profiler/profile.c:110:13: warning: passing argument 2 of āMVM_repr_elemsā makes pointer from integer without a cast [enabled by default] | 20:01 | ||
existing_allocations = MVM_repr_elems(tc, MMV_repr_at_key_o(tc, node_hash, pds->allocations)); | |||
ooooh | |||
NOW i see it! | |||
FROGGS | MMV | ||
timotimo | yeah | 20:02 | |
and the other instance was writing MVM_repr_at_key | |||
(see if you can spot the error) | 20:03 | ||
FROGGS | _o | ||
timotimo | yup | 20:09 | |
sorry to keep you hanging for that long | |||
FROGGS | *g* | ||
timotimo | wow, this ended up a *lot* of code :\ | 20:14 | |
20:17
odc joined
|
|||
timotimo | i can't believe it compiles | 20:17 | |
damn: Cannot iterate object with P6opaque representation | 20:32 | ||
ah, i understand. NQPMu. | 20:35 | ||
it may work this time | 20:39 | ||
no clue if the results will make sense, though | |||
welp, i have an output | 20:42 | ||
i still get NaN% and NaNms for many routines in the "exclusive time" piece :( | 20:46 | ||
the call graph looks ... :\ | 20:48 | ||
well, i'll just upload it and stash my result somewhere as well | 20:50 | ||
now i'll actually have the opportunity to go ahead and do that, too! | 21:04 | ||
(but first i'll have to generate a new profile output file) | |||
oh, i don't think i'm actually recursing at all | 21:05 | ||
that's not good | |||
jnthn | One thing to try is to write something that recurses a 1000 calls deep or so | 21:06 | |
And maybe allocates something at each level | 21:07 | ||
And then see how it compares with your changes vs. without | |||
timotimo | my call graph depth limit is currently just 32 | 21:08 | |
jnthn | The allocation counts should come out the same, for example. | ||
timotimo | aye | 21:10 | |
21:11
zakharyas joined
|
|||
timotimo | that froze my computer for a solid 10 minutes ... | 21:17 | |
maybe not that long | |||
ah | 21:20 | ||
i was still creating new callees lists for each callee in the aggregate node recursively | 21:21 | ||
at least i get a segfault now, so i'll find something easier | 21:24 | ||
i did silly things | 21:37 | ||
well, it doesn't seem to max out my ram any more | 21:42 | ||
the output actually looks sane now | 21:52 | ||
you can has code. | 21:53 | ||
dalek | arVM/finite_callgraph_depth: e706ca1 | (Timo Paulssen)++ | src/profiler/profile.c: merge profiler data starting at 32 call levels deep this lets us get a profiler output from the core setting |
21:56 | |
jnthn | timotimo: gut feeling tells me 32 is too shallow, but we can tune it :) | 21:57 | |
22:11
Ven_ joined
|
|||
timotimo | t.h8.lv/profile-1412458985.39989.html - le big file | 22:12 | |
44mb in fact | 22:13 | ||
ah, so deserialization_code takes up the most time? interesting | 22:14 | ||
jnthn | Well, that means "doing the serialization" I guess | 22:16 | |
Wow, chrome loaded it | |||
Wow...we spend THAT long in GC?! | 22:17 | ||
timotimo | yup :) | ||
oh holy fuck | |||
we do | |||
jnthn | Something feels...very odd...about that | ||
timotimo | oh yeah | 22:18 | |
the GC times rise and rise | |||
the more stuff we have | |||
jnthn | For one that it doesn't match the C-level data I have, which suggests a number more like 20% | ||
timotimo | aye, could be bogus | ||
aaaaah | 22:19 | ||
i divide by 1000 too often | |||
let me try again :) | |||
jnthn | Yeah, something is odd | 22:22 | |
timotimo | i'm generating a new profile as we speak | 22:23 | |
dalek | arVM/finite_callgraph_depth: cb7647e | (Timo Paulssen)++ | src/profiler/profile.c: don't do bogus divide by 1000 operation |
22:24 | |
timotimo | still takes a long while to actually finish | 22:25 | |
and it finishes right as i complain %) | |||
filename's profile-1412461543.12799.html in the same folder, but not finished uploading yet | 22:26 | ||
give it half a minute | |||
should be up now | 22:30 | ||
er ... huh? no change? | 22:31 | ||
jnthn | Something must be wrong still, i think... | 22:34 | |
See deserialization_code | |||
timotimo | ooooh | ||
hold on | |||
jnthn | exclusive time shoudl never be bigger than inclusive time... | ||
timotimo | yeah, i'm doing that wrong when i go through the aggregated children | ||
jnthn | Still, it's great we're on the cusp of having nice profile data for CORE.setting compilation :) | 22:35 | |
timotimo | i grab the total_time each time instead of taking more stuff | ||
jnthn | timotimo++ | ||
timotimo | i'm glad i'm getting out of my "doing nothing" phase a bit | 22:44 | |
jnthn | :) | 22:49 | |
Hopefully I can get out of mine soon too :) | |||
Sleep time for now, though... :) | |||
timotimo | conference driven design for the APW? :) | ||
can i get one last tip? | |||
i need to do the exclusive time calculation wholy differently it feels like | 22:50 | ||
i need to grab the "exclusive time so far" and add the current merge-candidate's total time minus the callee's total time? | |||
does that sound right? | |||
jnthn | Yeah, I think so | 22:51 | |
Meaning you are adding them up as you come back up the tree | |||
Well | |||
Doesn't have to be that way I guess... | |||
timotimo | i think i can implement that | ||
jnthn | *nod* | 22:52 | |
timotimo | seems like i just had to type it out on irc once before i put it into the injection mold :) | ||
the big C-shaped injection mold | |||
jnthn | :) | ||
I wonder if the GC numbers really are correct | |||
timotimo | gosh i hope not! :) | ||
jnthn | Well...if they are...we know where to look... :) | ||
But given we often see other things getting GC overheads of < 10%, it does seem extreme | 22:53 | ||
We may be hitting a pathological case | |||
timotimo | ah, another thing i should definitely *not* do is subtract the pcn->succ[i].total_time after i've done the "merging" | ||
that should come way later | |||
when the merging is done, and i shouldn't be looking at an individual's succ[i].total_time at all | 22:54 | ||
jnthn | *nod* | 22:55 | |
OK, I'm going for some rest | |||
'night | |||
timotimo | gnite! | ||
thanks for the little kick in the butt :) | |||
oh, i think i've been putting data into the wrong hash all along! | 23:23 | ||
ah, not quite ; i think this is all a tiny bit much for my tiny bit of brain %) | 23:24 | ||
no, what i've actually done is not pass on the right hash | 23:27 | ||
that would have caused data to only bubble up one layer each time, except for the layer where we actually aggregate ... so the time is just lost | 23:33 | ||
the GC times still seem wrong | 23:34 | ||
well, i keep finding things that are wrong, but it still seems to end up wrong all in all ... | 23:42 | ||
huh, wait, the total time isn't a sum of all the time spent in calls, it's just end time - start time | 23:43 | ||
so wrongness in the call graph shouldn't cause such wrong numbers for the gc vs the whole time ?! |