¿Qué hace que Fortran sea rápido?


41

Fortran tiene un lugar especial en la programación numérica. Ciertamente, puede hacer un software bueno y rápido en otros idiomas, pero Fortran sigue funcionando muy bien a pesar de su antigüedad. Además, es más fácil hacer programas rápidos en Fortran. He hecho programas rápidos en C ++, pero debes tener más cuidado con cosas como el alias de puntero. Entonces, tiene que haber una razón para esto, y una muy técnica. ¿Es porque el compilador puede optimizar más? Realmente me gustaría conocer detalles técnicos, por lo que si uso otro idioma puedo tener en cuenta estas cosas.

Por ejemplo, sé, o eso creo, que una cosa es que el estándar especifica que los punteros son contiguos en la memoria siempre, lo que significa un acceso más rápido a la memoria. Creo que puedes hacer esto en C ++ dando una bandera al compilador. De esta manera, ayuda saber qué hace Fortran bien, de modo que si usamos otro idioma podemos imitarlo.


77
Diría que esta podría ser una mejor pregunta para stackoverflow, aunque creo que es una buena pregunta. Una búsqueda rápida ( stackoverflow.com/search?q=fortran+fast ) me lleva a esta pregunta que podría ayudarlo: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
Debe especificar qué tipo de fortran está utilizando. Hay una diferencia sustancial entre 77 y 90+. Supongo que al menos 90 si estamos hablando de punteros ...
qubyte

Siempre leí que Fortran es más rápido que C. Bueno, tal vez, pero ¿es más rápido como el 2% o más rápido como el 50%?
shuhalo

44
Es un mito urbano. A menos que el compilador pueda hacer uso de instrucciones especiales, puede optimizar a mano casi cualquier programa, independientemente del compilador, para generar aproximadamente el mismo lenguaje de máquina.
Mike Dunlavey

Respuestas:


50

Los diseñadores de idiomas enfrentan muchas opciones. Ken Kennedy enfatizó dos: (1) mejores abstracciones y (2) código de nivel superior o inferior (menos o más parecido a una máquina). Mientras que los lenguajes funcionales como Haskell y Scheme se enfocan en el primero, los lenguajes tradicionales de computación científica como Fortran y C / C ++ se enfocan en el segundo. Decir que un idioma es más rápido que otro suele ser bastante engañoso: cada idioma tiene un dominio problemático por el que sobresale. Fortran tiene mejores resultados en el dominio de los códigos numéricos basados ​​en matrices que en otros idiomas por dos razones básicas: su modelo de matriz y su carácter explícito.

Modelo de matriz

Los programadores de Fortran realizan en gran medida manipulaciones de matriz. Para eso, Fortran facilita varias optimizaciones del compilador que no están disponibles en otros idiomas. El mejor ejemplo es la vectorización: conocer el diseño de los datos permite al compilador invocar intrínsecos a nivel de ensamblado sobre la matriz.

Lenguaje explícito

Si bien parece que un lenguaje más simple debería compilar "mejor" que uno más complejo, ese no es realmente el caso. Cuando uno escribe en un lenguaje ensamblador , no hay mucho que un compilador pueda hacer: todo lo que ve son instrucciones muy detalladas. Fortran requiere de forma explícita (por lo tanto, más trabajo por parte del programador) solo en casos que producen recompensas reales para la informática basada en matrices. Fortran utiliza tipos de datos simples, flujo de control básico y espacios de nombres limitados; por el contrario, no le dice a la computadora cómo cargar registros (lo que podría ser necesario en tiempo real ). Cuando Fortran es explícito, permite cosas como la inferencia de tipos completa, lo que ayuda a los principiantes a comenzar. También evita una cosa que a menudo hace que C sea lenta:punteros opacos .

Fortran puede ser lento

Fortran no es rápido para todas las tareas: es por eso que no muchas personas lo usan para construir interfaces gráficas de usuario o incluso para computación científica altamente desestructurada. Una vez que abandona el mundo de los arreglos para gráficos, árboles de decisión y otros reinos, esta ventaja de velocidad desaparece rápidamente. Consulte los puntos de referencia del lenguaje informático para ver algunos ejemplos y números.


77
Los problemas de GUI / IO se pueden resolver fácilmente envolviendo el crujido de Fortran en un lenguaje de "propósito más general". Con frecuencia uso R para este propósito.
mbq

