确定处理器架构

2 投票
2 回答
600 浏览
提问于 2025-04-18 03:46

我们在2013年款的MacBook Pro上使用Lapack时遇到了问题。编译器在使用-march=native这个选项编译时,抱怨说不支持某些向量指令,具体错误信息是:

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

但如果使用-march=core2,一切都正常。

问题是:如何在中检测处理器架构?目前,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;
}

然后,你可以查看这里的表格 处理器架构。这样你就能知道你的处理器属于哪个系列了。

撰写回答