在以下情况下,是否可以将普通数组(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中数组的副本。
答案 0 :(得分:1)
在大多数平台上,int[6]
信息太多,不能放在一个寄存器中,当然你可以在适合保存指针的寄存器中指向数组。或者,如果您想询问数组的内容是否可以存储在某些寄存器中,则可能是这样。
但这一切都取决于数据的使用方式,以及编译器是否认为寄存器对其他数据更有价值。如果我可以假设你发布的代码实际上是在一个功能块内,那么任何优化编译器都会完全忽略你发布的代码,并且不再使用arr
和lambda_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?