3

私は何年にもわたって Siggraph でいくつかの Halide パネルに参加してきましたが、最終的に、既存のソフトウェアをトランスコードするのに役立つかどうかを判断するためにいくつかのテストを行うことにしました。これまでのところ、結果は印象的です。

Siggraph 2015 で提示されたコードに基づいて Gaussian Blur を作成していたところ、理解できない奇妙な動作に遭遇しました。それが私自身の誤解なのか、何らかのバグ/「機能」なのかはわかりません。

以下のコードを参照してください。空の loop に注意してください。gkernel と normalize は、ガウス係数を生成するために私が作成した関数です。ループをコメントアウトしてコードをコンパイルして実行すると、出力画像は黒(すべてゼロ)になります。関数内の空のループを離れると、実行がはるかに高速になり、出力画像が正しくぼやけます。

私は何か基本的なものを見逃していますか、それともある種のバグですか? Windows 7 で MSVS Professional 2013 を使用しています。

機能コード:

Func HalideGBlur(Func f){
    float k[3];
    gkernel(k);
    normalize(k);

    for (int i = 0; i < 1; i++){
        ;
    }

    Func ypass;
    ypass(X, Y, C) = ( k[1] * f(X, Y, C) +
                       k[0] * (f(X, Y - 1, C) + f(X, Y + 1, C)) );
    Func xpass;
    xpass(X, Y, C) = ( k[1] * ypass(X, Y, C) +
                       k[0] * (ypass(X -1, Y, C) + ypass(X + 1, Y, C)) );

    //scheduling for x and y passes
    xpass.compute_root().vectorize(X, 8).parallel(Y);
    ypass.compute_at(xpass, Y).vectorize(X, 8);
    return xpass;
}

関連する実行コード:

Func g = HalideGBlur(bounded_image);

htime = ocvtime = FLT_MAX;
cout << "\n****Testing Gaussian Blur****\n";
//Run Halide tests
for (int x = 0; x < 10; x++){
    start_time = omp_get_wtime();
    g.realize(output);
    end = omp_get_wtime() - start_time;
    if (end < htime){ htime = end; }
}
cout << "halide best: " << htime << "\n";

無意味なループのない結果:

****Testing Gaussian Blur****
halide best: 0.0246554
ocv best: 0.0318704
Halide is 1.2926 times as fast as OpenCV.

無意味なループの結果:

****Testing Gaussian Blur****
halide best: 0.00749808
ocv best: 0.0317644
Halide is 4.2363 times as fast as OpenCV.
4

1 に答える 1

1

それはパズルです。たぶん、メモリを大量に消費するバグがあり、そのループがスタック フレームのレイアウトに影響を与えている可能性があります。これを確認するために使用できる Windows の valgrind に相当するものはありますか?

于 2015-08-25T23:59:05.453 に答える