c – 前锋与后退阵列步行

c – 前锋与后退阵列步行,第1张

概述首先让我先说明这一点,我知道这种微观优化很少具有成本效益.我很好奇这些东西是如何起作用的.对于所有的高速缓存行数等,我在考虑x86-64 i5 Intel CPU.对于不同的CPU,数字显然会有所不同. 我常常觉得走向阵列向前走的速度比走向后走得快.我相信这是因为大量数据是以前向方式完成的 – 也就是说,如果我读取字节0x128,那么高速缓存行(假设长度为64字节)将以字节0x128读取 – 0x 首先让我先说明这一点,我知道这种微观优化很少具有成本效益.我很好奇这些东西是如何起作用的.对于所有的高速缓存行数等,我在考虑x86-64 i5 Intel cpu.对于不同的cpu,数字显然会有所不同.

我常常觉得走向阵列向前走的速度比走向后走得快.我相信这是因为大量数据是以前向方式完成的 – 也就是说,如果我读取字节0x128,那么高速缓存行(假设长度为64字节)将以字节0x128读取 – 0x191包含.因此,如果我想要访问的下一个字节是0x129,它就已经在缓存中了.

但是,看了一下后,我现在的印象是它实际上没关系?因为高速缓存行对齐将在最接近的64可分边界处选择起始点,然后如果我选择字节0x127开始,我将加载0x64-0x127(包括端点),因此将在缓存中具有数据以供我向后移动.当从0x128转换到0x127时,我会遇到缓存,但这是我为这个例子选择地址的结果,而不是任何现实世界的考虑.

我知道高速缓存行是以8字节块的形式读入的,因此如果我们向后走,第一次 *** 作可能会开始之前必须加载完整的高速缓存行,但我怀疑它会产生巨大的显着差异.

如果我就在这里,有人可以清理,老我错了吗?我已经搜索了一整天,仍未能得到最终答案.

tl; dr:我们走一个阵列的方向真的那么重要吗?它真的有所作为吗?它在过去有所作为吗? (到15年前左右)

我已经使用以下基本代码进行了测试,并且向前和向后看到了相同的结果:

#include <windows.h>#include <iostream>// Size of dataset#define SIZE_OF_ARRAY 1024*1024*256// Are we walking forwards or backwards?#define FORWARDS 1int main(){    // Timer setup   LARGE_INTEGER StartingTime,EndingTime,ElapsedMicroseconds;   LARGE_INTEGER Frequency;   int* intArray = new int[SIZE_OF_ARRAY];    // Memset - shouldn't affect the test because my cache isn't 256MB!   memset(intArray,SIZE_OF_ARRAY);    // Arbitrary numbers for break points   intArray[SIZE_OF_ARRAY - 1] = 55;   intArray[0] = 15;   int* backwardsPtr = &intArray[SIZE_OF_ARRAY - 1];   queryPerformanceFrequency(&Frequency);    queryPerformanceCounter(&StartingTime);    // Actual code   if (FORWARDS)   {    while (true)    {        if (*(intArray++) == 55)            break;    }   }   else   {    while (true)    {        if (*(backwardsPtr--) == 15)            break;    }   }    // Cleanup   queryPerformanceCounter(&EndingTime);   ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;   ElapsedMicroseconds.QuadPart *= 1000000;   ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;   std::cout << ElapsedMicroseconds.QuadPart << std::endl;    // So I can read the output   char a;   std::cin >> a;   return 0;}

我为A)windows代码和B)Hacky实现道歉.它被抛在一起来检验一个假设,但不能证明这个推理.

任何关于步行方向如何产生影响的信息,不仅仅是缓存,还有其他方面,将不胜感激!

解决方法 正如您的实验所示,没有区别.与处理器和L1高速缓存之间的接口不同,存储器系统在完整的高速缓存行而不是字节上进行交易.正如@ user657267指出的那样,存在处理器特定的预取器.这些可能偏好前锋后退,但我对此表示怀疑.所有现代预取器都会检测方向而不是假设它们.此外,他们也检测到步幅.它们涉及极其复杂的逻辑,而且方向不容易垮台.

简短的回答:走向你想要的任何一个方向,并享受两者相同的表现!

总结

以上是内存溢出为你收集整理的c – 前锋与后退阵列步行全部内容,希望文章能够帮你解决c – 前锋与后退阵列步行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1238925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存