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

时间:2017-11-08 12:19:49

标签: java parallel-processing pixels

我有一个图像像素的浮点[] [],我将对该图像的每个像素执行一个操作。我目前的实施如下:

float[][] pixels = image.pixels;

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

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

        //perform operation on pixel

    }

}

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

3 个答案:

答案 0 :(得分:0)

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

2)或者,您可以通过使用线程自己完成并行操作,并将数据集的子部分委托给不同的线程,如果您执行更多轻量级任务,则可以使用ForkJoin线程,或者只使用普通线程。

答案 1 :(得分:0)

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

 D
Daiwa House Industry
Danske Bank
DaVita HealthCare Partners
Delphi Automotive
Denso
Dentsply International
Deutsche Boerse
Deutsche Post
Deutsche Telekom
Diageo
Dialight
Digital Realty Trust
Donaldson Company
DSM
DS Smith  E
East Japan Railway Company
eBay
EDP Renováveis
Edwards Lifesciences
Elekta
EnerNOC
Enphase Energy
Essilor
Etsy
Eurazeo
European Investment Bank (EIB)
Evonik Industries
Express Scripts 

F
Fielmann
First Solar
FMO
Ford Motor
Fresenius Medical Care

答案 2 :(得分:0)

更改迭代顺序:

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?了解更多详情。