我有以下顺序代码: 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并行预先计算。值得一试吗?
答案 0 :(得分:1)
一切都取决于你是如何实现你的功能的。尝试分析您的代码并确定瓶颈在哪里。
如果一行计算一次值没有任何好处,那么请不要使用它。您只需要一个像素例程的A和B值。在第二个代码块中,您运行一次计算值,然后再次运行DoBiggerWork()
并且每次从准备好的数组中检索值。这会花费更多的CPU时间。