Intel Fortran Compiler: consejos sobre optimización en la compilación

21

Comenzaré con mi experiencia personal en nuestro laboratorio. En los últimos 9 y 10 días, solíamos ser bastante agresivos con las optimizaciones, compilando con -O3 e indicadores específicos del procesador (-xW -xSSE4.2 por ejemplo). Pero comenzando con ifort 11, comenzamos a notar:
1. algunas inconsistencias en los resultados (porque la semántica no se conservó)
2. ganancias menores en comparación con -O2.

Por lo tanto, actualmente simplemente compilamos con -O2 y -xhost. ¿Tiene mejores sugerencias con ifort 11? ¿Cambiará esto una vez más a medida que hacemos la transición al ifort 12? Gracias por adelantado.

FrenchKheldar
fuente
77
Las optimizaciones no benefician a todos los códigos de manera uniforme. Por lo tanto, creo que una mejor pregunta sería "¿Cómo podría perfilar mi código para saber qué optimizaciones del compilador son efectivas?"
Matt Knepley
1
¿Porque la semántica no fue preservada, o porque algo fue reordenado? Esto puede estar alejándose un poco del tema, pero sería bueno ver un fragmento de código que reproduzca el problema. Es posible que se haya reordenado algo de una manera que no le gusta pero que el compilador cree que debería estar bien. Mi experiencia es que Intel 12 hace un mejor trabajo de vectorización que cualquiera de sus predecesores, por lo que esperaría que se produzcan más cambios cuando cambie a la última.
Bill Barth
Pensé que decir que la semántica no se conservaba era equivalente a ordenar no se conservaba. De todos modos, me doy cuenta de que mi pregunta es (¿también?) Genérica, y no quería pensar en detalles. Hemos tenido varios problemas con Intel 10, algunos fueron errores del compilador y otros quedaron sin explicación. Entonces, con 11, hemos estado jugando a lo seguro y estamos contentos con el rendimiento. Pero tal vez estamos jugando demasiado seguro, y quería saber si la comunidad tenía algún consejo.
FrenchKheldar

Respuestas:

16

Recomendamos encarecidamente que todos nuestros usuarios comiencen -O3 -xHost -ipotanto con ifort 11 como con ifort 12. Si hay transformaciones de punto flotante particulares habilitadas por O3 que afectan la precisión de algunos de sus cálculos, puede desactivarlos específicamente con -fp-model precise -fp-model except(o, más drásticamente -fp-model strict) mientras se conservan las otras optimizaciones que O3 permite, como el bloqueo de bucle para caché, fusión y desenrollado de bucle, y optimizaciones de acceso a memoria.

Aconsejaría probar las cosas del modelo de punto flotante en archivos individuales y descubrir dónde hace la diferencia, en lugar de desactivarlo globalmente; puede ser un aumento de velocidad de ~ 15%, y desea poder mantener eso donde no afecte sus cálculos. Si no está seguro de dónde se ve afectada la precisión, puede jugar activando y desactivando las banderas del modelo de punto flotante para esos archivos, o jugando con modos de redondeo .

Recientemente dimos una breve charla a nuestros usuarios sobre los indicadores de optimización, centrándonos en los compiladores de GNU e Intel para x86; Puedes ver las diapositivas de esa charla aquí .

Por cierto, mientras hablamos de elegir banderas de optimización para su código, de vez en cuando también vale la pena mirar la salida de -vec-report para ver dónde el compilador intentó vectorizar un bucle y no pudo; a veces hay pequeños cambios que puede hacer en su ciclo que pueden resultar en una posible vectorización (que puede ser una aceleración 4x). Del mismo modo para el informe más general -opt-report .

nullglob
fuente
Me gusta su respuesta, pero lo intenté nuevamente con uno de nuestros casos de prueba y -O3 -xhost -fp-model precise -fp-model exceptresultó en una desaceleración del 30% . Volveré a mirar los perfiles y -vec-reporttrataré de ver qué está pasando ...
FrenchKheldar
2
Sobre -O2 -xhost? Eso es interesante; Es muy inusual pero puede suceder. En casos como este, el optimizador está haciendo algo que tiene buenas razones para pensar que mejorará la velocidad, pero resulta que empeora las cosas. Por lo general, para el código científico, que tiene una estructura bastante sencilla, eso no sucede. En casos como este, la Optimización guiada de perfil ( software.intel.com/sites/products/documentation/hpc/compilerpro/… ) a menudo puede ayudar.
5

Trabajo para una empresa que produce aplicaciones grandes y altamente técnicas en Fortran con IFort: las aplicaciones son muy críticas para el rendimiento, ya que la velocidad (mientras se mantiene la precisión) es el principal punto de venta.

Siempre compilamos con -O3, y que yo sepa, las cosas principales que hace -O3 son el desenrollado de bucle y la captación previa. Sospecho que la mayoría de las aplicaciones informáticas científicas se benefician enormemente de estas, en particular las optimizaciones de bucle. No hemos visto errores del compilador en bastante tiempo (aunque hemos visto algunos errores de enlazador al usar Ifort en una Mac). Usamos 11.1.095.

Espero que esto ayude.

OscarB
fuente
4

Me doy cuenta de que esta respuesta es probablemente demasiado, demasiado tarde, pero para una optimización agresiva, la opción "rápida" parece ser la solución más fácil. Extractos de la página del manual:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
usuario5428
fuente