普通数组可以放在 cpu 寄存器中吗?
Can plain array be put in cpu register?
在以下情况下能否将普通数组 (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 中数组的副本。
在大多数平台上,int[6]
信息太多,无法放入单个寄存器,当然您可以在适合保存指针的寄存器中包含指向数组的指针。或者如果你的意思是问数组的内容是否可以存储在某些寄存器组中,这是可能的。
但这完全取决于数据的使用方式,以及编译器是否认为寄存器对其他数据更有价值。如果我可以假设您发布的代码实际上在一个功能块中,那么任何优化编译器都会完全忽略您发布的代码并摆脱 arr
和 lambda_f
,因为您从不使用它们。
确定答案的唯一方法是在使用 lambda_f
的特定实际代码上进行尝试,并检查生成的程序集。
总的来说,是的。但这取决于特定的平台。如果您使用的是最新的 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?
在以下情况下能否将普通数组 (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 中数组的副本。
在大多数平台上,int[6]
信息太多,无法放入单个寄存器,当然您可以在适合保存指针的寄存器中包含指向数组的指针。或者如果你的意思是问数组的内容是否可以存储在某些寄存器组中,这是可能的。
但这完全取决于数据的使用方式,以及编译器是否认为寄存器对其他数据更有价值。如果我可以假设您发布的代码实际上在一个功能块中,那么任何优化编译器都会完全忽略您发布的代码并摆脱 arr
和 lambda_f
,因为您从不使用它们。
确定答案的唯一方法是在使用 lambda_f
的特定实际代码上进行尝试,并检查生成的程序集。
总的来说,是的。但这取决于特定的平台。如果您使用的是最新的 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?