3

有必要使用函数实时处理大量数字(~1 Mb),例如void processData(char* data).

在目标平台上运行了以下测试:

int j = 10;
while(j--)
    processData(dataPtr);

每次使用相同的数据。它显示了以下结果:

  1. 第一次运行大约需要 22.5 毫秒
  2. 第二次运行和其他运行大约需要 12.5 毫秒

在我看来,这可能是由于第二次运行时数据已经在处理器缓存中,因此它的工作速度要快得多。

问题:在实际情况下,数据每次都会不同。

有什么方法可以对数据进行某种“预加载”以进行缓存?

4

2 回答 2

3

预取是可能的(使用gcc,使用__builtin_prefetch),但应谨慎使用,否则可能会降低性能而不是提高性能。

在执行此操作之前,应尽可能检查和优化函数中的内存访问模式。
基本上,我们希望内存访问尽可能少,并且它们应该尽可能串行。

有一个预取操作,但不建议对整个数据集执行此操作。
更好的设计是,在循环中的每次迭代中,为下一次迭代(或者可能是之后的一次,如果循环运行得非常快)预取数据。

于 2012-05-06T10:55:21.977 回答
0

您可以做的是记住您的整个工作集适合 LLC,您将第一次运行称为“热身运行”并且您不考虑它的时间安排。当然,如果第三次、第四次和进一步的运行时间与第二次运行显示的时间一致,则这种方法是合理的。然后,当您报告基准测试结果时,您会显示平均 2-N 次运行时间,但您在报告中提到数据适合 L3,并且使用更多“真实世界的数据”可以预期不同的结果。我认为这通常称为微基准测试,当您在同一个定义明确的常量数据集上测试一个特定函数的性能时。

于 2012-05-10T07:58:18.220 回答