|
00:02
zakharyas joined
00:04
yoleaux2 joined
|
|||
| timotimo | i'm getting super tired super fast | 00:06 | |
| maybe i'll sign out soon | 00:09 | ||
| samcv | kk | ||
| timotimo | i'm definitely relieved that these frames are actually jitted | 00:10 | |
| have you had a chance to find the spesh output in the log for these inner for loop frames? | |||
| samcv | no | ||
| i can't really tell what's going on in the spesh log | |||
| timotimo | the graph spesh tool helps you make sense of the superstructure of the BBs | 00:11 | |
| samcv | Of 52159936 specialized or JIT-compiled frames, there were 3216089 deoptimizations (that's 6.17% of all optimized frames). | ||
| is that a lot of depopts or normal | |||
| so i guess on my computer it takes 16 seconds to sort all the cp. though idk if it was slowed down by doing my str @sorted = %points.keys.sort.... | 00:13 | ||
| the native str type or possibly the array did it too, idk | |||
| what would be the fastest way to assign it to something. | |||
| i mean obv a scalar but. i know arrays can cause reification right | 00:14 | ||
| timotimo | that's all right | ||
| arrays will itemize each element at least | |||
| i.e. put things into scalar containers | 00:15 | ||
| samcv | lol still taking 70.7900297 seconds to run that section of code | ||
| timotimo | not native arrays of course | ||
| samcv | was about 79 for me before | ||
| timotimo | what did you change? | ||
| samcv | i just did the sorting outside of it | ||
| timotimo | ah | ||
| samcv | so didn't gain 16 seconds | ||
| but gained like 9 | |||
| timotimo | well, you probably sort more than once all in all | 00:16 | |
| it has like 70 entries? | |||
| samcv | no it has hundreds of thousands | ||
| i sorted twice at least in that file | |||
| i think i may sort in another file | |||
| timotimo | the tab with the profile in it crshed :) | ||
| samcv | just say you want to wait | 00:17 | |
| and it will eventually work | |||
| it's just slow | |||
| or did it fully crash? | |||
| timotimo | no, it full on crashed | ||
| had to reload | |||
| i do know about the telling it to wait, i've used the profiler for a while :P | |||
| it does that for almost all workloads ;( | 00:18 | ||
| there's a qt/c++ program that can interpret the json output from the profiler, but it's feature-incomplete | |||
| and what's even worse is that the json parser it uses refuses to load files above a random size | |||
| which we routinely surpass | |||
| but it'd probably make more sense to base a gui on the SQL output instead | 00:19 | ||
| what i meant with "like 70 entries" is the sort | |||
| MERGESORT-REIFIED-LIST-AS | |||
| i see a sort with 14 entries, one with 205 entries, one with 106 and another with 8 | 00:20 | ||
| so more than i thought, but not as many as you said, so you were looking at something else? | |||
| timotimo relocates closer to bed | 00:21 | ||
| any questions before i dip into dreamland? | 00:37 | ||
| samcv | let me read | 00:38 | |
| oh some of the sorts are sorting things of not very many elements | 00:39 | ||
| though some of the modules do some sort which i can remedy | |||
| no that's it i think, you can sleep | 00:40 | ||
| timotimo | have you calculated how many msec per entry the for loops take? | 00:41 | |
| samcv | which ones, the point index ones | ||
| with the stuff i took out of the other sub? | |||
| i have not | |||
| timotimo | that'd interest me | 00:43 | |
| samcv | how do i find that | ||
| timotimo | just a rough estimate would be enough | ||
| samcv | let me see | 00:44 | |
| timotimo | just opening the profile again myself | 00:45 | |
| so, the inner loop, right? | |||
| m: say "spent 20136 | |||
| camelia | rakudo-moar b51a55: OUTPUTĀ«===SORRY!=== Error while compiling <tmp>ā¤Unable to parse expression in double quotes; couldn't find final '"' ā¤at <tmp>:1ā¤------> say "spent 20136ā<EOL>⤠expecting any of:⤠argument list⤠double quotes⤠ā¦Ā» | ||
| timotimo | durrr | 00:46 | |
| m: say "spent { 20136 / 29792280 }ms per iteration" | |||
| camelia | rakudo-moar b51a55: OUTPUTĀ«spent 0.00067588ms per iterationā¤Ā» | ||
| samcv | i haven't pushed the latest changes in removing the sort | ||
| computing now | |||
| Finished computing all rows, took 67.3072336 for 354670 elems. Now creating the final unduplicated version. | 00:48 | ||
| so 0.0001889s per iteration | 00:49 | ||
| timotimo | so, i notice method Bool is taking up a surprising amount of time | ||
| samcv | 0.188908 ms | ||
| would this call bool nqp::if(nqp::atkey(points-point, $prop), '1', '0') | 00:50 | ||
| that would hold a boolean value | |||
| points-point{$prop} = True/False | |||
| also what is calling the Bool | 00:51 | ||
| timotimo | oh, there's definitely a bool object in there? | ||
| samcv | yes it's either True or false | 00:52 | |
| should i change it to nqp::atkey(points-point, $prop) ?? '1' !! '0' | |||
| timotimo | maybe try =:= True | 00:53 | |
| the profile crashed again :\ | |||
| samcv | but what if it's set to 1 on accident | 00:54 | |
| lol. | |||
| then it wouldn't give the right value | |||
| timotimo | do you call &so or prefix:<?> or prefix:<!> or something somewhere hot? | ||
| samcv | no | ||
| i don't think | |||
| timotimo | hmm | ||
| anyway, the spesh for the innermost loop looks okay | |||
| there's some lexical lookups that might be expensive perhaps? | 00:55 | ||
| and of course the always-beloved setlex a lexical and then immediately getlex it again | 00:56 | ||
| samcv | timotimo, check it out again | ||
| and get my latest changes | |||
| s/check out/pull | |||
| timotimo | right | 00:57 | |
| now it bites us in the butt that we don't generate a map for perf and friends to understand | 00:58 | ||
| so they can't introspect our jitted code at all :( | |||
| otherwise we could figure out what pieces of the jitted code are hot and what pieces are not so hot | 00:59 | ||
| is atkey2 small? it gets called every time, and calling stuff can be costly | 01:01 | ||
| perhaps you can inline it manually and see if that helps? | |||
| samcv | it just calls atkey( atkey( )) | ||
| is in now inlining it? | |||
| let me try putting it back to how i had it before | 01:03 | ||
| timotimo | if it's so small, it's probably costly to call it each time | 01:04 | |
| let me run it again to see if it gets inlined | 01:05 | ||
| i'm not sure why it would do that now as compared to before, though? did you change something inside the inner loop? | |||
| samcv | ok it may make it 2s faster | ||
| no | |||
| timotimo | how do you figure? | ||
| samcv | it went from 67s to 65s | 01:06 | |
| timotimo | oh | ||
| samcv | when i put back the code i previously removed | ||
| timotimo | well, that's underwhelming | ||
| samcv | yeah | ||
| timotimo | oh, those are the comments all over the place? | ||
| samcv | yea | ||
| 782 | |||
| timotimo, just pushed it with the code as it was week ago or so | 01:07 | ||
| timotimo | i'm not sure i understand how that can be equivalent to the code below it? | ||
| samcv | see changes in the last commit | ||
| timotimo | you could try what happens if you turn the for loop into a while loop and manually shifting the array (need to clone) or an iterator over it (don't need to clone) | 01:09 | |
| because then we might have the chance that the inner loop gets inlined into the outer loop | |||
| getting rid of a few million frame invocations | |||
| samcv | both for loops into while loops? | 01:10 | |
| timotimo | and then see if you can get it to stash the object reference to these lexicals you defined at the beginning of the sub into the inner loop | ||
| try only the inner one first | |||
| samcv | ok | ||
| timotimo | i'll go sleep for reals now :) | 01:11 | |
| good luck! | |||
| samcv | night | ||
| timotimo, should i use an actual iterator object? | |||
| timotimo | night | ||
| samcv | or just like a c for loop or something | ||
| except in perl 6 obv | |||
| timotimo | i was thinking nqp::iterator over the $!reified of the array | 01:12 | |
| see the core setting for how to cheat the $!reified out of an Array/List object | |||
| samcv | in $!reified | ||
| err | |||
| src/core/Rakudo/Iterator.pm | |||
| timotimo | but doing a c-style for loop and atpos might also be worth a try | ||
| a loop loop | 01:13 | ||
| samcv | yeah | ||
| nqp::getattr(list,List,'$!reified') | |||
| like that? | |||
| timotimo | actually ... you can use a normal rakudo iterator and .pull-one | ||
| that's how | |||
| samcv | @array.iterator? | ||
| doesn't that automatically happen with a for loop? | 01:14 | ||
| timotimo | i ... think so | ||
| i never had to do this | |||
| yes, but the for loop ends up calling the sub you give it a bunch of times | |||
| samcv | what is the 'that's how' refering to. your message the line previous? | ||
| or what i asked | |||
| timotimo | the getattr code | ||
| samcv | ok | ||
| timotimo | that's what i meant | ||
| samcv | kk | ||
| timotimo | anyway, with a while loop we may have the inner block embedded directly into the outer block and only a thin piece of code before and after to make the looping happen | ||
| rather than having to have sink-all call the sub every time | 01:15 | ||
| samcv | so do i need to get an iterator each time? | ||
| for each cp? | |||
| nqp::getattr(list,List,'$!reified') i mean | |||
| timotimo | 'fraid so | ||
| how many times does the inner loop run per codepoint? | |||
| samcv | like | 01:16 | |
| 20 | |||
| timotimo | oh | ||
| for some reason i had thought it'd be more often | |||
| samcv | well more than 20 | ||
| depends how many props you are building | |||
| may be 35tm not 100% sure | |||
| timotimo | in that case you'd probably have to turn the outer loop into such a while loop, too | ||
| and yeah, there'd have to be a new iterator every time | |||
| samcv | and so how do i get the next thing out of the iterator? | 01:17 | |
| do i use nqp or perl 6 | |||
| timotimo | for the iterator class you linked to in Iterator.pm, you'd use .pull-one until it returns IterationEnd | ||
| samcv | my $iter = nqp::getattr(@list,List,'$!reified'); so that i need the pull one | ||
| ok | |||
| timotimo | you could look at the implementation of .sink-all and friends | ||
| with $!reified, you'll get a low-level nqp list | 01:18 | ||
| samcv | oh ok | ||
| so i need to use nqp. i can do that | |||
| timotimo | with @list.iterator you'd get the thing with .pull-one and such | ||
| samcv | ok | ||
| timotimo | you have a choice between nqp and perl6 stuff here | ||
| samcv | nqp sounds fine | ||
| timotimo | OK | ||
| i'll leave now, otherwise i'd end up staying up all night | 01:19 | ||
| samcv | night | ||
| timotimo | o/ | ||
| samcv | uh how do i tell if iterator has more | ||
| with nqp::elems? or? | 01:20 | ||
| if this went properly it took 46 instead of 60 seconds making the inner loop a while loop | 01:36 | ||
| cloning the iterator for each cp | |||
| nice it did work fine | 01:37 | ||
| 30% speedup. not too shabby | |||
|
01:42
lizmat joined
01:45
MasterDuke joined
|
|||
| samcv | nice now at 38 instead of 46 | 01:49 | |
| MasterDuke | nice. you figured out how to use nqp::iterator i assume? | 01:50 | |
| samcv | nope | 01:51 | |
| but sorta i suppose | |||
| i had to change it from my str @blah; to just @blah though | |||
| not sure how to iterate a native array | |||
| maybe have to clone the object and then shift it | |||
| not sure if that will be faster | |||
| but i can try | |||
| MasterDuke | nqp: my $l =: nqp::list("ab", "cd"); my $i := nqp::iterator($l); while $i { say(nqp::shift($i)) } | 01:52 | |
| camelia | nqp-moarvm: OUTPUTĀ«Assignment ("=") not supported in NQP, use ":=" instead at line 2, near ": nqp::lis"⤠at gen/moar/stage2/NQPHLL.nqp:765 (/home/camelia/rakudo-m-inst-1/share/nqp/lib/NQPHLL.moarvm:panic)⤠from <unknown>:1 (/home/camelia/rakudo-m-inst-1/share/nqp/lib/nqp.moaā¦Ā» | ||
| MasterDuke | nqp: my $l := nqp::list("ab", "cd"); my $i := nqp::iterator($l); while $i { say(nqp::shift($i)) } | ||
| camelia | nqp-moarvm: OUTPUTĀ«abā¤cdā¤Ā» | ||
| samcv | let me try a native array and cloning the whole array instead of cloning the iterator | 01:53 | |
| m: my str @array = 'test', '123'; use nqp; say nqp::iterator(@array) | |||
| camelia | rakudo-moar b51a55: OUTPUTĀ«Cannot find method 'gist': no method cache and no .^find_method⤠in block <unit> at <tmp> line 1ā¤ā¤Ā» | ||
| samcv | m: my str @array = 'test', '123'; use nqp; my $item := nqp::iterator(@array); say nqp::elems($item) | ||
| camelia | rakudo-moar b51a55: OUTPUTĀ«This representation (VMIter) does not support elems (for type BOOTIter)⤠in block <unit> at <tmp> line 1ā¤ā¤Ā» | ||
| samcv | vmiter isn't in nqp docs | 01:54 | |
| m: my str @array = 'test', '123'; use nqp; my $item := nqp::clone(@array); say nqp::elems($item) | 01:56 | ||
| camelia | rakudo-moar b51a55: OUTPUTĀ«2ā¤Ā» | ||
| MasterDuke | m: my @array = "test", "123"; use nqp; my $item := nqp::iterator(nqp::getattr(@array,List,q|$!reified|)); nqp::while($item, say(nqp::shift($item))) | 01:58 | |
| camelia | rakudo-moar b51a55: OUTPUTĀ«testā¤123ā¤Ā» | ||
| samcv | so i'll see which is faster | ||
| cause i pulled out the nqp iterator and cloned that every time | |||
| i will compare to cloning the native array and shifting that instead of shifting the iterator | |||
| (not calling getattr each time, only calling it once and cloning the object that returned) | 01:59 | ||
| MasterDuke | you're comparing against atpos? | 02:00 | |
| samcv | no | 02:01 | |
| comparing against using nqp iterator | |||
| shifting the iterator each time | |||
| m: my str @array = 'test', '123'; use nqp; my $item := nqp::clone(@array); say nqp::shaft($item) | 02:03 | ||
| camelia | rakudo-moar b51a55: OUTPUTĀ«===SORRY!===ā¤No registered operation handler for 'shaft'ā¤Ā» | ||
| samcv | m: my str @array = 'test', '123'; use nqp; my $item := nqp::clone(@array); say nqp::shift($item) | ||
| camelia | rakudo-moar b51a55: OUTPUTĀ«MVMArray: shift expected string register⤠in block <unit> at <tmp> line 1ā¤ā¤Ā» | ||
| samcv | argh | ||
| m: my str @array = 'test', '123'; use nqp; my $item := nqp::clone(@array); say nqp::shift(@array) | |||
| camelia | rakudo-moar b51a55: OUTPUTĀ«MVMArray: shift expected string register⤠in block <unit> at <tmp> line 1ā¤ā¤Ā» | ||
| samcv | m: my str @array = 'test', '123'; use nqp; my $item := nqp::clone(@array); say nqp::shift_s(@array) | 02:04 | |
| camelia | rakudo-moar b51a55: OUTPUTĀ«testā¤Ā» | ||
| samcv | \o/ | ||
| MasterDuke | do you want to shift @array or $item? | 02:07 | |
| samcv | well item, since i'm cloning it | 02:08 | |
| but it works fine for $item | |||
| ok not sure if it's faster using a native array or not | |||
| well it maybe it's 41s now, maybe it was 45 before, not sure | |||
| ok 38.44655769 before. so doesn't seem to make it faster | 02:11 | ||
| slower and or it's just being different between runs | 02:12 | ||
| MasterDuke | oh well | 02:13 | |
| samcv | but i clone the nqp iterator so that probbaly pretty fast | ||
| 38 instead of 73 is good | 02:14 | ||
| MasterDuke | almost half | ||
| samcv | yep :) | ||
|
02:49
ilbot3 joined
03:04
zostay_ joined
03:06
avarab joined
03:08
geekosaur joined
03:19
MasterDuke joined
03:50
agentzh joined
|
|||
| samcv | not sure why but my program goes from 42 to like 60 seconds if i change from a perl 6 while loop to a nqp while loop | 06:25 | |
| all the code inside the while loop is nqp | |||
| maybe it's not getting JIT'd hmm | |||
| or maybe something else | 06:26 | ||
| wow i'm down to 166 seconds | 06:30 | ||
| for a build without the names | 06:31 | ||
|
06:40
brrt joined
07:13
stmuk_ joined
|
|||
| Geth | MoarVM/even-moar-jit: 4e857e9690 | (Bart Wiegmans)++ | 2 files Refactor spill_register Because it is also necessary to be able to spill a specific register (rather than just any), I need to reuse the logic for spilling a live range, which has been extracted. The logic to find a spillable position and to select the 'optimal' live range for spilling has also been split out because they can develop independently. |
07:23 | |
| brrt | next up; indirect-mode two-ref fixing | 07:25 | |
|
07:48
brrt joined
|
|||
| brrt | good *, by the way :-) | 07:58 | |
| samcv | good ( | 08:01 | |
| err * | |||
| brrt | :-) | 08:02 | |
| jnthn | morning o/ | 09:57 | |
| brrt | moarning jnthn | 10:00 | |
| timotimo | o/ | 10:01 | |
| dogbert11 | o/ | 10:02 | |
| timotimo | i'm really glad the iterator and while-loop suggestion gave good results | ||
| dogbert11 | jnthn: so what's on the agenda today? | 10:03 | |
| jnthn | Well, at the moment just looking over recent RT tickets to see if any particularly merit my attention :) | 10:04 | |
| samcv | morning | 10:05 | |
| jnthn | o/ | ||
| samcv | me too timotimo | ||
| for some reason the perl 6 while loop is fairly faster than nqp while loop | |||
| timotimo | that's weird indeed | ||
| samcv | and that's changing nothing at all except turning while nqp::elems($iter) into nqp::while(nqp::elems($iter | 10:06 | |
| yeah | |||
| timotimo | i could compare the spesh logs | 10:08 | |
| a more proper spesh diff tool would really be nice to have *cough* | |||
| i pulled and the outer loop is still a for loop | 10:10 | ||
| brrt | perl6s 'blocks are function calls' dogma is really costly in loops | 10:11 | |
| timotimo | just backlogging right now, samcv, you said todd could /{3 - 2}/, and that "it evaluates to True" | 10:12 | |
| samcv | uh. i didn't say that | ||
| timotimo | but raw code blocks in regex have no effect on the matching by themselves; you'd need <?{ }> or <!{ }> for that | ||
| oh? let me re-read | 10:13 | ||
| samcv | i was giving an example of how it evalutes things | ||
| ah ok | |||
| well i was pointing out bracketns in perl 6 cause the code in it to be executed | |||
| dogbert11 | jnthn, timotimo: apart from MVM_string_repeat the function collapse_strands is used here as well github.com/MoarVM/MoarVM/blob/mast...ops.c#L397 | 10:14 | |
| do you see any dangers therein? | |||
| jnthn | Will take a look soon :) | 10:15 | |
| timotimo | no danger there, AFAICT | ||
| dogbert11 | timotimo: sounds promising | 10:16 | |
| timotimo | i'm surprised nobody suggested .contains($Thingie) rather than ~~ /$Thingie/ | 10:17 | |
| jnthn | I think it's codepaths with allocate_strands that want a close look | ||
| timotimo | the difference in speed should be about a gazillion times | ||
| all 6 occurrences of allocate_strands look safe upon first glance | 10:20 | ||
| samcv | gazillion | 10:21 | |
| timotimo | in scientific terms, yes | ||
| jnthn | Been through all the allocate_strands also | 10:24 | |
| timotimo | i don't really know how to do it, but at some point a regex like that should definitely be compiled to just compile to .contains | ||
| dogbert11 | and hopefully samcv hasn't stumbled on any more nasty bugs .. | 10:26 | |
| samcv | heh | ||
| not yet | |||
| Geth | MoarVM: 7b2e3d943c | (Jonathan Worthington)++ | src/strings/ops.c Factor out repeated code. |
||
| jnthn | Currently trying to figure out rt.perl.org/Ticket/Display.html?id=130692 fwiw | 10:27 | |
| Ah. Argh. | 10:31 | ||
| Wondered how soon we'd run into this fun... | |||
| timotimo | uh oh | ||
| jnthn | The basic problem is that various things in Supply internals use locks | 10:54 | |
| Which isn't automatically a problem. | |||
| But when we do an await somewhere in such a call stack, the lock "moves" | 10:55 | ||
| To another thread on resume | |||
| timotimo | oh, and our locks are re-entrant | ||
| jnthn | Right | ||
| timotimo | and so when a different thread resumes and unlocks, it thinks that one doesn't own the lock | ||
| and explosion happens | |||
| jnthn | Yup | ||
| timotimo | but we also can't just unlock when we continuation outwards | 10:56 | |
| jnthn | MoarVM catches that, so no overly bad explosion at VM level | ||
| Right | |||
| timotimo | so ... we need something "more" than reentrant | ||
| where the owner isn't just GetCurrentThread, but ... GetOwnerObject | |||
| jnthn | Well, the immediate fix is to install an awaiter in Lock.protect | ||
| That forces a real blocking | |||
| timotimo | OK, so when you're holding a lock, you can't actually switch ot another thread | 10:57 | |
| right | |||
| jnthn | Thing is, that'll hurt anyone who does reasonable things like an await in a supply block | 10:58 | |
| timotimo | aye, that's not so great | ||
| jnthn | We kinda need a Lock::Awaitable | ||
| dogbert11 | sounds difficult | ||
| timotimo | can the awaiter that belongs to the lock semi-undo the lock (like, set a regular variable to 1, unlock the lock) and then await via the outer awaiter? | ||
| jnthn | timotimo: Not sure that's a too good idea | 10:59 | |
| A Lock::Awaitable basically would work like: | |||
| timotimo | yeah, i see some problems with it already | ||
| jnthn | await $alock.lock(); | ||
| Which will either complete immediately if you get it | 11:00 | ||
| Or suspend you until you can have it | |||
| (In a pool-efficient way) | 11:01 | ||
| timotimo | right | ||
| samcv | that sounds great | 11:02 | |
| jnthn | We might also want to replace the mechanism in supply/react blocks with this | ||
| As I'm not entirely happy with the contention handling there at the moment | 11:03 | ||
| If we have two producers | |||
| timotimo | we need punny names for our inspection tools. i suggest "Inspeshtor Gadjit" | 11:04 | |
| jnthn | And the supply block has tapped them both | ||
| When the first will emit a value | |||
| Then it notes the fact it's "working" in the supply block by putting itself onto a queue and then running itself | 11:05 | ||
| Well, running the code in the appropriate whenever | |||
| timotimo | that's the current implementation, right? | ||
| jnthn | Yes | ||
| If the second supply then emits a value while the first is being processed, then it sees it can't process it now | |||
| timotimo | ISTR how it does the queueing its own work stuff | ||
| jnthn | So it just sticks it into the queue and goes on its own way | ||
| timotimo | so the queue can grow pretty big, yeah? | 11:06 | |
| jnthn | When the first emitter is done, it sees new work arrived and decides to help out with it | ||
| timotimo | that's something that you'd call "backpressure", or a lack thereof? | ||
| jnthn | So yeah, there's two things here | ||
| First, there's no backpressure on the second emitter. Depending on the nature of it we might not get any anyway of course. | |||
| timotimo | oh, so when you emit, you might end up with your emitting thread doing work for hours before it can on its own resume | ||
| jnthn | But also, yes, you might end up doing a lot more work than you expected | 11:07 | |
| I mean, it's implicit that emit is a blocking operation for the sender | |||
| But it might be surprising that you end up doing somebody elses work too :) | |||
| timotimo | right | ||
| on your thread, no less | |||
| jnthn | Yup | ||
| timotimo | but we don't really offer thread local storage | ||
| jnthn | Before we used real locks | ||
| timotimo | except maybe when you nativecall | ||
| jnthn | But that ran into a deadlock in some cases | 11:08 | |
| 5f1249e843b in Rakudo did that change fwiw | 11:10 | ||
| Also pondering rt.perl.org/Ticket/Display.html?id=130716 in this | 11:12 | ||
| timotimo | ah, that one | 11:13 | |
| jnthn | Thing is, the way to do cleanup is a CLOSE block | 11:22 | |
| Except we never get change to run it, because the supply block's main body is always holding the "lock", as it were | 11:23 | ||
| timotimo: Did your last/redo in whenever stuff get merged? | 11:38 | ||
| Geth | MoarVM: 5538029892 | (Daniel Green)++ | src/strings/ops.c Del unused var, don't call MVM_string_graphs twice |
11:40 | |
| MoarVM: 542baec756 | (Jonathan Worthington)++ | src/strings/ops.c Merge pull request #537 from MasterDuke17/minor_optimization_to_MVM_string_indexing_optimized Minor optimization to MVM_string_indexing_optimized |
|||
| jnthn | Ah, no, it wasn't | 11:43 | |
| samcv | do we need to flush stdout to proc async? | 11:47 | |
| jnthn | samcv: What are you observing that's making you ask? | 11:49 | |
| samcv | gist.github.com/7bbb850655bcc3fa27...46a911b4a6 | ||
| i'm getting Broken from this | |||
| dogbert11 | timotimo, jnthn: is this gist 'informative' or is a case of 'something was clobbered at an earlier stage'? gist.github.com/dogbert17/d3d73521...968eb135a9 | 11:50 | |
| samcv | broken for the call to .print | ||
| jnthn | The :r isn't needed (and ignored) fwiw | ||
| samcv | maybe it's the tap not working | 11:52 | |
| jnthn | "This process is not opened for write"...huh | ||
| Wait, does echo even accept stuff on stdin? | 11:54 | ||
| echo foo | echo at the shell does nothing | |||
| Except print an empty line | |||
| samcv | oh | ||
| yeah it seems to work with cat | |||
| but not with my program hmm | 11:55 | ||
| jnthn | Was gonna say, :w can't be entirley busted 'cus I'm using it in $dayjob code running dozens of times a day | ||
| samcv | i'm using scanf also tried gets | 11:56 | |
| and it doesn't respond back. but running from terminal is fine | |||
| can it not do relative paths? though i'd think it'd give an error- | 11:57 | ||
| not getting stdout even when i make it show a message on starting it | 11:58 | ||
| this should work right my $proc = Proc::Async.new('./build/bitfield', :w, :r); | |||
| jnthn | The :r is redundant as mentioned earlier | ||
| samcv | yeah but that changes nothing | ||
| jnthn | Otherwise, don't see anthing wrong there | ||
| *anything | |||
| samcv | wtf | 11:59 | |
| jnthn | lunch; bbi30 | 12:10 | |
| samcv | i gotta go to bed. night all | 12:12 | |
| moritz | \o | ||
| jnthn back | 12:37 | ||
| dogbert11 | jnthn: was the gist crap, i.e. should I valgrind/ASAN the code? | 12:49 | |
| jnthn | dogbert11: No, it makes sense | 13:15 | |
| I know how to fix that one :) | |||
| dogbert11: What code is it from, ooc? | 13:17 | ||
| Something small enough we can add it as a spectest? | |||
| Currently looking at a fragility in Supplier::Preserving | 13:19 | ||
| dogbert11 | jnthn: MoarVM #458 and RT #128833 | 13:24 | |
| synopsebot6 | Link: rt.perl.org/rt3//Public/Bug/Displa...?id=128833 | ||
| dogbert11 | I believe that the RT bug was two problems from the beginning but you fixed the first some time ago | 13:26 | |
| it's still a bit difficult to reproduce (for me that is) however it became easier when I learned how to autmatically (re)run a program in gdb until it crashes | 13:27 | ||
| jnthn | :) | 13:34 | |
| Yay, I think I've fixed the Supplier::Preserving bug | 13:50 | ||
| Language lesson now | |||
| Will turn that into a spectest, then have a reliable fix for japhb++ | |||
| bbi1h | |||
| dogbert11 | .oO | 14:35 | |
|
14:44
Ven joined
15:33
japhb joined
|
|||
| jnthn | m: gist.github.com/jnthn/a4b1dee67863...3e4cd5c5c8 | 15:39 | |
| camelia | rakudo-moar b51a55: OUTPUTĀ«not ok 1 - Received expected messages (0)ā¤ā¤# Failed test 'Received expected messages (0)'ā¤# at <tmp> line 25ā¤# expected: '1 2 3 4 5'ā¤# got: '35'ā¤not ok 2 - Received expected messages (1)ā¤ā¤# Failed test 'Received expected messages (1)'ā¦Ā» | ||
| timotimo | you mixed tabs and spaces! ;) | 15:43 | |
| jnthn | wat? | 15:53 | |
| *sigh* | 15:54 | ||
| Why can't everyone just use spaces :P | |||
| And why does /\t in vim not find them | |||
| Oh, :retab I guess should sort it out | 15:55 | ||
| timotimo | :set tabexpand or :set notabexpand | 16:21 | |
|
16:35
japhb joined
|
|||
| jnthn | timotimo: I think if you have :set paste, those don't deal with it? | 16:39 | |
| timotimo | if you have :set paste, it won't do anything at all, IIUC | 16:40 | |
| so if you're pasting something with tabs, you'll get tab characters | |||
| even if you :set tabe | 16:41 | ||
| no, it's expandtab | |||
| :set et | |||
| jnthn | Yeah, that's what I did | ||
| So original musta had tabs :) | |||
| timotimo | likely | 16:42 | |
| jnthn tests a fix for the issue dogbert11++ golfed/gisted earlier today | 16:58 | ||
| Well, best I can, anyway | |||
| Got it running in a loop in gdb | |||
| Geth | MoarVM/even-moar-jit: f7aef159f7 | (Bart Wiegmans)++ | 2 files Special case handling of ARGLIST ARGLIST can create more references than can fit in the register set and register assignment to an ARGLIST reference will not work. So special-case those. |
16:59 | |
| timotimo | one more step towards function calls! | 17:00 | |
| jnthn | \o/ | 17:01 | |
| dogbert11: I pushed the fix for the thing you gisted earlier; feel free to give it a try out | 17:16 | ||
| m: for ^10 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | 17:18 | ||
| camelia | ( no output ) | ||
| jnthn | m: for ^100 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | ||
| camelia | rakudo-moar cf500e: OUTPUTĀ«(signal )Ā» | ||
| jnthn | aha | 17:19 | |
| but...which signal... | |||
| m: for ^100 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | |||
| camelia | ( no output ) | ||
| jnthn | m: for ^100 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | ||
| camelia | ( no output ) | ||
| jnthn | m: for ^100 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | ||
| camelia | rakudo-moar cf500e: OUTPUTĀ«(signal )Ā» | ||
| dogbert17 | jnthn: will test | ||
| jnthn | OK, not just resoruce consumption | ||
| dogbert17: Could you try out the thing I just sent to the evalbot on a build without it? | |||
| without the fix, that is | 17:20 | ||
| commitable: 2017.01 for ^100 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | |||
| ah, not here | |||
| dogbert17 | ok | ||
| SEGV | 17:21 | ||
| jnthn | Seems that it'll be a decent test to cover it though | ||
| Nice :) | |||
| timotimo | i can ask them to get the *able bots in here | ||
| dogbert17 | so you got it, impressive | ||
| timotimo | also, we could try to figure out why camelia doesn't understand what signal that is | ||
| dogbert17 | SEGV seems to be in the same place as the original bug | 17:22 | |
| ================================================================= | 17:23 | ||
| ==12090== ERROR: AddressSanitizer: heap-use-after-free on address 0x90f14fdc at pc 0xb6061c56 bp 0x9c2dd828 sp 0x9c2dd81c | |||
| READ of size 4 at 0x90f14fdc thread T16 | |||
| #0 0xb6061c55 in bind_key /home/dogbert/repos/rakudo/nqp/MoarVM/src/6model/reprs/MVMHash.c:98 | |||
| jnthn | cool | 17:26 | |
| dogbert17 | jnthn: that means that you can close at least one RT and a MoarVM issue | ||
| jnthn | You got the IDs of those two handy? | 17:29 | |
| dogbert17 | MoarVM #458 and RT #128833 | ||
| synopsebot6 | Link: rt.perl.org/rt3//Public/Bug/Displa...?id=128833 | ||
| dogbert17 | it seem as if this wasn't a bug in MoarVM after all | 17:30 | |
| timotimo | the "bug" is that hashes aren't threadsafe | ||
| jnthn | We shouldn't SEGV, but yeah, code assuming they are threadsafe is wrong | 17:31 | |
| timotimo | jnthn: got a better place to put the vmhealth implementation than moar.c? | ||
| jnthn | Add a new file for it, perhaps? | 17:32 | |
| timotimo | ugh, so much work :) | ||
| dogbert17 | :) | 17:33 | |
| there are now only ~30 RT tickets marked SEGV. I don't think all of them are valid anymore | 17:34 | ||
| jnthn | RT closed | 17:35 | |
| dogbert17 | cool | ||
| should I close the MoarVM one then? | 17:36 | ||
| jnthn | Just did ;0 | ||
| dogbert17 | :) | 17:37 | |
| timotimo turns "number of threads" into "number of threads in each state" | |||
| mst | timotimo: and make sure you give texas extra | 17:38 | |
| jnthn | Uff, tired...guess I'll have to save the next issues I want to look into until tomorrow | ||
| timotimo | of course | ||
| dogbert17 | maybe it's time for dinner? | ||
| jnthn | Something like that :) | 17:39 | |
| dogbert17 | should MoarVM be bumped or should we wait until after this months release? | ||
| timotimo | it gets bumped for the release anyway | 17:43 | |
| at least we've done it like that forever | |||
| if we didn't want something for "in" the release, we'd put it into a branch for the time being | |||
|
17:44
camelia joined
|
|||
| jnthn | Odd, rt.perl.org/Ticket/Display.html?id=130690 notes that it's sensitive to MVM_SPESH_DISABLE | 17:45 | |
| Oh...was about to say it seems to go away under just MVM_JIT_DISABLE, but it showed up just after I was gonna write it :P | 17:46 | ||
| IOninja | m: for ^400 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | ||
| camelia | ( no output ) | ||
| IOninja | m: for ^400 { my \g = EVAL 'grammar { token TOP { <a> | <b> }; token a { \d | \s }; token b { a | b } }'; await (start g.parse('b')) xx 8 } | ||
| camelia | ( no output ) | ||
| IOninja | m: use NativeCall; sub raise(int32) is native { * }; raise 11 | 17:47 | |
| camelia | rakudo-moar 62bd30: OUTPUTĀ«(signal SEGV)Ā» | ||
| IOninja | There. Fixed forever. | ||
| jnthn | IOninja++ | ||
| timotimo | i'm also going to want to give out the number of threads marked as "blocked for gc", right? for vmhealth, i mean | ||
| jnthn | Could do, yeah | 17:48 | |
| OK, will continue with this bug tomorrow... | 17:49 | ||
| Rest; bbiab | |||
| timotimo | good rest! | ||
|
18:17
Geth joined
18:20
ggoebel joined
|
|||
| timotimo | i'm not sure if i should be polling the GC Status for threads that aren't in stage 3 (running iirc) | 19:06 | |
|
20:14
agentzh joined
20:21
agentzh joined
|
|||
| jnthn | timotimo: At some point they cease to have a ->tc | 20:27 | |
| timotimo | it'll get nulled out properly, though? | 20:28 | |
| jnthn | Yes | 20:33 | |
| dogbert17 | should this snippet recurse infinitely? class SQLString { }; my $stringy = Str.^find_method("Stringy"); my $handler = $stringy.wrap(method () { SQLString.new(:str(callsame)) }); say "foo".Stringy | ||
| timotimo has seen this before :) | |||
| if it should recurse/hang then we should be able to close github.com/MoarVM/MoarVM/issues/412 since jnthn has fixed the callsame bug which caused it to crash | 20:35 | ||
| jnthn | m: class SQLString { }; my $stringy = Str.^find_method("Stringy"); my $handler = $stringy.wrap(method () { SQLString.new(:str(callsame)) }); say "foo".Stringy | ||
| camelia | rakudo-moar a62882: OUTPUTĀ«(timeout)Ā» | 20:36 | |
| jnthn | m: class SQLString { }; my $stringy = Str.^find_method("Stringy"); my $handler = $stringy.wrap(method () { SQLString.new(:str(callsame)) }); say "foo".WHAT | 20:37 | |
| camelia | rakudo-moar a62882: OUTPUTĀ«(Str)ā¤Ā» | ||
| jnthn | m: class SQLString { }; my $stringy = Str.^find_method("Stringy"); my $handler = $stringy.wrap(method () { SQLString.new(:str(callsame)) }); say "foo".Stringy.WHAT | ||
| camelia | rakudo-moar a62882: OUTPUTĀ«(SQLString)ā¤Ā» | ||
| jnthn | m: class SQLString { }; my $stringy = Str.^find_method("Stringy"); my $handler = $stringy.wrap(method () { SQLString.new(:str(callsame)) }); say "foo".Stringy.Str | ||
| camelia | rakudo-moar a62882: OUTPUTĀ«SQLString<59372912>ā¤Ā» | ||
| jnthn | m: class SQLString { }; my $stringy = Str.^find_method("Stringy"); my $handler = $stringy.wrap(method () { SQLString.new(:str(callsame)) }); say "foo".Stringy.gist | ||
| hah | |||
| Well, I guess .gist calls .Stringy on something | 20:38 | ||
| camelia | rakudo-moar a62882: OUTPUTĀ«(timeout)Ā» | ||
| jnthn | Which is reasonable I guess | ||
| dogbert17 | and the SEGV is gone | 20:39 | |
| jnthn | Wrapping Str.Stringy probably counts as playing with fire | ||
| If the SEGV is gone then it's certinaly not a moar bug any more :) | |||
| dogbert17 | but I can't close it, perhaps nine should do that | 20:40 | |
| jnthn | I think I'd need more persuading that it's a Rakudo bug | ||
| I mean, for starters SQLString doesn't even do the Stringy role | |||
| dogbert17 | I'm not going to try to do that :) | 20:44 | |
| but there are several MoarVM issues open that I believe have been solved already | 20:47 | ||
| timotimo | food time \o/ | 20:53 | |
| dogbert17 | kabooom: gist.github.com/dogbert17/c1f9fe86...6422570694 | 21:48 | |
| jnthn | Innerestin' | 21:51 | |
| dogbert17 | it's the code from rt.perl.org/Public/Bug/Display.html?id=130494 run with a 64k nursery and GC_DEBUG=1 | 21:53 | |
| jnthn wonders where this bug will end up being | 22:03 | ||
| It's...odd | |||
| It almost looks like a double-release of an object | |||
| Or double-gc_free of it | |||
| Phew, nearly got my grant report done | 22:10 | ||
| dogbert17 | I have the strand and gc-fixes in 'my' moarvm, do you think thay might be involved in which case I can remove them | 22:21 | |
|
22:34
MasterDuke joined
|
|||
| timotimo | i wonder if there's any circumstances where we share decodestream across objects | 22:34 | |
| or clone the insides of a decodestream? | |||
| i.e. the pointer there | |||
| MasterDuke | timotimo: have you seen this? is it a legit problem? gist.github.com/MasterDuke17/5f071...0f388b51d4 | 22:37 | |
| timotimo | probably no problem | 22:45 | |
| it happens basically every single time we precomp | 22:46 | ||
| MasterDuke | causes the test to fail | 22:47 | |
| to be more precise, the test fails occasionally. when i run it in valgrind, i get that output occasionally, i assumed they were related | |||
| timotimo | oh? | 22:48 | |
| maybe i should look closely into it | |||
| what do i have to run to get that exact one, MasterDuke | 23:13 | ||
| oh | |||
| there it is | |||
| for those all the "program did not hang" tests all fail all the time | 23:24 | ||
| is that because of valgrind slowing things down? | 23:25 | ||
| i think you can only get that error if you have precompilation happening | 23:27 | ||
| and it's potentially not important what process you're running as long as there's some precomp | 23:31 | ||
| ah, interesting | 23:32 | ||
| (i said interesting because i looked at the right line in a different file) | 23:34 | ||
| i don't get it. i changed the offending allocation to calloc and it still says uninitialized memory? | 23:38 | ||
| maybe it's memcpying some uninitialized bytes into it or something | |||
| it seems to be inside the serialized blob | 23:41 | ||