Skip to content

Commit 83ee3c4

Browse files
committed
Use multithreading with neighborhood Ops
Without multi-threading an image operated on with a neighborhood Op takes extremely long to compute. For example, take an input image with shape (512, 512, 256) and dtype. Using a RectangleShape neighborhood with a span size of 4, keeping the center, and the "filter.median" Op takes a shocking 1521.778 seconds or 25.36 minutes to complete. With multi-threading added the compute time goes down to 496.36 seconds or 8.27 minutes. [PC specs] OS: Debian Bookworm 12.9 x86_64 CPU: 11th Gen Intel(R) Core(TM) i7-1185G7 (8) @ 4.80 GHz RAM: 32 GB
1 parent 62f2078 commit 83ee3c4

1 file changed

Lines changed: 6 additions & 6 deletions

File tree

scijava-ops-image/src/main/java/org/scijava/ops/image/adapt/LiftNeighborhoodComputersToRAI.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private LiftNeighborhoodComputersToRAI() {
6060
var extended = Views.extend(in, oobf);
6161
var neighborhoods = shape.neighborhoodsRandomAccessible(extended);
6262
var intervaled = Views.interval(neighborhoods, in);
63-
LoopBuilder.setImages(intervaled, out).forEachPixel(op);
63+
LoopBuilder.setImages(intervaled, out).multiThreaded().forEachPixel(op);
6464
};
6565
}
6666

@@ -77,7 +77,7 @@ private LiftNeighborhoodComputersToRAI() {
7777
var extended = Views.extend(in, oobf);
7878
var neighborhoods = shape.neighborhoodsRandomAccessible(extended);
7979
var intervaled = Views.interval(neighborhoods, in);
80-
LoopBuilder.setImages(intervaled, out).forEachPixel(op);
80+
LoopBuilder.setImages(intervaled, out).multiThreaded().forEachPixel(op);
8181
};
8282
}
8383

@@ -97,7 +97,7 @@ private LiftNeighborhoodComputersToRAI() {
9797
var extended = Views.extend(in1, oobf);
9898
var neighborhoods = shape.neighborhoodsRandomAccessible(extended);
9999
var intervaled = Views.interval(neighborhoods, in1);
100-
LoopBuilder.setImages(intervaled, out).forEachPixel((in, container) -> op
100+
LoopBuilder.setImages(intervaled, out).multiThreaded().forEachPixel((in, container) -> op
101101
.compute(in, in2, container));
102102
};
103103
}
@@ -115,7 +115,7 @@ private LiftNeighborhoodComputersToRAI() {
115115
var extended = Views.extend(in1, oobf);
116116
var neighborhoods = shape.neighborhoodsRandomAccessible(extended);
117117
var intervaled = Views.interval(neighborhoods, in1);
118-
LoopBuilder.setImages(intervaled, out).forEachPixel((in, container) -> op
118+
LoopBuilder.setImages(intervaled, out).multiThreaded().forEachPixel((in, container) -> op
119119
.compute(in, in2, container));
120120
};
121121
}
@@ -136,7 +136,7 @@ private LiftNeighborhoodComputersToRAI() {
136136
var extended = Views.extend(in1, oobf);
137137
var neighborhoods = shape.neighborhoodsRandomAccessible(extended);
138138
var intervaled = Views.interval(neighborhoods, in1);
139-
LoopBuilder.setImages(intervaled, out).forEachPixel((in, container) -> op
139+
LoopBuilder.setImages(intervaled, out).multiThreaded().forEachPixel((in, container) -> op
140140
.compute(in, in2, in3, container));
141141
};
142142
}
@@ -154,7 +154,7 @@ private LiftNeighborhoodComputersToRAI() {
154154
var extended = Views.extend(in1, oobf);
155155
var neighborhoods = shape.neighborhoodsRandomAccessible(extended);
156156
var intervaled = Views.interval(neighborhoods, in1);
157-
LoopBuilder.setImages(intervaled, out).forEachPixel((in, container) -> op
157+
LoopBuilder.setImages(intervaled, out).multiThreaded().forEachPixel((in, container) -> op
158158
.compute(in, in2, in3, container));
159159
};
160160
}

0 commit comments

Comments
 (0)