¿Cuál es el lenguaje de programación más utilizado en informática de alto rendimiento? ¿Y por qué? [cerrado]

25

Creo que se usa mucho Fortran en HPC, pero no estoy seguro de si es solo por razones heredadas.

Las características de los lenguajes de programación modernos, como la recolección de basura o el polimorfismo en tiempo de ejecución, no son adecuados para HPC, ya que la velocidad es importante, por lo que no estoy seguro de dónde entran C # o Java o C ++.

¿Alguna idea?

Fanático23
fuente
99
C ++ no tiene un recolector de basura y no requiere que use polimorfismo de tiempo de ejecución.
Jason Baker,
@ Jason Mi intención es descubrir qué características de C ++ lo convierten en un caso convincente para HPC.
Fanatic23
@ Fanatic23 - Entiendo. Solo quería tomar nota de eso. :-)
Jason Baker
1
@Fanatic Desearía poder decir que sí, pero no tengo demasiado ... Sin embargo, sí tengo muchos enlaces sobre algunos problemas de rendimiento en .NET / lenguajes funcionales. Es posible que pueda juntar los conceptos mentalmente para comprender ciertas limitaciones de rendimiento: msdn.microsoft.com/en-us/library/0xy59wtx.aspx stackoverflow.com/questions/2909282/… msdn.microsoft.com/en -us / magazine / cc163329.aspx es.wikipedia.org/wiki/Just-in-time_compilation
Rei Miyasaka
1
Sin embargo, creo que si necesita un tiempo de respuesta realmente bueno, lo que está buscando es un sistema operativo en tiempo real como QNX: en.wikipedia.org/wiki/QNX
Rei Miyasaka

Respuestas:

11

He visto mucho Java utilizado para HPC en áreas donde (1) hay poco código heredado y (2) el tiempo de desarrollo y la calidad del código son importantes. Los dominios de aplicación típicos son finanzas, minería de datos o bioinformática.

Realmente depende de la aplicación (hay vida fuera del álgebra lineal), pero el rendimiento de las JVM recientes a menudo está a la par con el código C. A veces más rápido cuando la JVM es capaz de realizar optimizaciones inteligentes en tiempo de ejecución que los compiladores estáticos (C, Fortran) no pueden hacer. Y definitivamente más rápido cuando hay mucha computación simbólica.

Dado un tiempo fijo para el desarrollo del programa, el código Java resultante es consistentemente más rápido que el código C. HPC en Java definitivamente tiene sentido cuando el código se desarrolla o modifica con frecuencia. Otra característica importante es la movilidad del código en diferentes hardware.

Encontrará referencias en http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html

Con respecto a la suposición de Fortran de que dos direcciones son únicas, estamos trabajando en una herramienta de análisis estático que permitirá optimizaciones similares para el código en lenguajes de alto nivel, pero sin el bit "Pueden suceder cosas malas". Contáctame si estás interesado.


fuente
14
Nitpick: las optimizaciones JIT están disponibles para los compiladores estáticos si estás dispuesto a hacer un poco de trabajo. Tanto GCC como MS Visual Studio admiten optimizaciones guiadas por perfil que optimizan el uso de datos de tiempo de ejecución guardados. Es un poco engañoso sugerir que hay optimizaciones "que los compiladores estáticos (...) no pueden hacer".
Corbin marzo
44
No sé por qué esta es la respuesta aceptada, nada en esta publicación tiene ninguna apariencia de verdad. Los lenguajes basados ​​en C siempre superarán a Java, ya que Java es una máquina virtual dependiente de otro lenguaje inherentemente. Además, todo lo que puede lograr en Java puede lograrlo en C con menos sobrecarga. Los lenguajes basados ​​en C nunca dejarán de ser el lenguaje 'performante'.
Mike
31

En mis años de experiencia, hasta hace 5 años, siempre ha sido Fortran y C. Cuál dependía principalmente de si la gente venía más de la ingeniería o más de la escuela de pensamiento de CS (no sé cómo poner esto mejor) , okey? :-)

En lo que estábamos haciendo, Fortran se usaba casi exclusivamente.

Por lo que leí hoy en día, con las nuevas actualizaciones del Standard F2003 / 08 y con la introducción de Co-Arrays, parece estar cobrando impulso nuevamente.

