如何在 Java 中并行化二维数组?

How to parallelise a 2d array in Java?

我有一个图像像素的float[][],我将对这个图像的每个像素执行一个操作。我目前的实现如下:

float[][] pixels = image.pixels;

for(x = 0; x < pixels[0].length; x++) {

    for(y = 0; y < pixels.length; y++) {

        //perform operation on pixel

    }

}

此实现非常慢,我想通过并行化 for 循环来加快速度,我该怎么做?

您有 2 个主要选择。
1)将使用流(Java8 +),这取决于您在操作中所做的事情,并行性主要为您完成,因为您可以使用并行流(注意:对于小型数据集,有与之相关的开销和顺序流实际上可以提供相当的性能)。

2) 或者,您可以使用线程自己进行并行处理,并将数据集的子部分委托给不同的线程,如果您正在执行更轻量级的任务,则可以使用 ForkJoin 线程或仅使用普通线程。

您可以使用Java 8. 流使用并行执行操作,这比仅使用单个线程的顺序执行更快。因此,您可以尝试使用以下代码来执行比嵌套 for 循环性能更好的任何操作。

    Float[][] pixels = new Float[][]{{1f,2f,3f},{1f,2f,3f}};
    Float[][] pixelArray = Arrays.stream(pixels)
                           .map(arr -> Stream.of(arr).chooseWhatYouWantToDo())
                           .toArray(Float[][]::new);

更改迭代顺序:

float[][] pixels = image.pixels;

for(y = 0; y < pixels.length; y++) {

    for(x = 0; x < pixels[y].length; x++) {

        //perform operation on pixel

    }
}

在这些类型的操作中,大部分时间用于内存访问。如果在内层循环中迭代外层数组,那么内存访问就不是顺序的,会导致大量缓存未命中。参见例如Why does the order of the loops affect performance when iterating over a 2D array? 了解更多详情。