预先计算数据与顺序处理

时间:2015-07-31 11:29:27

标签: c++ c caching optimization

我有以下顺序代码: 1。

ProcessImage(){
    for_each_line
    {
        for_each_pixel_of_line()
        {
            A = ComputeA();
            B = ComputeB();
            DoBiggerWork();
        }
    }
}

现在我更改为预先计算整个图像的所有A,B值,如下所示。 2。

    ProcessImage(){
       for_each_line
       {
           A = ComputeAinLine();
           B = ComputeBinLine();
           for_each_pixel_of_line()
           {
                Ai = A[i];
                Bi = B[i];
                DoBiggerWork();
            }
        }
    }

结果表明,与第一个代码块相比,第二个代码块执行速度比处理时间的10%慢。

我想知道第二块代码中是否存在缓存未命中问题?

我将在第二段代码中使用SIMD并行预先计算。值得一试吗?

1 个答案:

答案 0 :(得分:1)

一切都取决于你是如何实现你的功能的。尝试分析您的代码并确定瓶颈在哪里。

如果一行计算一次值没有任何好处,那么请不要使用它。您只需要一个像素例程的A和B值。在第二个代码块中,您运行一次计算值,然后再次运行DoBiggerWork()并且每次从准备好的数组中检索值。这会花费更多的CPU时间。