Además, uno, si no un artículo sesgado, es el lenguaje de programación ideal de HPC

Torre
fuente
16

Creo que para el pedal real al metal, la única opción real es Fortran. El razonamiento es que lo más importante para la explotación del ILP (nivel de instrucción paralizante) de bajo nivel es la desambiguación de la dirección de memoria. Las reglas de facto en Fortran permiten al compilador determinar que dos direcciones son únicas (y, por lo tanto, el orden de las cargas y la tienda, o incluso las tiendas y las tiendas pueden intercambiarse sin riesgo de generar un código incorrecto). C deja demasiado margen para la superposición de punteros para que el compilador extraiga tanto paralelismo de bajo nivel del código.

Además, la alineación de la matriz, las líneas de caché wrt y los límites SSE / AVX son importantes para la generación y ejecución de bucles eficientes. Si las matrices se pasan a través de bloques comunes, el compilador / cargador puede garantizar que todas las matrices comiencen en los mismos límites de alineación de direcciones, y se pueden utilizar cargas y almacenes SSE / AVX más eficientes. El hardware más nuevo puede manejar accesos de memoria no alineados, pero debido a que el acceso a la memoria no está alineado correctamente, el uso parcial de las líneas de caché da como resultado un rendimiento más bajo. Incluso si un programador de C alinea correctamente todas sus matrices, ¿hay algún mecanismo para comunicar esto al compilador?

Para resumir, los dos problemas más importantes son la independencia de las direcciones de memoria y el reconocimiento por parte del compilador de que las estructuras de datos a las que se accede tienen la misma alineación "natural" que el hardware desea. Hasta ahora, Fortran hace el mejor trabajo en esas dos tareas.

Omega Centauri
fuente
2
Recientemente hice un pequeño experimento, encontré el recuento de pop de una cadena de 64000 bits, representada como una matriz larga larga sin signo. Usé exactamente el mismo algoritmo usando muchas cosas aritméticas booleanas y empaquetadas interesantes. En C con -O3 tardó 10 relojes por largo, mientras que con Fortran Intel Fortran 10.1, ¡con la optimización predeterminada era 6.5! ¡Y todos los programadores piensan que C es superior para jugar un poco! Los supuestos de facto de Fortran permiten que se genere de manera segura una codificación de instrucciones de bajo nivel más eficiente.
Omega Centauri
44
Eso debería decir "Las reglas de facto en Fortran permiten al compilador ASUMIR que dos direcciones son únicas ...". Todos los manuales le dicen que el compilador puede asumir esto, y le advierten EN DETALLE que pueden suceder cosas malas si viola esa suposición.
John R. Strohm
15

Solo una nota anecdótica. Yo no he hecho ninguna computación de alto rendimiento.

Para cálculos (cálculo de números), Fortran y C. Sí, es por razones heredadas:

  • Amplia disponibilidad de código fuente de dominio público y recetas.
  • Ambos admiten MPI .
  • Ambos idiomas están compilados.
  • Todos los proveedores y SO de HPC proporcionan compiladores para ambos idiomas.
  • Los compiladores de vectorización están disponibles.
  • Ambos requieren un nivel loco de ajustes para obtener un alto rendimiento cuando se transfiere a un clúster diferente (diferente tamaño de memoria, número de CPU, etc.)
    • Esto realmente explica por qué el código fuente abierto es importante: es necesario ajustar, por lo tanto, la receta original debe estar escrita en un idioma que sea bueno para el ajuste manual.

La tendencia actual para la reducción de números es escribir generadores de programas que automaticen el ajuste del código fuente para optimizar el rendimiento dadas las características del clúster. Estos generadores a menudo salen en C.

Una segunda tendencia es escribir en algún dialecto especializado de C para GPU específicas o Cell BE.

Para el trabajo no numérico, como los programas que procesan datos de una base de datos (pero no de la base de datos en sí), es mucho más económico ejecutar en grupos de máquinas "básicas" sin los costosos equipos de red personalizados. Esto generalmente se llama "Computación de alto rendimiento". Y Python es el idioma # 1 aquí (usando el famoso Map Reduce). Antes de Python, los proyectos de procesamiento por lotes se pueden escribir en cualquier idioma y, por lo general, los envía Condor .

