2017-09-19 253 views
0

可一个普通的数组(arr)投入CPU寄存器在以下情况:可以将普通数组放入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中数组的副本。

回答

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?

1

在大多数平台上,int[6]是太多的信息不能放在一个单一的寄存器,虽然当然你可以在适合于保持指针的寄存器中的数组指针。或者如果你的意思是询问数组的内容是否可以存储在一些寄存器中,那么这可能是可能的。

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

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

相关问题