可以将普通数组放入cpu寄存器吗?

时间:2017-09-19 11:36:29

标签: c++ c++11 cpu-registers

在以下情况下,是否可以将普通数组(arr)放入cpu寄存器:

int arr[6] {/*some values*/};
const auto lambda_f = [arr](int input) {/*some manipulations on array elements and input*/};
// further usage of lambda_f

如果不能,我应该如何重写代码以使其成为可能?

编辑:当然,我的意思是lambda中数组的副本。

2 个答案:

答案 0 :(得分:1)

在大多数平台上,int[6]信息太多,不能放在一个寄存器中,当然你可以在适合保存指针的寄存器中指向数组。或者,如果您想询问数组的内容是否可以存储在某些寄存器中,则可能是这样。

但这一切都取决于数据的使用方式,以及编译器是否认为寄存器对其他数据更有价值。如果我可以假设你发布的代码实际上是在一个功能块内,那么任何优化编译器都会完全忽略你发布的代码,并且不再使用arrlambda_f,因为你从不使用它们。

确定答案的唯一方法是尝试使用lambda_f的特定实际代码,并检查生成的程序集。

答案 1 :(得分:1)

总的来说,是的。但这取决于特定的平台。如果你有一个非常新的Intel x86-64芯片,它将具有“AVX2”指令,它们以256位(32字节)整数运行。

您的int arr[6]是4 * 6 = 24个字节,因此它适合单个AVX寄存器,然后您可以在其上使用AVX2整数指令。你只需要忽略寄存器的额外8个字节,但这通常不是问题。

如果您需要支持较旧的处理器,则可以使用SSE2,这适用于大多数现代x86系统。您一次只能以128位(4个整数)运行。

第一步是将数据加载到一个广泛的寄存器中。有关示例,请参见此处:What's the most efficient way to load and extract 32 bit integer values from a 128 bit SSE vector?