【发布时间】:2020-05-12 01:37:07
【问题描述】:
如果我有在嵌套循环中执行的代码
int height = ...;
int width = ...;
int sourceIncrement = ...;
int destIncrement = ...;
int sourceOffset = ...;
int destOffset = ...;
int sourceArray[] = ...;
byte destArray[] = ...;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int pixel = sourceArray[sourceOffset ++];
destArray[destOffset ++] = (byte) (pixel );
destArray[destOffset ++] = (byte) (pixel >> 8);
destArray[destOffset ++] = (byte) (pixel >> 16);
destArray[destOffset ++] = (byte) (pixel >> 24);
}
sourceOffset += sourceIncrement;
destOffset += destIncrement;
}
我想让它并行运行,我会尝试使用流来实现
IntStream.range(0, height).parallel().forEach(y -> {
IntStream.range(0, width).parallel().forEach(x -> {
int pixel = sourceArray[sourceOffset ++];
destArray[destOffset ++] = (byte) (pixel );
destArray[destOffset ++] = (byte) (pixel >> 8);
destArray[destOffset ++] = (byte) (pixel >> 16);
destArray[destOffset ++] = (byte) (pixel >> 24);
});
sourceOffset += sourceIncrement;
destOffset += destIncrement;
});
但这是错误的,因为偏移量会在依赖于它们的代码运行之前增加。实际上是否有可能使其正确并行运行?
【问题讨论】:
-
为内部循环的每次迭代计算
destOffset和sourceOffset。例如,它看起来只是sourceOffset = (i + sourceIncrement) * height + j。 -
@AndyTurner 那么我可以并行化外循环吗?内循环呢?
-
如果您管理偏移量计算,则不需要两个循环。
标签: java loops optimization concurrency java-stream