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?
programming-languages
Fanático23
fuente
fuente
Respuestas:
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
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
fuente
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.
fuente
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:
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 .
fuente
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.
fuente
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).
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".
fuente
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.
fuente
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
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.
fuente