2015-04-22 54 views
0

我可能会被迫编写一些涉及多个输入数组和结果数组的性能关键C/C++代码(不必介意确切的类型)。由于某些原因,我想在我的输出数组的小块上工作,根据输入对它们进行修改 - 但是没有经常读写它们回到内存,因为我不相信缓存(也就是说,我担心输入数组会覆盖它,最终我会做内存读写操作,这真是太可怕了......)所以,我正在考虑安全地使用它,并试图留在寄存器中。我可以在寄存器中获取一个小的本地数组吗?

  • 我可以得到一个小的,本地的,固定长度的数组只能存储在寄存器中吗?
  • 我该如何做到这一点?
  • 这样的阵列可以有多大(比如,在Haswell或Skylake核心上)?
+0

你不能使用非缓存污染读取等?无论如何,除非所有索引都是恒定的,否则你无法合理地做到这一点(它可以完成,只是不合理,你不会喜欢它),然后它真的不是一个“在寄存器中的数组”,而只是照常工作,保持在你操作它时寄存器中的东西。 – harold

回答

0

一般来说,没有。大多数CPU架构不提供索引到寄存器的任何方式,因此无法以数组的形式访问数据。 (在ARM,例如,有寄存器r1通过r15,但也没有办法通过它的数字直接访问寄存器。这同样适用于x86的。)

您对高速缓存收回的担忧很可能放错了地方。现代CPU架构通常在管理缓存方面非常出色。

+0

如果预先知道所有循环的迭代次数,该怎么办?即可以将所有数组元素映射到寄存器,而无需在运行时通过其编号寻址寄存器? – einpoklum

+0

@einpoklum也许,但你必须展开循环。取决于您的应用程序,这可能会损害整体性能,而不是它的帮助。 – duskwuff

+0

啊,问题是_compiler_是否可以展开循环。 – einpoklum

相关问题