Определить архитектуру процессора

У нас возникла проблема с Lapack, скомпилированным на MacBook Pro Late 2013. Компилятор жалуется на неподдерживаемые векторные инструкции при компиляции с -march=native:

нет такой инструкции: `vmovss (%rdx), %xmm0'

С -march=core2 все нормально.

Проблема в том, как определить архитектуру процессора в waf? В настоящее время waf знает о работе на машине с ОС Darwin, но проблема связана не с ОС, а с процессором, так что это не помогает.

Я не спрашиваю, как исправить ошибку ассемблера! Я спрашиваю, как заставить waf определять архитектуру процессора.


person PVitt    schedule 22.04.2014    source источник
comment
Возможно, вам придется исправить ассемблер, как описано в этом ответе: stackoverflow.com/questions/9840207/   -  person ArtemB    schedule 24.04.2014
comment
В Linux вы можете просто проверить /proc/cpuinfo и посмотреть, есть ли там AVX. К сожалению, кажется, что Mac не предоставляет эту функцию.   -  person Davidmh    schedule 04.06.2014


Ответы (2)


Это может помочь определить семейство процессоров 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;
}

Затем просмотрите приведенную здесь таблицу архитектура процессора. Вы познакомитесь с семейством процессоров.

person sourabhxiii    schedule 04.06.2014
comment
Спасибо за ответ. Но это, к сожалению, код C. Ваф написан на Python. Извините, что не упомянул об этом заранее. - person PVitt; 04.06.2014

В настоящее время Waf не имеет встроенной функции для обнаружения расширений ЦП. Инструкция 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.

person Björn Lindqvist    schedule 13.01.2018