2
shootout.alioth.debian.org ya no está disponible! Y la nueva versión tiene mucha menos información :(
astrojuanlu

23

El diseño de Fortran permite al compilador realizar optimizaciones más fuertes en algunos casos, optimizaciones que generalmente no están disponibles para C.

Un ejemplo famoso es el manejo del alias . En Fortran, puede acceder a un área de memoria específica solo a través del símbolo específico asociado con esa área de memoria. Este conocimiento permite al compilador emplear trucos inteligentes cuando es hora de almacenar en caché: sabe si un valor ha cambiado potencialmente o no. Hasta F90, esto se verificó fácilmente. Cuando se introdujo Fortran 90 pointers, la suposición ya no era cierta: se podía acceder a la misma área de memoria a través de dos (o más) símbolos. Esta es la razón por la que debe especificar las targetmatrices que desea abordar mediante punteros.

Otro hecho interesante es que muchas construcciones permiten que el compilador realice paralelización sin intervención del usuario. Tal lujo es posible debido al relativo "agnosticismo de plataforma" de Fortran como lenguaje.

Hay muchos otros trucos sutiles como este. Además, recuerde que nadie usa Fortran hoy, a excepción de los cálculos numéricos, lo que significa que la característica principal y el punto de venta de los compiladores de Fortran es la velocidad del código resultante. Como resultado, los proveedores se centraron en esto.

Sin embargo, puede producir código de rendimiento también con otros idiomas. Sin embargo, puede requerir cuidados especiales o intervención humana. El punto general, sin embargo, es que el rendimiento no es un problema hasta que hay un problema, y ​​el tiempo del hombre es mucho más costoso que el tiempo de la computadora. Por lo tanto, las prácticas de codificación deberían centrarse en ahorrar tiempo humano, en lugar de tiempo de computadora.


2
Cuando sus computadoras entran en el rango de> $ 100 millones, el tiempo de las personas (estudiantes de posgrado) deja de parecer tan caro en comparación.
Phil Miller

66
@Novelocrat: La cantidad de código que se ejecuta en una computadora de $ 100 millones ha sido escrita por incontables horas de trabajo que van mucho más allá de la marca de $ 100 millones, incluso a precio de estudiante graduado. Recuerde que el costo de una persona es el doble de sus ingresos. El resto entra en impuestos y correlacionado. Además, una computadora no experimenta quemaduras. Una persona lo hace y cambiará de trabajo.
Stefano Borini

1
@StefanoBorini Tengo una larga historia de PC que experimentaron quemaduras ...
N74

1
"Además, recuerde que nadie usa Fortran hoy, a excepción de los cálculos numéricos," Fortran = "FORmula TRANslation". Fortran siempre se usó y diseñó principalmente para cálculos numéricos. Fortran tiene una gran parte del tiempo de las computadoras de alto rendimiento.
user21387

Hoy, así como siempre, Fortran se usa con el mismo propósito: cálculos numéricos.
secuencia

12

No creo que Fortran esté tan cerca del metal (ver otra respuesta) pero tiende a optimizarse muy fácilmente. Los bucles son simples, y el lenguaje admite fácilmente extensiones de vectorización (está bien cuando lo usé en mi primer trabajo estábamos apuntando a una amplia gama de vectores de hierro grande).

También existe el gran factor de inercia. Existe una gran cantidad de código numérico en Fortran, por lo que los creadores de servidores de alta gama y supercomputadoras se aseguran de que escriban bien los compiladores de Fortran. Los compiladores son buenos (incluso en máquinas con una relativa falta de compiladores de alta calidad) por lo que los usuarios continúan usando el Fortran e incluso escriben código nuevo en él. Entonces los constructores se aseguran de que su próxima generación tenga buenos compiladores, etc.


8

Tenga cuidado con los mitos urbanos aquí. Si dos compiladores generan el mismo código de ensamblaje, los programas resultantes tendrán el mismo rendimiento.

Para cualquier pieza lógica, hay un programa en lenguaje ensamblador que minimiza su tiempo de ejecución. A ese programa no le importa qué compilador lo generó.

Dicho esto, existen lenguajes compilados para facilitar la vida del programador. Parte del costo de esto es que pueden tentar al usuario a usar funciones que no resultan en un tiempo de ejecución mínimo. El mejor ejemplo de esto está newen C ++. (¿Qué tan lento puede ser, son solo tres caracteres?) Prácticamente le ruega que asigne memoria dinámicamente y no preste atención al costo de tiempo de ejecución. Si eso es lo que quieres hacer, es genial, pero Fortran podría ser más rápido solo porque no te atrapó para hacerlo.

Pero mucho más allá de eso, nunca he visto un programa que, como se escribió por primera vez, no tuviera mayor margen para mejorar el rendimiento del tipo que el compilador nunca podría limpiar para usted. Como un ejemplo, pasar una gran fracción de tiempo llamando expy / o logrepetidamente con el mismo argumento. Como otro ejemplo, llamar a DGEMM para multiplicar matrices y descubrir que una gran fracción de tiempo se usa para llamar a LSAME solo para descifrar sus argumentos de caracteres de entrada.

Esto es al mismo tiempo que la gente dice que Fortran es más rápido debido al alias del puntero o al desenrollamiento del bucle. Eso es como decir que un autobús hecho por Porsche ciertamente sería más rápido que un autobús hecho por Chevrolet. Tiene que haber un poco de sentido común.


44
No creo que sea solo un mito urbano. El soporte de Fortran para operaciones de matriz completa, funciones PURAS / ELEMENTALES, etc. puede ayudar a los compiladores a optimizar / vectorizar fácilmente o incluso paralelizarlos. Por ejemplo, consulte thinkingparallel.com/2007/08/14/… . Lo que los compiladores realmente hacen es una historia diferente (depende del proveedor).
stali

@stali: depende de más que el vendedor. Depende del programa que se está compilando. He visto a personas generalizar desde "existe un programa que Fortran puede hacer que se ejecute rápido" a "Fortran es más rápido en cualquier programa". Si señala esto, las personas pueden comenzar a cortar y cortar y dividir los pelos, y al final todo se reduce a lo que la gente quiere pensar.
Mike Dunlavey
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.