意外行为:空循环导致模糊函数

时间:2015-08-25 16:46:57

标签: halide

多年来我在Siggraph参加了一些Halide小组讨论,最后我决定做一些测试,以确定转换现有软件是否有用。到目前为止,结果令人印象深刻。

我正在根据Siggraph 2015中提供的代码编写高斯模糊,并遇到了一些我无法理解的奇怪行为。我不确定这是我自己的误解还是某种错误/“特征”。

请参阅下面的代码,注意空循环。 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.

1 个答案:

答案 0 :(得分:0)

这是一个益智游戏。也许你有一个内存踩踏错误,并且该循环正在影响堆栈框架布局。 Windows上是否有valgrind等效项可用于检查?