Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 避免2的幂次方以实现缓存友好性_C_Performance_Caching_Optimization_Memory - Fatal编程技术网

C 避免2的幂次方以实现缓存友好性

C 避免2的幂次方以实现缓存友好性,c,performance,caching,optimization,memory,C,Performance,Caching,Optimization,Memory,假设在速度关键型代码中,我们有一对经常一起使用的数组,其中确切的大小无关紧要,只需要将其设置为合理的值,例如 int a[256], b[256]; 这是否可能是一种悲观情绪,因为低地址位相同会使缓存更难同时处理两个阵列?是否最好指定例如300而不是256?将我的评论移动到答案: 你怀疑二的幂可能有问题是对的。但它通常只适用于当你有超过2步。除非你超过L1,否则情况不会变得很糟糕。但在此之前,您可能会遇到假别名问题 下面是两个例子,其中2的幂实际上成了问题: 在第一个示例中,共有4个数

假设在速度关键型代码中,我们有一对经常一起使用的数组,其中确切的大小无关紧要,只需要将其设置为合理的值,例如

int a[256], b[256];

这是否可能是一种悲观情绪,因为低地址位相同会使缓存更难同时处理两个阵列?是否最好指定例如300而不是256?

将我的评论移动到答案:


你怀疑二的幂可能有问题是对的。但它通常只适用于当你有超过2步。除非你超过L1,否则情况不会变得很糟糕。但在此之前,您可能会遇到假别名问题

下面是两个例子,其中2的幂实际上成了问题:

在第一个示例中,共有4个数组-所有数组都与4k页面开始处的相同偏移对齐

在第二个示例中,当矩阵的大小为2的幂时,矩阵的逐列跳跃会完全破坏性能



在任何情况下,请注意,关键概念实际上是阵列的对齐,而不是阵列的大小。如果您发现运行速度变慢,只需在阵列之间添加一些填充以打破对齐状态。

您可以正确地怀疑二次幂可能有问题。但它通常只适用于当你有超过2步。(特别是当您超过一级缓存关联性时)在该示例中,有4个数组-所有数组都与4k页面开始处的相同偏移量对齐。另一个有用的技巧是:如果您一次只访问一个条目(并且从不通过memcpy等访问“切片”)您可以尝试对数组的索引应用一个简单的哈希函数。通常是XOR。即始终访问a[I^0x67]和b[j^0x34]。//我刚刚找到了一个地方,这很有帮助。