【发布时间】:2014-09-09 11:09:38
【问题描述】:
在 C 浮点(或双精度)数组上,小到足以放入 L1 或 L2 缓存(大约 16k),并且我在编译时知道谁的大小,在使用它们的函数中定义它们通常会带来速度优势,所以它们是堆栈变量?如果有,差别大吗?我知道过去堆变量比堆栈变量慢得多,但现在由于 cpu 寻址和缓存的结构更加复杂,我不知道这是否属实。
我需要在“块”中对这些数组重复运行浮点数学运算,一遍又一遍地在相同的数组上(大约 1000 次),我想知道是否应该在本地定义它们。我想将它们保持在最近/最快的位置将使我能够更快地反复迭代它们,但我不明白在这种情况下缓存的含义。也许编译器或 cpu 足够聪明,可以意识到我在做什么,并在内部处理循环期间使这些数据数组在硬件上高度本地化,而无需我的干预,也许它在这方面做得比我做得更好。
如果我以这种方式加载大型数组,可能会面临堆栈空间不足的风险?还是堆栈空间在现代系统上没有受到很大限制?数组大小可以在编译时定义,我只需要一个数组和一个 CPU,因为我需要坚持一个线程来完成这项工作。
【问题讨论】:
-
您是否真的分析了您的代码并发现了性能问题,或者这只是推测性的,即过早优化?
-
操作的性能没有区别。从处理器的角度来看,内存就是内存。堆栈或堆,没有区别。堆栈的好处是它被有效地缓存并且分配/释放很便宜。
-
现代系统中的典型堆栈大小在 Mb 范围内 (1-8 Mb)。
-
一时投机。我已经定时执行测试程序,以大致了解操作的成本 - 不是那么贵,但这是在原子等低功率设备上运行。实际上,当我在周期之间将 cpu 交还给操作系统时,我的大部分问题都是由操作系统延迟引起的,但优化这是未来需要解决的另一项工作。现在我越快让我的处理周期越快,当我的进程再次拥有 cpu 时,我就能更快地赶上。按订单计算,这些操作肯定是我的应用程序中最昂贵的。
-
缓存效率基本上是我想问的。为了澄清当我在上面定义 16k 时,我的意思是我的数组是 16kb。所以我希望它们保存在尽可能快的内存中,我认为这是缓存,但当然有缓存级别。因此,如果我可以鼓励编译器/cpu 将我的数据保存在最高级别的缓存中,我就赢了。如果在堆栈上定义实现了这一点,我想这就是我的答案,但如果编译器/cpu 在这方面比我聪明得多,并且会缓存它检测到的优化执行、堆栈或堆所需的内容,那么我想我 malloc ?
标签: c arrays performance floating-point