首页 文章

确定处理器体系结构

提问于
浏览
2

我们在MacBook Pro Late 2013上编译Lapack时遇到问题 . 编译器在使用 -march=native 编译时抱怨不支持向量指令:

没有这样的指令:`vmovss(%rdx),%xmm0'

随着 -march=core2 一切都很好 .

问题是:如何在waf中检测处理器架构?目前,waf知道在使用Darwin OS的计算机上运行,但问题与操作系统无关,而与处理器无关,因此这无济于事 .

我不是问如何修复汇编程序错误!我问如何让waf检测处理器架构 .

2 回答

  • 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

    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 .

相关问题