2010-09-05 9 views
5

Necesito optimizar algún código C, que realiza muchos cálculos físicos, usando extensiones SIMD en el SPE del procesador de la celda. Cada operador vectorial puede procesar 4 flotadores al mismo tiempo. Entonces, idealmente, esperaría una aceleración de 4x en el caso más optimista.¿Cuál es el límite de optimización con SIMD?

¿Crees que el uso de operadores vectoriales podría dar mayores aceleraciones?

Gracias

Respuesta

4

La mejor optimización ocurre al repensar el algoritmo. Elimina los pasos innecesarios. Encuentre más una forma directa de lograr el mismo resultado. Calcule la solución en un dominio más relevante para el problema.

Por ejemplo, si la matriz de vector es una lista de n que están todos en la misma línea, entonces es suficiente para transformar sólo los puntos finales e interpolar los puntos intermedios.

+0

sí, por el momento esta es la mejor opción que estoy considerando. – flow

+0

Todo lo cual es correcto, pero ortogonal a la pregunta de qué SIMD puede hacer por usted ... – dmckee

+0

¿Qué quiere decir con 'orthogobal'? – flow

3

Por su cuenta, no. Pero si el proceso de reescribir los algoritmos para respaldarlos también mejora, digamos, la localidad de caché o el comportamiento de bifurcación, entonces podría encontrar aceleraciones no relacionadas. Sin embargo, esto es cierto para cualquier reescritura ...

+0

Estas aceleraciones no relacionadas se suelen llamar aceleración de superliner. –

4

PUEDE ofrecer mejores velocidades hasta 4 veces más que el punto flotante recto, ya que las instrucciones SIMD podrían ser menos exactas (aunque no tanto como para causar demasiados problemas) y así tomar menos ciclos para ejecutar. Realmente depende.

El mejor plan es aprender todo lo posible sobre el procesador que está optimizando. Puede descubrir que puede proporcionarle mejoras mucho mejores que 4x. Puede descubrir que no puede. No podemos decir sin embargo sin saber más sobre el algoritmo que está optimizando y qué CPU está apuntando.

+0

¿Quiere decir pasar del doble a la precisión individual? SSE2 y mejor admite doble precisión, y la mayoría de las plataformas son compatibles con IEEE o al menos cumplen con los requisitos de precisión ... que no son tales que hagan que la aritmética de un solo ciclo sea poco común. – Potatoswatter

+0

No, yo no. Estoy pensando en algunas plataformas diferentes que he usado. Uno es x86 en el que el uso de SSE escalar puede ser mucho más rápido que usar x87. De la misma forma, en una plataforma basada en MIPS, las instrucciones en paralelo se ejecutan más rápido que sus contrapartes escalares y, aun así, puede canalizar instrucciones FPU paralelas escalares y paralelas simultáneamente. – Goz

+0

No lo creo. El PowerPC, por ejemplo, tiene instrucciones que solo estiman el resultado, lo que las hace mucho más rápidas, pero pierde cierta precisión. –

1

Depende de la arquitectura ... Por el momento supongo que es arquitectura x86 (también conocida como SSE).

Puede obtener el factor cuatro en bucles apretados fácilmente. Simplemente reemplace su matemática existente con la instrucción SSE y listo.

Incluso puede obtener un poco más que eso, porque si usa SSE hace los cálculos en registros que generalmente no son utilizados por el compilador. Esto libera el registro de propósito general para otras tareas como control de bucle y cálculo de dirección. En resumen, el código que rodea la instrucción SSE será más compacto y se ejecutará más rápido.

Y luego está la opción de indicarle al controlador de memoria cómo desea acceder a la memoria, p. si desea almacenar datos de forma que evite el caché o no. Para los algoritmos hambrientos de ancho de banda que pueden darte más velocidad adicional.

+0

esto también es un buen punto – flow

+0

Estoy usando SPE del procesador de la celda – flow

+0

Ah, estás trabajando en la SPE. Bueno, aquí se aplican reglas completamente diferentes. la potencia de procesamiento rara vez es una botella. En cambio, la tarea consiste en introducir y sacar los datos de la SPU sin detenerlos. ¡No es trivial! –

2

Esto es completamente posible.

  • Puede hacer más micro optimizaciones de nivel de instrucción que un compilador, si sabe lo que está haciendo.
  • La mayoría de los juegos de instrucciones SIMD ofrecen varias operaciones potentes que no tienen ningún equivalente en el código FPU/ALU escalar normal (por ejemplo, PAVG/PMIN, etc. en SSE2). Incluso si estos no se ajustan exactamente a su problema, a menudo puede combinar estas instrucciones para obtener un gran efecto.
  • No estoy seguro acerca de Cell, pero la mayoría de los conjuntos de instrucciones SIMD tienen características para optimizar el acceso a la memoria, por ejemplo, para captar datos en el caché. He tenido muy buenos resultados con estos.

Ahora bien, esto no es una célula o PPC en absoluto, pero un simple filtro de imagen convolución de mina tiene un aumento de velocidad 20x (C vs. SSE2) en Atom, que es más alto que el nivel de paralelismo (16 píxeles a un momento).

Cuestiones relacionadas