rwong
fuente
1
¿Podrías elaborar un poco sobre la parte del "nivel loco de ajustes"?
Torre
El centro de computación contrata a estudiantes de posgrado para reorganizar las llamadas MPI para que funcione más rápido.
rwong
(?) Primera palabra aquí, pero supongo que las prácticas difieren.
Torre
Era un centro de investigación de modelos climáticos.
rwong
4

He estado trabajando en un código MUY intensivo en cálculos en (¡jadeo!) C #.

Estoy construyendo una implementación GPGPU de FDTD para modelado óptico. En un clúster pequeño (procesador 128), muchas de nuestras simulaciones tardan semanas en ejecutarse. Sin embargo, las implementaciones de GPU tienden a ejecutarse aproximadamente 50 veces más rápido, y eso es en una tarjeta NVidia de nivel de consumidor. Ahora tenemos un servidor con dos tarjetas de doble procesador GTX295 (varios cientos de núcleos) y pronto obtendremos algunos Teslas.

¿Cómo se relaciona esto con tu idioma? De la misma manera que el código C ++ FDTD que estábamos usando antes estaba vinculado a la CPU, estos están vinculados a la GPU, por lo que la diferencia de potencia ( muy pequeña) del código administrado frente al código nativo nunca entra en juego. La aplicación C # actúa como un conductor: carga los núcleos de OpenCL, pasa datos hacia y desde las GPU, proporciona la interfaz de usuario, informes, etc., todas las tareas que son un fastidio en C ++.

En años anteriores, la diferencia de rendimiento entre el código administrado y el no administrado era lo suficientemente importante como para que a veces valiera la pena soportar el terrible modelo de objetos de C ++ para obtener el pequeño porcentaje adicional de velocidad. En estos días, el costo de desarrollo de C ++ vs C # supera con creces los beneficios para la mayoría de las aplicaciones.

Además, la mayor parte de su diferencia de rendimiento no vendrá de su elección de idioma, sino de la habilidad de su desarrollador. Hace unas semanas, moví una operación de división única desde el interior de un bucle anidado triple (recorrido de matriz 3D), lo que redujo el tiempo de ejecución para un dominio computacional dado en un 15%. Ese es el resultado de la arquitectura del procesador: la división es lenta, que es una de esas caras que solo necesita haber recogido en alguna parte.

3Dave
fuente
1
c ++ tiene un modelo de objeto? Pero parece que debería haber utilizado un lenguaje de script para escribir sus controladores: si C # es mejor que C ++ debido a la velocidad de desarrollo, entonces python (o lua, etc.) es similarmente mejor que C #.
gbjbaanb
3
@gbjbaanb No necesariamente. Esta implementación está vinculada a la GPU, pero cambiar a un lenguaje de script podría cambiar eso fácilmente. C # está compilado y tiene un optimizador muy agradable. ¡Los idiomas compilados y fuertemente tipados son tus amigos! Los lenguajes de script menos estrictos tienden a causar un mayor tiempo de desarrollo para cualquier proyecto razonablemente complejo.
3Dave
1
Han pasado siete años. He aprendido mucho C ++ es bastante impresionante, C # también es impresionante, realmente me gusta Python y: el rendimiento de la CPU sigue siendo importante.
3Dave
3

Fortran es más común, principalmente debido al legado (las personas aún ejecutan código antiguo) y la familiaridad (la mayoría de las personas que hacen HPC no están familiarizadas con otros tipos de idiomas).

Las características de los lenguajes de programación modernos, como la recolección de basura o el polimorfismo en tiempo de ejecución, no son adecuados para HPC, ya que la velocidad es importante, por lo que no estoy seguro de dónde entran C # o Java o C ++.

Eso no es cierto en general. La HPC clásica estaba haciendo principalmente álgebra lineal con números de precisión mecánica. Sin embargo, el HPC moderno usa cada vez más supercomputadoras para una variedad más amplia de procesamiento, como los cálculos simbólicos con expresiones matemáticas arbitrarias en lugar de números de precisión de máquina. Esto coloca características bastante diferentes en las herramientas que usa y no es raro usar lenguajes de programación que no sean Fortran porque el cálculo simbólico puede ser prohibitivamente difícil sin GC y otros tipos de compilador de optimización, como el compilador de coincidencia de patrones de optimización de OCaml.

Por ejemplo, lea este artículo de Fischbacher et al. que dice "los autores tienen fuertes razones para creer que este podría ser el cálculo simbólico más grande realizado hasta ahora".

