compiler community c++ c cuda fortran

c++ - community - pgi compiler



Fortran vs C++, ¿Fortran todavía tiene alguna ventaja en el análisis numérico en estos días? (5)

Con el rápido desarrollo de los compiladores de C ++, especialmente los de Intel, y la capacidad de aplicar directamente las funciones SIMD en sus códigos C / C ++, ¿Fortran todavía tiene alguna ventaja real en el mundo de los cálculos numéricos?

Soy de una formación matemática aplicada, mi trabajo implica una gran cantidad de análisis numéricos, cálculos, optimizaciones y demás, con un requisito de rendimiento estrictamente definido.

Casi no sé nada acerca de Fortran, tengo algo de experiencia en C / CUDA / matlab (si consideras que este último es un lenguaje informático para comenzar), y mi tarea diaria implica el análisis de datos muy grandes (por ejemplo, una matriz de 10 GB), y parece que el programa al menos gasta 2/3 de su tiempo en el acceso a la memoria (por eso envío parte de su trabajo a la GPU), ¿piensan ustedes que puede valer la pena que pruebe la rutina Fortran por lo menos? ¿Alguna parte crítica de mi código de rendimiento para mejorar el rendimiento de mi programa?

Debido a que la complejidad y las cosas deben hacerse involucradas allí, solo seguiré esa rutina si solo hay un beneficio significativo en el rendimiento, gracias de antemano.


El código de Fortran es mejor para operaciones de tipo matriz y vector en general. Pero también puede producir un rendimiento similar con el código c / c ++ pasando sugerencias / sugerencias al compilador para producir instrucciones de vectores de calidad similares. Una opción que me dio un buen impulso fue no asumir un alias de memoria entre las variables de entrada que son objetos de matriz. De esta manera, el compilador puede realizar agresivamente el desenrollado y la canalización del bucle interno para ILP, donde puede superponer cargas y almacenar la operación a través de la iteración del bucle con los pasos previos correctos.


Fortran es naturalmente adecuado para la programación numérica. Tiende a tener una gran cantidad de números en dichos programas, generalmente arreglos arreglados. Las matrices son ciudadanos de primera clase en Fortran y, a menudo, es bastante sencillo traducir los núcleos numéricos de Matlab a Fortran. Con respecto a las ventajas potenciales de rendimiento, vea las otras respuestas, que cubren esto muy bien. La línea de base probablemente sea que puede crear aplicaciones numéricas altamente eficientes con la mayoría de los lenguajes compilados hoy en día, pero puede saltar algunos bucles para llegar allí. Fortran fue diseñado cuidadosamente para permitir que el compilador reconozca la mayoría de los sitios para optimizaciones, debido a las características del lenguaje. Por supuesto, también puede escribir código lento arbitrario con cualquier lenguaje compilado, incluido Fortran. En cualquier caso, debes elegir las herramientas adecuadas. Fortran se adapta a aplicaciones numéricas, C se adapta al desarrollo del sistema. En un comentario final, aprender lo básico de Fortran no es difícil, y siempre vale la pena echar un vistazo a otros idiomas. Esto abre una vista diferente sobre los problemas que desea resolver.


Fortran tiene una semántica de alias estricta en comparación con C ++ y ha sido optimizado para el rendimiento numérico durante décadas. Los algoritmos que utilizan la CPU para trabajar con matrices de datos a menudo tienen el potencial de beneficiarse de una implementación de Fortran.

Los lenguajes de programación shootout no deben tomarse demasiado en serio, pero de los 15 puntos de referencia, Fortran se ubica en el número 1 en velocidad en cuatro de ellos (para Intel Q6600, un núcleo), más que en cualquier otro idioma. Puedes ver que los puntos de referencia en los que brilla Fortran son los altamente numéricos:

Contraejemplo:

  • k-nucleotide 500% más lento (este punto de referencia se centra en gran medida en estructuras de datos más sofisticadas y procesamiento de cadenas, que no es la fortaleza de Fortran)

También puede ver una página de resumen " cuántas veces más lenta " que muestra que de todas las implementaciones, el código de Fortran es, en promedio, el más cercano a la implementación más rápida para cada punto de referencia, aunque las barras de cuantiles son mucho más grandes que para C ++, lo que indica que Fortran no es adecuado para algunas tareas en las que C ++ es bueno, pero ya debería saberlo.

Así que las preguntas que tendrás que hacerte son:

  1. ¿La velocidad de esta función es tan importante que vale la pena reimplementarla en Fortran?

  2. ¿Es el rendimiento tan importante que mi inversión en el aprendizaje de Fortran dará sus frutos?

  3. ¿Es posible usar una biblioteca como ATLAS en lugar de escribir el código yo mismo?

Responder estas preguntas requeriría un conocimiento detallado de su código base y modelo de negocio, por lo que no puedo responderlas. Pero sí, las implementaciones de Fortran suelen ser más rápidas que las implementaciones de C ++.

Otro factor en su decisión es la cantidad de código de muestra y la cantidad de implementaciones de referencia disponibles. La sólida historia de Fortran significa que hay una gran cantidad de códigos numéricos disponibles para descargar e incluso con un viaje a la biblioteca. Como siempre, tendrás que buscarlo para encontrar las cosas buenas.


La respuesta completa y correcta a su pregunta es: "sí, Fortran tiene algunas ventajas".

C ++ también tiene algunas, diferentes, ventajas. Lo mismo ocurre con Python, R, etc. Son diferentes idiomas. Es más fácil y rápido hacer algunas cosas en un idioma y otras en otros. Todos son ampliamente utilizados en sus comunidades, y por muy buenas razones.

Cualquier otra cosa, en ausencia de preguntas más específicas, es solo el ruido y el lenguaje de la guerra, por lo que he votado para cerrar la pregunta y espero que otros también lo hagan.


También vale la pena mencionar que Fortran es mucho más fácil de dominar que C ++. De hecho, Fortran tiene una especificación de lenguaje más corta que C simple y su sintaxis es posiblemente más simple. Puedes recogerlo muy rápido.

Lo que significa que si solo está interesado en aprender C ++ o Fortran para resolver un problema específico que tiene en este momento (por ejemplo, para acelerar los cuellos de botella en algo que escribió en un lenguaje de creación de prototipos), Fortran podría darle un mejor retorno de la inversión. .