确定处理器体系结构

时间:2014-04-22 15:26:14

标签: python gfortran processor avx waf

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

  

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

-march=core2一切都很好。

问题是:如何在中检测处理器架构?目前,waf知道在使用Darwin OS的机器上运行,但问题与操作系统无关,而与处理器有关,所以这没有帮助。

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

2 个答案:

答案 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。

相关问题