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