¿Cómo sé si el compilador vectoriza mi código?

9

Como lo ejemplifica la respuesta de Jed Brown a los Costos de las búsquedas versus los cálculos , el uso de operaciones de punto flotante vectorizado versus no vectorizado resulta en un código mucho más rápido. Muchos compiladores modernos afirman que pueden realizar una vectorización automática. ¿Cómo puedo saber qué partes de mi código se están vectorizando con éxito?

Matthew Emmett
fuente

Respuestas:

10

Con el compilador de Intel de cualquier generación moderna, -O3 -vec-report3. El nivel de optimización tres garantiza que está tratando de vectorizar, y el informe vectorial le dirá lo que está haciendo.

La página de GNU sobre vectorización dice que está activada por defecto en el nivel de optimización 3, pero no puedo encontrar el equivalente de vec-report.

Bill Barth
fuente
Gracias por la rápida respuesta. No sabía sobre -vec-report3. ¿Tiene una preferencia de compilador cuando se trata de este tipo de cosas (vectorización automática)?
Matthew Emmett
Los compiladores Intel son realmente buenos, pero solo para chips Intel. Solo tiene que agregar todos los pragmas correctos (#pragma ivdep es el más fácil) GCC 4.7 ha mejorado mucho, pero al revisar algún código con un colega, todavía tiene errores (como no hay vectorización dentro de pragmas openmp).
aterrel
1
Aconsejaría verificar dos veces cómo funciona el compilador Intel con la vectorización en chips AMD. No estoy 100% seguro de que los problemas de antaño aún existan.
Bill Barth
2
@BillBarth Sí, sigue siendo un problema. Consulte el Aviso de optimización (en muchos lugares, por ejemplo, software.intel.com/sites/products/collateral/hpc/compilers/… ). AMD ganó la batalla judicial exigiendo a Intel que revele que son anticompetitivos, no que dejen de serlo. en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler#Criticism Agner Fog en soluciones: agner.org/optimize/blog/read.php?i=49
Jed Brown
@JedBrown, seguro que SSE sigue siendo extraño, pero ¿cuál es la historia con AVX? Esos enlaces indican que las cosas deberían estar bien (ya que ambas compañías implementan AVX), pero no lo he probado en una máquina Bulldozer.
Bill Barth
8

Dentro de la colección del compilador GNU, tiene la opción -ftree-vectorizer-verbose=ndonde nhay un número entre 0 y 6 que imprimirá información similar a icc/ ifort.

Pedro
fuente
5

Con los compiladores de GNU, agregar -Wa,-ahl=asm.svolcará el código de ensamblado generado asm.s.

Con los compiladores Intel, agregar -fcode-asm -Faasm.svolcará el código generado asm.s.

Luego puede inspeccionar el código de ensamblaje y buscar operaciones de punto flotante de vector.

Matthew Emmett
fuente
Estoy completamente de acuerdo en que inspeccionar la salida del ensamblaje es la única forma confiable de determinar si el código está realmente vectorizado. No hay nada que requiera que los compiladores sean honestos sobre sus afirmaciones de vectorizar código.
Jeff