Jon Harrop
fuente
Fortran es común porque muchas personas usan el tiempo de supercomputación para ejecutar simulaciones de sistemas físicos, como el pronóstico del tiempo global, y la implementación de los algoritmos requeridos en Fortran es muy clara y concisa.
Sharpie
3

Fortran, por algunas buenas y otras no tan buenas razones. Para el cálculo matemático pesado, una buena razón es que hay bibliotecas extensas (BLAS, LAPACK) de subrutinas probadas y verdaderas, todas escritas en Fortran (aunque pueden llamarse desde C y C ++).

Una razón no tan buena es la supuesta ventaja de rendimiento de Fortran sobre C / C ++. Los optimizadores son bastante buenos, y pocas personas entienden que el beneficio de optimizar un fragmento de código es proporcional al porcentaje de tiempo que está ocupado, que en casi todo el código es casi cero.

Otra razón no tan buena es una brecha cultural entre los programadores CS y no CS. Los programadores científicos tienden a aprender malos hábitos en Fortran, y menosprecian a los programadores de CS y los malos hábitos que les han enseñado, y a los que menosprecian a los primeros.

Mike Dunlavey
fuente
"La brecha cultural entre los programadores CS y no CS. Los programadores científicos tienden a aprender malos hábitos en Fortran, y menosprecian a los programadores CS y los malos hábitos que se les han enseñado, y a quienes menosprecian a los primeros". En parte, esto es solo que se están concentrando en diferentes aspectos del problema. Fortran significa FORmula TRANslation, y es bastante eficiente para traducir fórmulas matemáticas en código. Para los tipos de programación que los tipos de CS suelen hacer, otros lenguajes son superiores.
Omega Centauri
1
@ Omega: Tienes razón. La gente enseñada por Fortran tiende a no tener ningún concepto de formato, detesta "ninguno implícito" y junta el código porque todavía manejan líneas de 72 caracteres y piensan que hacer un código comprensible es para los débiles. Las personas enseñadas por CS crean pirámides monstruosas de clases atadas con polimorfismos, notificaciones y abstracciones, cuando algo simple haría el trabajo. Entonces se merecen :)
Mike Dunlavey
77
la cita solía ser "los físicos están resolviendo los problemas de mañana en el hardware de ayer, mientras que los chicos de CS están resolviendo los problemas de ayer en el hardware de mañana"
Martin Beckett
@ Martin: Creo que tal vez escuché eso en alguna parte. Seguro suena cierto.
Mike Dunlavey
Martin: Entonces, los chicos de hardware son los más eficientes :)
Dhaivat Pandya
2

Básicamente, todos los programas que hacen el trabajo real de la suma de números siguen siendo FORTRAN (los viejos blas, lapack, arnoldi, etc., siguen siendo los que se usan) ... Sin embargo, cuando se trata de una estructura de nivel superior ... la gente usa cada vez más C ++.

La complejidad de la simulación involucra un código enorme y para obtener cualquier tipo de beneficio de escribir uno es hacerlo reutilizable. Además, los conceptos utilizados también se han vuelto muy complejos. Es casi una locura representar esa información usando FORTRAN. Ahí es donde entra C ++, ya que es inherentemente compatible con el diseño orientado a objetos. Sin embargo, el polimorfismo en tiempo de ejecución rara vez se prefiere. En cambio, las personas casi siempre usan el polimorfismo estático (que se implementa en C ++ con metaprogramación de plantillas)

Además, ahora los compiladores son realmente buenos, por lo tanto, se deja mucha optimización a los compiladores.


fuente
1

Hay dos tipos de problemas que deben abordarse en las aplicaciones de HPC: uno es el procesamiento de números y el otro es la gestión de los cálculos. El primero generalmente se aborda con código escrito en Fortran, C o C ++ debido a la velocidad y al hecho de que ya hay muchos algoritmos científicos escritos en estos idiomas. La dirección de los cálculos se implementa más convenientemente en idiomas de nivel superior. Python es un lenguaje "pegado" de elección para manejar la lógica de la aplicación y llamar a extensiones implementadas en lenguajes compilados. Los proyectos en los que la administración de redes y la computación distribuida son esenciales utilizan con frecuencia Java.

j ..
fuente