Pregunta

¿Es posible derivación de vectorización de bucle en FORTRAN? Estoy escribiendo a las normas F77 para un proyecto en particular, pero la gfortran GNU compila a través Fortrans modernas, tales como F95. ¿Alguien sabe si ciertas normas FORTRAN evitarse vectorización bucle o si hay algunas banderas / opciones en gfortran desactivar esta opción?

ACTUALIZACIÓN: Por lo tanto, creo que la solución final al problema específico tiene que "ver" con el FORTRAN NO bucles que permite la actualización de la variable de iteración. La mención de esto se puede encontrar en la respuesta del @High Rendimiento Marca sobre este tema relacionado ... vectorización Loop y cómo evitarlo

[en el fuerte, RAN los noobs en busca de refugio.]

¿Fue útil?

Solución

Los estándares Fortran son generalmente dice nada sobre cómo se implementará la lengua, dejando que a los autores de compiladores que están en una mejor posición para determinar la mejor, o buenas (y malas) opciones para la implementación de las diversas características de la lengua en cualquiera que sea la arquitectura de chip (s) que se está escribiendo.

¿Qué quiere decir cuando escribe que se desea anular la vectorización de bucle? Y en la siguiente frase sugiere que esto podría no estar disponible para Fortran77 programas? Es perfectamente normal para un compilador para una CPU moderna para generar instrucciones vectoriales si la CPU es capaz de obedecer a ellos. Esto es cierto lo que sea la versión del idioma del programa está escrito en.

Si realmente no desea generar instrucciones vectoriales entonces usted tiene que examinar cuidadosamente la documentación gfortran - no es un compilador que utilizo por lo que no se puede apuntar a opciones o banderas específicas. Es posible que desee ver en sus capacidades para la generación de código de la arquitectura específica, prestando especial atención a nivel SSE.

Usted puede ser capaz de coaccionar el compilador para que no vectorising bucles si todos sus bucles son explícitas (por lo que no hay operaciones de todo el array) y si usted hace su código sea difícil de vectorize de otras maneras (dependencias entre iteraciones del bucle, por ejemplo). Sin embargo, un buen compilador moderno, sin interferencia, va a intentar su damndest a los bucles Vectorise para su propio bien.

Parece bastante perverso para mí para tratar de obligar al compilador a ir en contra de su naturaleza, tal vez podría explicar por qué quiere hacer eso con más detalle.

Otros consejos

Como escribió Alto Rendimiento Marcos, el compilador es libre de seleccionar instrucciones de máquina para implementar su código fuente, siempre y cuando los resultados siguen las reglas de la lengua. Usted no debe ser capaz de observar alguna diferencia en los valores de salida como resultado de la vectorización de lazo ... que el código debe correr más rápido. Entonces, ¿por qué te importa?

A veces, las diferencias pueden observarse en distintos niveles de optimización, por ejemplo, en algunas arquitecturas registros tienen una precisión adicional.

El lugar para buscar este tipo de optimizaciones del compilador gcc es el manual. Se encuentran allí desde que son comunes en la suite del compilador gcc.

Con la mayoría de los compiladores modernos, la opción de línea de comandos -O0 debe apagar todas las optimizaciones, incluyendo la vectorización bucle.

He encontrado que a veces esto provoca errores a parecer desaparecer. Sin embargo por lo general significa esto que hay algo malo en mi código por lo que si este tipo de cosas sucede a usted, entonces es casi seguro que haya escrito un programa con errores.

Es teóricamente posible, pero mucho menos probable que hay un error en el compilador, se puede comprobar fácilmente esta compilando el código en otro compilador de FORTRAN. (Por ejemplo gfortran o g95).

gfortran qué no auto-vectorización menos que haya establecido o -O3 -ftree-vectorizar. Por lo que es fácil de evitar la vectorización. Es probable que tenga que leer (descremada) el manual de gcc, así como el gfortran.
Auto-vectorización ha sido una característica bien conocida de los compiladores de Fortran hace más de 35 años, e incluso la definición de Fortran 77 de bucles Do fue establecido con esto en mente (y también en vista de algunos abusos no portátiles conocidos de la norma F66). No se podía contar con apagar vectorización como una manera de hacer el trabajo un código incorrecto, aunque podría exponer a los síntomas de un código incorrecto.

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