我有以下顺序代码: 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 在第二个代码块中并行进行预计算。值得一试吗?
最佳答案
一切都取决于你是如何实现你的功能的。尝试剖析您的代码并确定瓶颈在哪里。
如果为一行计算一次值没有任何好处,则不要使用它。您只需要一个像素例程的 A 和 B 值。在第二个代码块中,您运行该行一次以计算值,然后再次运行 DoBiggerWork()
并且每次从准备好的数组中检索值。这会花费更多的 CPU 时间。
关于c++ - 预先计算数据与顺序处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31745096/