【问题标题】:Improving an addition function using cache locality使用缓存局部性改进加法函数
【发布时间】:2015-08-02 16:28:20
【问题描述】:

我有一个函数,它从用户那里接收一个一维数组和一个数字,并将这两者相加。

示例:

0 1 2 3 4 5 6 7 8

用户:9

9 10 11 12 13 14 ...

我一直在使用以下代码:

for(int i =0; i < arr; i++){
   arr[i] = arr[i] + usrNumber;
}

现在这似乎非常低效,因为我必须遍历数组的每个位置并将值相加。

我从previous post 中读到了 block 方法,但我的印象是它必须至少是二维的才能工作。有什么方法可以改进这个功能?

【问题讨论】:

  • 对于一维数组,我认为你不能做得更好;从本质上讲,您已经从您提到的内容中受益,请参见此处:stackoverflow.com/questions/12065774/…
  • 你的印象是正确的,块方法用于二维数组,因为数组通常以行为主的方式存储。因此,如果以列主要方式访问它们,则可能会导致大量缓存未命中

标签: c arrays performance for-loop optimization


【解决方案1】:

您的代码已经具有出色的空间局部性。空间局部性定义为

如果在特定时间引用了特定的内存位置,那么很可能在不久的将来会引用附近的内存位置。 (维基百科)

要做得更好,最简单的方法是使用处理器的向量指令,假设处理器有它们并且编译器不为你做。例如,x86 处理器具有 SSE 指令,可以加快您的工作速度。

如果数组足够大,那么您可以在处理器支持的情况下进行缓存预取。请注意,最近几年制造的英特尔处理器会自动执行此操作。

【讨论】:

  • hmmmmmm ok 将不得不研究 SSE 指令。
  • 在尝试手动优化之前,最好使用分析器来确定这段代码是否是次要瓶颈,更不用说是主要瓶颈了。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2018-09-30
  • 2017-02-16
相关资源
最近更新 更多