【问题标题】:Determine the processor architecture确定处理器架构
【发布时间】:2014-04-22 15:26:13
【问题描述】:

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

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

-march=core2 一切正常。

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

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

【问题讨论】:

  • 您可能需要在此答案中将汇编程序修复为大纲:stackoverflow.com/questions/9840207/…
  • 在 Linux 中,您只需检查 /proc/cpuinfo 并查看 AVX 是否存在。可悲的是,Mac 似乎没有提供该功能。

标签: waf python gfortran processor avx waf


【解决方案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 此处给出的表格。 您将了解您的处理器系列。

【讨论】:

  • 感谢您的回答。但不幸的是,这是 C 代码。 Waf 是用 Python 编写的。很抱歉没有事先提及。
【解决方案2】:

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。

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2013-11-27
    • 2014-06-21
    • 2017-01-27
    • 2013-10-24
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多