我正在使用包含 SSE 预取指令的内联汇编的代码。预处理器常量确定是否使用 32、64 或 128 字节预取的指令。该应用程序在多种平台上使用,到目前为止,我必须在每种情况下调查对于给定 CPU 来说哪一个是最佳选择。据我所知,这是缓存行大小。这些信息可以自动获取吗?它似乎没有明确存在于 /proc/cpuinfo 中。
我认为你的问题与此相关question https://stackoverflow.com/questions/794632/programmatically-get-the-cache-line-size or this https://stackoverflow.com/questions/150294/how-to-programmatically-get-the-cpu-cache-page-size-in-c一。我认为很明显 - 除非您可以依赖操作系统或库函数 - 您将需要使用 CPUID 指令,但问题就变成了您正在寻找什么信息。 - 当然,AMD 和 Intel 的实现不需要达成一致。这page http://softpixel.com/~cwright/programming/simd/cpuid.php建议在 Intel 上使用 Cpuid.1.EBX[15:8](即 BH)进行查找,在 AMD 上使用函数 80000005h。另外,在Intel上,CPUID.2...似乎包含相关信息,但解析出所需信息看起来确实很痛苦。
我认为,据我所知,AMD 和 Intel CPUID 指令都支持CPUID.1.EBX[15:8],它返回 CLFLUSH 指令使用的 QUADWORD 中的一个缓存行的大小(并非所有处理器上都存在,所以我不知道您是否总能在那里找到一些东西)。因此,执行 CPUID.1 后,您必须将 BH 乘以 8 才能获得缓存行大小(以字节为单位)。这取决于我的隐含假设(请问谁能说它是否真的有效?),即对于 CFLUSH 和 PREFETCHh 指令,一个缓存行大小的定义始终相同。
另外,英特尔的manuals http://www.intel.com/Assets/PDF/manual/253667.pdf指出 PREFETCHh 只是一个提示,但是,如果它预取任何内容,它将始终是一个最小 32 字节.
编辑1:
对于优化使用 PREFETCHh 的另一个有用资源(即使没有直接回答您的问题)是英特尔的优化手册here http://www.intel.com/Assets/PDF/manual/248966.pdf.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)