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