有必要使用函数实时处理大量数字(~1 Mb),例如 void processData(char* data)
.
在目标平台上运行了以下测试:
int j = 10;
while(j--)
processData(dataPtr);
每次都使用相同的数据。它显示了以下结果:
- 第一次运行需要 ~22.5ms
- 第二次运行和其他需要 ~12,5ms
在我看来,这可能是由于第二次运行数据已经在处理器缓存中,因此它的工作速度要快得多。
问题是:在实际情况下,数据每次都会有所不同。
有没有办法将数据"预加载"到缓存中?
预取是可能的(使用 gcc
,请使用 __builtin_prefetch
),但应谨慎使用,否则可能会降低性能而不是提高性能。
在执行此操作之前,应检查函数中的内存访问模式,并尽可能进行优化。
基本上,我们希望尽可能少的内存访问,并且它们应该尽可能多地串行。
有一个预取操作,但不建议对整个数据集执行此操作。
更好的设计是在循环的每次迭代中,为下一次迭代(或者如果循环运行得非常快,则可能是之后的迭代)预取数据。
你可以做的是记住你的整个工作集适合LLC,你把第一次运行称为"热身运行",你没有考虑到它的时间。当然,如果第三次、第四次和进一步的运行时间与第二次运行显示的时间一致,则这种方法是合理的。然后,当您报告基准测试结果时,您显示平均 2 个第 N 个运行时间,但您在报告中提到数据符合 L3,并且对于更多"真实世界数据",预期会有不同的结果。我认为这通常被称为微基准测试,当你在同一个明确定义的常量数据集上测试一个特定函数的性能时。