2017-11-08 19 views
0

私は画像のピクセルの浮動小数点[] []を持っています、私はこの画像の各ピクセルで操作を実行します。次のように私の現在の実装は次のようになります。Javaで2次元配列を並列化するには?

float[][] pixels = image.pixels; 

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

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

     //perform operation on pixel 

    } 

} 

この実装は非常に遅く、私はforループparallelisingことによってそれをスピードアップしたい、どのように私はこれをやって行くのでしょうか?

+0

最も良い方法は、JDK8を使用してこれらのピクセルをストリームに変換することです。コンテキスト交換のためにメモリ(1MBあたり1MB)と1ピクセルあたりの並列化によるオーバーヘッドが実際には遅くなることがあります。 1つのコアあたり1つのスレッドがあなたができる最高の可能性があります。 – duffymo

答えて

0

主なオプションは2つあります。
1)あなたの操作で何をしているのかに応じて、ストリーム(Java8 +)を使用していますか?パラレルストリームを使用することができるので、並列処理はほとんどあなたのために行われます(注意:小さなデータセットの場合、実際には同等の性能をもたらすかもしれない)。

2)スレッドを使用して並列処理を実行し、データセットのサブセクションを別のスレッドに委譲できます。軽量なタスクを実行している場合は、ForkJoinスレッドまたは通常のスレッドのみを使用できます。

0

Java 8を使用することができます。ストリームは、1つのスレッドのみを使用するシーケンシャル実行よりも高速なパラレル実行操作を使用します。したがって、ネストされた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); 
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?をご覧ください。

+0

あなたのリンクはCです。Javaの場合、コードが実行されるハードウェアやOSがわからない場合があります。私は単純な2Dの "配列の塗りつぶし"を両方の繰り返しを使って行い、タイミングに違いはなかった。 – edharned