このforループの計算速度を最適化する方法は?

ラウル

私は(少なくとも私にとっては)難しい問題に悩まされています。コードをプロファイリングしたときに、(シングルコアの)計算時間のほぼすべてが、以下の単一のネストされたループ(画像の二重積分)によって消費されていることに気付きました。コンピューティングを加速するための最良の方法は何だと思いますか?

ネストされたストリームにマップしようとしましたが、複数のifブロックをマップする方法がわかりません... OpenCLを使用してGPUでマップしようとすると、問題により適していますか?

ipはImageJImageProcessorであり、その方法.getPixelValue(x,y)もかなりのリソースを消費します。ただし、確立されたlibに属しているため、可能であれば変更は避けたいと思います。

変数宣言:

private ImageProcessor ip = null; //This type comes from ImageJ
private double area;
private double a11, a22;
private double u1, u2;
private double v1, v2;
private double y1, y2;
private static final double HALF_SQRT2 = sqrt(2.0) / 2.0;
private static final double SQRT_TINY =
    sqrt((double)Float.intBitsToFloat((int)0x33FFFFFF));

関数:

private double contrast (
) {
    if (area < 1.0) {
        return(1.0 / SQRT_TINY);
    }
    double c = 0.0;
    final int xmin = max((int)floor(u1), 0);
    final int xmax = min((int)ceil(v1), width - 1);
    final int ymin = max((int)floor(u2), 0);
    final int ymax = min((int)ceil(v2), height - 1);
    if ((u1 < xmin) || (xmax < v1) || (u2 < ymin) || (ymax < v2)){
        return(1.0 / SQRT_TINY);
    }
    if ((xmax <= xmin) || (ymax <= ymin)) {
        return(1.0 / SQRT_TINY);
    }
    for (int y = ymin; (y <= ymax); y++) {
        final double dy = y2 - (double)y;
        final double dy2 = dy * dy;
        for (int x = xmin; (x <= xmax); x++) {
            final double dx = y1 - (double)x;
            final double dx2 = dx * dx;
            final double d = sqrt(dx2 + dy2);
            double z = a11 * dx2 + a12 * dx * dy + a22 * dy2;
            if (z < SQRT_TINY) {
                c -= ip.getPixelValue(x, y);
                continue;
            }
            z = a3 / sqrt(z);
            double d0 = (1.0 - z / SQRT2) * d;
            if (d0 < -HALF_SQRT2) {
                c -= ip.getPixelValue(x, y);
                continue;
            }
            if (d0 < HALF_SQRT2) {
                c += SQRT2 * d0 * ip.getPixelValue(x, y);
                continue;
            }
            d0 = (1.0 - z) * d;
            if (d0 < -1.0) {
                c += ip.getPixelValue(x, y);
                continue;
            }
            if (d0 < 1.0) {
                c += (1.0 - d0) * ip.getPixelValue(x, y) / 2.0;
                continue;
            }
        }
    }
    return(c / area);
マイク

分割統治法を試すことができます。

画像をn個の部分に分割し、それらを並行して処理します。ただし、境界(2つの部分が交わる場所)で発生するエッジケースを処理する必要があります。

または、(離散)積分を計算し、並列処理用に設計された数値アルゴリズムを探し始めることもできます。

更新

あなたのメソッドはと呼ばれているのでcontrast、画像のコントラストを変更していると思います。

画像の操作は、特定のカーネル(画像フィルター)を使用した畳み込み(2D画像で実行する場合は本質的に離散二重積分)を介して実行できますこれらの操作はGPUで計算でき、桁違いに高速化できます。OpenCl使用して、複数のGPUで実行されるプログラムを作成できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このbufferedimageループを最適化する方法は?

分類Dev

where句の計算でSQLクエリの速度を最適化する方法

分類Dev

node.jsのarray.forEachで計算速度を最適化する方法

分類Dev

スクリプトの速度を最適化する方法は?

分類Dev

このOpenCLカーネルを最適化する方法は?

分類Dev

次のforループコードを最適化する方法は?

分類Dev

このコードを最適化する方法(Pythonのダブルループ)?

分類Dev

これをforループ(文字から数字)関数に最適化する最良の方法は何ですか?

分類Dev

多くのループでこのFortranサブルーチンを最適化する方法は?

分類Dev

これをforループに最適化する方法は?

分類Dev

この最適化問題で複数のforループを回避する方法

分類Dev

rの行列で計算するためにネストされたforループを最適化する

分類Dev

このメソッドを最適化し、foreachループを回避する方法

分類Dev

3D配列のZ軸に沿った平均を計算するために速度を最適化する方法は?Cython vs Numpy

分類Dev

Keras、Tensorflowの最適化アルゴリズムの勾配ベクトル計算方法をオーバーライドする方法は?

分類Dev

このMiniZincアプリを最適化する方法は?

分類Dev

Pandas DataFrameの速度を最適化する方法は?

分類Dev

アレイのグループ化を最適化する方法は?

分類Dev

Railsでこのコードを最適化する方法は?

分類Dev

このPHPコードを最適化する方法は?

分類Dev

このコードをjavascriptで最適化する方法は?

分類Dev

この冗長なコードを最適化する方法は?

分類Dev

劣線形時間で素数を合計するこのHaskellコードを最適化する方法は?

分類Dev

これらのネストされたループを最適化する方法は?

分類Dev

ネストされたforループの時間計算量を最適化するために、重複する計算を避けます

分類Dev

numpyでこの関数の計算を最適化するにはどうすればよいですか?

分類Dev

このクエリの計算を最適化しますか?

分類Dev

numpy配列で2つのForループを使用せずに時間計算量を改善するには、構造を最適化しますか?

分類Dev

前の行に依存する計算をベクトル化/最適化する方法

Related 関連記事

  1. 1

    このbufferedimageループを最適化する方法は?

  2. 2

    where句の計算でSQLクエリの速度を最適化する方法

  3. 3

    node.jsのarray.forEachで計算速度を最適化する方法

  4. 4

    スクリプトの速度を最適化する方法は?

  5. 5

    このOpenCLカーネルを最適化する方法は?

  6. 6

    次のforループコードを最適化する方法は?

  7. 7

    このコードを最適化する方法(Pythonのダブルループ)?

  8. 8

    これをforループ(文字から数字)関数に最適化する最良の方法は何ですか?

  9. 9

    多くのループでこのFortranサブルーチンを最適化する方法は?

  10. 10

    これをforループに最適化する方法は?

  11. 11

    この最適化問題で複数のforループを回避する方法

  12. 12

    rの行列で計算するためにネストされたforループを最適化する

  13. 13

    このメソッドを最適化し、foreachループを回避する方法

  14. 14

    3D配列のZ軸に沿った平均を計算するために速度を最適化する方法は?Cython vs Numpy

  15. 15

    Keras、Tensorflowの最適化アルゴリズムの勾配ベクトル計算方法をオーバーライドする方法は?

  16. 16

    このMiniZincアプリを最適化する方法は?

  17. 17

    Pandas DataFrameの速度を最適化する方法は?

  18. 18

    アレイのグループ化を最適化する方法は?

  19. 19

    Railsでこのコードを最適化する方法は?

  20. 20

    このPHPコードを最適化する方法は?

  21. 21

    このコードをjavascriptで最適化する方法は?

  22. 22

    この冗長なコードを最適化する方法は?

  23. 23

    劣線形時間で素数を合計するこのHaskellコードを最適化する方法は?

  24. 24

    これらのネストされたループを最適化する方法は?

  25. 25

    ネストされたforループの時間計算量を最適化するために、重複する計算を避けます

  26. 26

    numpyでこの関数の計算を最適化するにはどうすればよいですか?

  27. 27

    このクエリの計算を最適化しますか?

  28. 28

    numpy配列で2つのForループを使用せずに時間計算量を改善するには、構造を最適化しますか?

  29. 29

    前の行に依存する計算をベクトル化/最適化する方法

ホットタグ

アーカイブ