确定处理器架构
我们在2013年款的MacBook Pro上使用Lapack时遇到了问题。编译器在使用-march=native
这个选项编译时,抱怨说不支持某些向量指令,具体错误信息是:
没有这样的指令: `vmovss (%rdx), %xmm0'
但如果使用-march=core2
,一切都正常。
问题是:如何在waf中检测处理器架构?目前,waf知道它在Darwin操作系统上运行,但问题并不在于操作系统,而是处理器,所以这并没有帮助。
我并不是在问如何修复汇编错误!我是在问如何让waf检测处理器架构。
2 个回答
1
Waf目前没有内置的功能来检测CPU的扩展指令。vmovss
指令是AVX指令集的一部分。在C语言文件中,你可以通过使用__AVX__
这个预处理宏来检查AVX是否可用:
int blah() {
#ifdef __AVX__
avx code here
#else
something else
#endif
}
这是我解决你问题的首选方法。这样你就不需要使用构建工具了。当然,你也可以用WAF执行相同的检查:
def configure(ctx):
ctx.check(msg = 'Checking for AVX support',
execute = True,
fragment='''int main() {
#ifdef __AVX__
return 0;
#else
return 1;
#endif
}\n''')
这需要你使用-march=native
这个选项,否则你的编译器可能不会启用AVX。
1
这段代码可以帮助你识别你的英特尔处理器的类型。
#include "stdio.h"
int main () {
int ebx = 0, ecx = 0, edx = 0, eax = 1;
__asm__ ("cpuid": "=b" (ebx), "=c" (ecx), "=d" (edx), "=a" (eax):"a" (eax));
int model = (eax & 0x0FF) >> 4;
int extended_model = (eax & 0xF0000) >> 12;
int family_code = (eax & 0xF00) >> 8;
int extended_family_code = (eax & 0xFF00000) >> 16;
printf (" model %x\n extended_model %x\n family_code %x\n extended_family_code %x \n", eax, ebx, ecx, edx);
printf ("CPUID: %02x %x\n", extended_family_code | family_code, extended_model | model);
return 0;
}
然后,你可以查看这里的表格 处理器架构。这样你就能知道你的处理器属于哪个系列了。