Hello--
Trying to find out better ways to profile parallel code in Julia, I came
across a suggestion to rebuild Julia and use "Vtune amplifier" from Intel
(never heard of Vtune), or to somehow have each worker call a function to
turn profiling on and off somehow.
When I run my code, there is a lot that seems to be going on: lines
involving dict.jl and multi.jl and task.jl, and some or much of it does not
seem to relate directly to a function call of mine. One could try to guess
the answer "decryption-style" by removing various lines of code and trying
to guess what changes. But this is essentially impossible for my
application, since it is a stochastic simulation, and deleting lines
changes the subsequent behavior even with the same random seed. I'm hoping
for something better than voluminous println()'s !
The idea of mapping everything Julia is doing to some specific call may or
may not even describe the way it works precisely. However, this sort of
information
...
5 ./multi.jl; RemoteValue; line: 590
2 ./array.jl; fill!; line: 158
11 multi.jl; schedule_call; line: 636
2 dict.jl; setindex!; line: 546
2 ./tuple.jl; isequal; line: 69
...
while interesting, is not actionable. Nowhere in this particular subtree do
my function calls get named (not shown). I know something, somewhere, is
causing a tremendous bottleneck, despite having converted arrays to
SharedArrays, removed references to global data that were hiding in default
arguments, and so on...but I still can't tell where it is! (I don't have a
small minimal postable version of the code.)
Is there a way to have multiple profile output objects, and have the
profile data rerouted into different ones as I go? It might at least
provide some insight (I realize operation 1 might leave the system in a
state where operation 2 might have extra work to do through no fault of its
own, so it might not be simple.)
The dream would be:
Profile.init_bucket(1)
Profile.init_bucket(2)
@profile bucket=1 filter(data1,nsteps=24)
@profile bucket=2 filter(data2,nsteps=24)
etc.
So then I could
Profile.print(bucket=1)
to see what went on in the first one, etc.
I know the syntax doesn't work; I'm not asking for it to, but does anyone
know a way to do this sort of thing? Save profile data and swap it in and
out, for example? deepcopy(Profile) obviously fails! Ultimately I've got to
connect profile output with lines of code, function calls, or data objects !
Thanks; I hate to post things like this but if there's an answer, somebody
here will know it, and it might benefit somebody besides me.