我们在MacBook Pro Late 2013上编译Lapack时遇到问题。编译器在使用-march=native
编译时抱怨不支持向量指令:
没有这样的指示:`vmovss(%rdx),%xmm0'
-march=core2
一切都很好。
问题是:如何在waf中检测处理器架构?目前,waf知道在使用Darwin OS的机器上运行,但问题与操作系统无关,而与处理器有关,所以这没有帮助。
我不是在问如何修复汇编程序错误!我问如何让waf检测处理器架构。
答案 0 :(得分:1)
这有助于识别INTEL处理器系列。 运行这段代码
#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;
}
然后查看此处给出的表processor arch。 您将了解您的处理器系列。
答案 1 :(得分: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。