Cómo usar AVX / pclmulqdq en Mac OS X


Estoy tratando de compilar un programa que utiliza la instrucción pclmulqdq presente en los nuevos procesadores Intel. He instalado GCC 4.6 usando macports pero cuando compilo mi programa (que usa el intrínseco _mm_clmulepi64_si128), obtengo

/var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000gn/T//ccEAWWhd.s:16:no such
instruction: `pclmulqdq $0, %xmm0,%xmm1'

Parece que GCC es capaz de generar el código de ensamblado correcto desde el instrinsic, pero el ensamblador no reconoce la instrucción.

He instalado binutils usando macports, pero el problema persiste. ¿Cómo sé qué ensamblador gcc está usando? El ensamblador XCode probablemente no lo soporta, pero el ensamblador binutils debería hacerlo.

Author: jww, 2012-03-23

5 answers

Una solución más simple que solucionó este problema para mí fue agregar -Wa,-q a los indicadores del compilador. De las páginas de manual de as (versión 1.38):

- q

     Utilice el ensamblador integrado clang(1) en lugar del ensamblador del sistema basado en GNU.

La parte -Wa la pasa del controlador del compilador al ensamblador, al igual que -Wl pasa argumentos al enlazador.

 24
Author: capisce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-16 07:08:54

El ensamblador GNU (GAS) no es compatible con Mac OS X.

Para usar AVX, tuve que:

  • Instalar GCC usando MacPorts;
  • Reemplace el ensamblador nativo de OS X (/usr/bin/as) por un script que llame al ensamblador clang.
  • Compilar el programa con el GCC instalado (por ejemplo, gcc-mp-4.7)

Lo extraño es que mientras el ensamblador de clang soporta AVX, el compilador de clang no reconoce las instrínsicas de AVX, forzando la fea solución anterior.

 13
Author: Conrado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-14 15:56:52

La versión incorporada de as está desactualizada. (En OS X 10.8.3)

/ usr / libexec / as / x86_64 / as-v

Apple Inc versión cctools-839, GNU assembler versión 1.38

No parece existir una versión de gas para OS X. (Ver: Instalando el ensamblador GNU en OSX )

Usar el ensamblador clang a través de un hackeo de script (como señaló Conrado PLG) es una solución alternativa. Sin embargo, requiere privilegios de administrador y sobrescribe el paquete OS X ejecutables, causando un riesgo de que sea sobrescrito por una nueva (pero posiblemente obsoleta) versión de as incluido con una versión futura de OS X.

¿Hay entonces una mejor solución?

Como se indica en ¿Por qué cross gcc invoca 'as'nativo? parece ser posible especificar qué "as"-ejecutable y banderas usar (usando "-specs=..."). Una solución más limpia al problema parece ser pasar las banderas "-specs" correctas para invocar el ensamblador clang. Esto no requiere administrador privilegios y no corre el riesgo de ser roto por una actualización de OS X. Los detalles exactos de cómo realizar esto queda por descubrir (¿alguien?).

Si esta solución se vuelve lo suficientemente transparente y sin problemas, se puede garantizar el uso de esa configuración por defecto (o al menos una variante) para el gcc de macport (para que sea compatible con "-march=native" y similares). Hay como configurar.args setting ("with with-as=pref {prefix}/bin / as", como se ve en https://trac.macports.org/browser/trunk/dports/lang/gcc48/Portfile ), que podría sustituirse.

 4
Author: Anders Sjögren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:51:37

Parece que arreglé mi problema usando la sintaxis gcc / asm donde a la función asm{} se le pasa una cadena que consiste en sentencias ensambladoras rodeadas de comillas y separadas por una barra invertida y nueva línea o barra invertida y cadena entre comillas que contiene otra sentencia ensambladora.

Https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3

 1
Author: user5579312,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-19 02:54:28

Solo use

as --version

AVX apareció alrededor de la versión 2.18.50 en gas/binutils.

 0
Author: Gunther Piez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-23 15:23:25