2009-05-18 25 views
19

He estado leyendo sobre las extensiones del conjunto de instrucciones x86, y solo parecen útiles en algunas circunstancias bastante específicas (por ejemplo, HADDPD - (Horizontal-Completo-Envasado-Doble) en SSE3). Estos requieren un cierto diseño de registro que debe configurarse deliberadamente u ocurrir a partir de la serie de instrucciones anteriores. ¿Con qué frecuencia los compiladores de uso general como gcc realmente usan estas instrucciones (o un subconjunto de las mismas), o son principalmente para ser usadas en un ensamblador codificado a mano? ¿Cómo detecta el compilador dónde es apropiado usar las instrucciones SIMD?¿Cómo usan los compiladores modernos las instrucciones de mmx/3dnow/sse?

Respuesta

22

Generalmente, pocos compiladores los usan. GCC y Visual Studio generalmente no pueden usar las instrucciones SIMD. Si habilita SSE como un indicador de compilación, utilizará las instrucciones escalares de SSE para las operaciones de punto flotante normales, pero en general, no espere que las vectorizadas se utilicen automáticamente. Las versiones recientes de GCC podrían usarlas en algunos casos, pero no funcionó la última vez que lo intenté. El compilador C++ de Intel es el único gran compilador que conozco capaz de auto-vectorizar algunos bucles.

En general, sin embargo, tendrá que usarlos usted mismo. Ya sea en ensamblador sin formato o mediante el uso de compiladores intrínsecos. En general, diría que los intrínsecos son el mejor enfoque, ya que permiten que el compilador entienda el código, y así programar y optimizar, pero en la práctica, sé que MSVC al menos no siempre genera código muy eficiente desde intrínsecos, tan simple asm puede ser la mejor solución allí. Experimenta, mira lo que funciona. Pero no espere que el compilador use estas instrucciones para usted, a menos que 1) utilice el compilador correcto, y 2) escriba bucles bastante simples que puedan vectorizarse trivialmente.

Actualización 2012
Ok, por lo que han pasado tres años desde que escribí esta respuesta. GCC ha podido autovectar el código (simple) por un par de años, y en VS2012, MSVC finalmente gana la misma capacidad. Por supuesto, la parte principal de mi respuesta aún se aplica: los compiladores solo pueden vectorizar un código bastante trivial. Para algo más complejo, estás atascado jugando con intrinsics o asm en línea.

+0

¿Se han mejorado los intrínsecos (mucho) en los últimos años? La última vez que revisé, tanto MSVC como ICC tenían una asignación de registro bastante pésima, e incluso yo era capaz de superar fácilmente la versión intrínseca del compilador con un ensamblaje codificado a mano. – snemarch

+0

Creo que las versiones recientes de MSVC han realizado * algunas * mejoras en el código generado por intrínsecos. Pero no sé cuánta diferencia ha hecho. – jalf

+0

La salida de MSVC para SSE escalar es aún terrible, especialmente si usa un intrínseco en cualquier lugar. – Crashworks

-10

Probablemente no los usaría si pudiera. Tenga cuidado con las incompatibilidades Intel/AMD. Esto puede ser un consejo obsoleto ahora, o puede que no. No tengo forma de saberlo.

EDIT: obsoleto, probablemente por un tiempo muy largo.

+0

Esa es una razón bastante débil para evitar tales instrucciones. No existirían si no cumplieran un propósito. –

+0

¿Tiene un compilador que hace ambos juegos TURBO? Seguro que no. – Joshua

+0

Esto es simplemente incorrecto, todos los procesadores modernos Intel y AMD, y todos los compiladores modernos (GCC, VS) admiten SSE y MMX. – Zifre

4

La pregunta de cómo explotar ESS y otras unidades de pequeña vector automáticamente (sin dirección desde el programador en forma de construcciones de lenguaje especiales o "intrínsecos" especialmente benditos compilador) ha sido un tema de investigación del compilador por algún tiempo. La mayoría de los resultados parecen estar especializados para un dominio de problema en particular, como digital signal processing. No me he mantenido al día con la literatura sobre este tema, pero lo que tiene leído sugiere que la explotación de la unidad vectorial (SSE) sigue siendo un tema de investigación, y que uno debe tener pocas expectativas de compiladores de uso general utilizados comúnmente en el campo.

sugerido término de búsqueda: vectorización compilador

0

Si se utiliza el compilador de Pascal vector obtendrá código SIMD eficiente para este tipo SIMD para los que da una ventaja. Básicamente esto es cualquier cosa de longitud inferior a 64 bits. (para reales de 64 bit, en realidad es más lento hacer SIMD). Las últimas versiones del compilador también se paralelizarán automáticamente a través de los núcleos

+0

real de 64 bits, también conocido como "doble", se beneficia de SIMD en cualquier CPU con SSE2, excepto tal vez Pentium-M/Core Solo donde las operaciones vectoriales 128b se dividieron en dos mitades de 64 bits y las instrucciones multi-uop causan cuellos de botella de decodificación. En cualquier cosa después de Core2 o AMD K10, SIMD es una clara victoria para 'doble' también. –

Cuestiones relacionadas