我正在使用包含 SSE 预取指令的内联汇编的代码。预处理器常量确定是否使用 32、64 或 128 字节预取指令。该应用程序用于各种平台,到目前为止,我不得不在每种情况下调查哪个是给定 CPU 的最佳选择。我知道这是缓存行大小。这些信息是否可以自动获得?/proc/cpuinfo 中似乎没有明确显示它。
1 回答
我认为您的问题与这个问题或这个问题有关。我认为很明显——除非你可以依赖操作系统或库函数——你会想要使用 CPUID 指令,但是问题就变成了你正在寻找什么信息。- 当然,AMD 和英特尔的实施不需要达成一致。此页面建议使用 Cpuid.1.EBX[15:8](即 BH)在 Intel 上查找并在 AMD 上运行 80000005h。此外,在 Intel 上,CPUID.2... 似乎包含相关信息,但解析出所需信息似乎真的很痛苦。
我认为,根据我的阅读,AMD 和 Intel CPUID 指令都将支持CPUID.1.EBX[15:8],它返回 CLFLUSH 指令使用的 QUADWORDs 中一个缓存行的大小(这不是存在于所有处理器上,所以我不知道你是否总能在那里找到一些东西)。因此,在执行 CPUID.1 之后,您必须将 BH 乘以 8 才能获得以字节为单位的高速缓存行大小。这取决于我的隐含假设(请任何人说它是否真的有效?)对于 CLFLUSH 和 PREFETCHh 指令,一个高速缓存行大小的定义总是相同的。
此外,英特尔的手册指出 PREFETCHh 只是一个提示,但如果它预取任何东西,它总是至少 32 字节。
EDIT1:另一个用于优化使用 PREFETCHh 的有用资源(即使不直接回答您的问题)是英特尔的优化手册。