[ImageJ-devel] [fiji-devel] imglib2-neon project for runtime bytecode transformation

Albert Cardona sapristi at gmail.com
Tue Sep 23 21:41:16 CDT 2014


Hi Tobias,

Just to add to the cheer. It is not everyday that one sees 97% improvements on performance. I understand this is preliminary. Looking forward to seeing it applied in real world code.

Albert


> On Sep 23, 2014, at 7:02 PM, Tobias Pietzsch <pietzsch at mpi-cbg.de> wrote:
> 
> Hi guys,
> 
> As a weekend project I have started to look into bytecode modification using the wonderful ASM library (http://asm.ow2.org).
> I have cleaned up what I have played with and put it on github https://github.com/tpietzsch/neon.
> 
> It tackles a long-standing imglib obstacle, namely megamorphic call-sites in certain methods, where the JIT fails to recognise that the runtime target of the polymorphic changes between calls to a method but doesn’t change in the hot inner loop of the method during a single call. I have been talking about ideas to address this for quite some time, most recently here https://github.com/imglib/imglib/issues/71#issuecomment-51227237. Now I went ahead and actually tried to do something about it.
> 
> I have applied it to an example in imglib, which is described below. But for anyone not familiar with this particular issue (which is everyone except Christian probably) there
> is an illustrative example with explanations in the README on github https://github.com/tpietzsch/neon/blob/master/README.md.
> This does not involve imglib at all and is a clear illustration of the problem (and my solution).
> 
> I’m quite happy with how it turned out so far. It certainly has to be applied with care, but I think this can be potentially huge for imglib2. It might open up new possibilities that we have shied away from because of performance reasons, such as internal iteration for IterableIntervals.
> 
> Curtis, Johannes and Christian, I would also be interested what you think of this as a potential tool for imagej-ops.
> I think it is orthogonal to what you do with compile-time code generation currently and therefore might complement it nicely.
> 
> I hope you have a look and tell me what you think.
> I would be especially interested in whether you can think of optimization idioms besides the @Instantiate @ByTypeOf that is implemented right now.
> It would be cool if we discuss this in the upcoming imglib hackathon.
> 
> Okay, everybody except Christian might as well stop reading now.
> 
> all the best,
> Tobias
> 
> 
> 
> 
> 
> PS: the imglib stuff...
> 
> For the imglib issue https://github.com/imglib/imglib/issues/71, we played with ways of iterating pixels which can be optimized for certain subintervals of larger images.
> The optimizations work out nicely when done on their own, but everything really breaks down when a single method is used with differnent Cursor incarnations.
> This is actually already a potential problem in standard imglib, when Cursors from different Img types are uses in a single method. But adding the new optimized versions
> only made it more probable that the problem actually occurs.
> 
> Here is numbers from a recent test, at a stage where 4 different kinds of cursors are in play:
> 
> normal cursor | array img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    566    |    371    | 195ms       | 34.4%       |
> 
> localizing cursor | array img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    907    |    584    | 323ms       | 35.6%       |
> 
> normal cursor | planar img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    562    |    373    | 189ms       | 33.6%       |
> 
> localizing cursor | planar img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    928    |    611    | 317ms       | 34.1%       |
> 
> 
> With the neon java agent this improves to:
> 
> normal cursor | array img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    153    |    8    | 145ms       | 94.7%       |
> 
> localizing cursor | array img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    235    |    200    | 35ms       | 14.8%       |
> 
> normal cursor | planar img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    128    |    8    | 120ms       | 93.7%       |
> 
> localizing cursor | planar img
> walk through a subinterval
>    | Unoptimized    | Optimized    | Speedup Time    | Speedup %    |
> Best    |    217    |    208    | 9ms       | 4.1%       |
> 
> 
> A speedup of factor ~4 to ~40 can be observed.
> These two runs were made with exactly the same code, but for the second one, the program was run with the option
>   java -javaagent:/path/to/neon-1.0.0-SNAPSHOT.jar …
> 
> I just pushed the example to https://github.com/imglib/imglib/commit/a9b70d923e9a84c4055acae96f71d05ca4a26344
> 



More information about the ImageJ-devel mailing list