Pregunta

¿Es mejor, en cierto sentido, vectorizar el código a mano, usando pragmas explícitos o confiar o usar la auto-vectorización? Para obtener un rendimiento óptimo utilizando la vectorización automática, uno tendría que monitorear la salida del compilador para asegurarse de que los bucles se están vectorizando o modificarlos hasta que sean vectorizables.

Con la codificación manual, uno está seguro de que se están emitiendo las instrucciones deseadas, pero ahora es probable que el código no sea portátil (ya sea para otras arquitecturas u otros compiladores).

¿Fue útil?

Solución

La vectorización automática nunca funcionó bien para mí. Para mí, parece que la auto-vectorización solo funciona para bucles muy triviales en este momento.

Utilizo el enfoque pragma / intrínseco y observo el ensamblaje. Si el compilador genera un código incorrecto (como derramar registros de SSE en la pila o agregar movimientos redundantes) uso un ensamblador en línea para todo el cuerpo del bucle.

La portabilidad no es un problema por cierto. A menudo, se comienza con un bucle C / C ++ y se optimiza utilizando intrínsecos. Solo mantenga el bucle antiguo y utilícelo como prueba de unidad / reserva para su implementación SIMD. Además, siempre es aconsejable poder eliminar todo el código SIMD de un proyecto a través de una definición en tiempo de compilación. Depurar una aplicación es mucho más fácil de esa manera. La misma definición se puede utilizar para la compilación cruzada.

Otros consejos

Nunca confiaría en la vectorización automática de cualquier compilador. Con gcc estaría doblemente preocupado porque los efectos de las optimizaciones de gcc siempre varían de una versión a otra. Casi todos los que conozco que confían en optimizaciones especiales o extensiones de gcc tienen que lidiar con la ruptura cuando se lanza una nueva versión de gcc .

Por lo general, puede confiar en pragmas e intrínsecos, pero debe estar atento a las notas de lanzamiento para las nuevas versiones de gcc, y debe informar a sus propios usuarios qué versión de gcc se necesita para compilar su código.

Una o dos veces, cuando la vectorización realmente importaba, agregamos algo al conjunto de pruebas para llamar a objdump y verificar que las instrucciones vectoriales realmente se están utilizando. Sería bueno poder detectar el 'código de vector incorrecto' (como lo describe Nils) también, pero nunca hemos llegado tan lejos.

Todavía tengo que ver un vectorizador automático que hace más bien que mal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top