我们在MacBook Pro Late 2013上编译Lapack时遇到问题 . 编译器在使用 -march=native 编译时抱怨不支持向量指令:
-march=native
没有这样的指令:`vmovss(%rdx),%xmm0'
随着 -march=core2 一切都很好 .
-march=core2
问题是:如何在waf中检测处理器架构?目前,waf知道在使用Darwin OS的计算机上运行,但问题与操作系统无关,而与处理器无关,因此这无济于事 .
我不是问如何修复汇编程序错误!我问如何让waf检测处理器架构 .
这有助于识别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 . 您将了解您的处理器系列 .
Waf目前没有用于检测CPU扩展的内置功能 . vmovss 指令是AVX指令集的一部分 . 在C文件中,您可以使用 __AVX__ 预处理器宏检查AVX是否可用:
vmovss
__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 .
2 回答
这有助于识别INTEL处理器系列 . 运行这段代码
然后看看这里给出的表processor arch . 您将了解您的处理器系列 .
Waf目前没有用于检测CPU扩展的内置功能 .
vmovss
指令是AVX指令集的一部分 . 在C文件中,您可以使用__AVX__
预处理器宏检查AVX是否可用:这将是我解决您问题的首选解决方案 . 然后你不需要涉及构建工具 . 虽然您可以使用WAF执行相同的检查:
这要求您使用
-march=native
选项,否则您的编译器不太可能启用AVX .