BoneJ2 icon indicating copy to clipboard operation
BoneJ2 copied to clipboard

Use LoopBuilder to multithread Modern plugins

Open mdoube opened this issue 4 years ago • 4 comments

Describe the bug LoopBuilder is the ImgLib2 way to achieve chunked multithreading, see this for an example (specifically, the 'squared sum' example) https://forum.image.sc/t/imglib2-split-image-into-chunks-for-multi-threaded-processing/37519/4

Modern Connectivity currently uses 8 cursors to achieve multithreading, which is a bit of a hack.

https://github.com/imagej/imagej-ops/commit/6a60315419fad3745a456f9cc2719e7897d7b762#diff-d6c590f31ede52f4518dba0b4a44cf9fR261

    				final Cursor<B> octantCursor1 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor2 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor3 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor4 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor5 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor6 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor7 = Views.flatIterable(interval).cursor();
    				final Cursor<B> octantCursor8 = Views.flatIterable(interval).cursor();

    				octantCursor1.jumpFwd(start);
    				octantCursor2.jumpFwd(start + w);
    				octantCursor3.jumpFwd(start + 1);
    				octantCursor4.jumpFwd(start + w + 1);
    				octantCursor5.jumpFwd(start + w * h);
    				octantCursor6.jumpFwd(start + w * h + w);
    				octantCursor7.jumpFwd(start + w * h + 1);
    				octantCursor8.jumpFwd(start + w * h + w + 1);

    				for (int i = 0; i < steps; i++) {
    					boolean o1 = octantCursor1.next().get();
    					boolean o2 = octantCursor2.next().get();
    					boolean o3 = octantCursor3.next().get();
    					boolean o4 = octantCursor4.next().get();
    					boolean o5 = octantCursor5.next().get();
    					boolean o6 = octantCursor6.next().get();
    					boolean o7 = octantCursor7.next().get();
    					boolean o8 = octantCursor8.next().get();

Additional context Any change to the code needs to be performance benchmarked and reported to @maarzt If it works out, we might be able to improve the performance of other Modern plugins like VolumeFraction

mdoube avatar May 14 '20 09:05 mdoube