Java en supercomputación

La máquina virutal java (JVM) es un programa que ejecuta programas realizados en el lenguaje de proposito general Java. Una de las grandes ventajas de Java es que sus programas pueden correr en cualquier sistema operativo – Linux, Solaris, Windows, etc – una vez se haya instalado la máquina virtual java en el ordenador. Es decir, no es necesario ni compilarlo, ni modificarlo para adaptarlo al sistemas operativo nativo del ordenador.

En la supercomputación o HPC (High Performance Computing) se mantiene a día de hoy la percepción de que Java es un lenguaje que ofrece menos rendimiento que los comúnmente utilizados C, C++ o Fortran. Esta creencia tan fuertemente arraigada tiene su origen en las primeras versiones de la JVM. En 1995 cuando apareció la primera versión de Java su rendimiento si era menor al de C++, sin embargo, la JVM ha sufrido notables mejoras de funcionalidad desde su primera versión. Si además tenemos en cuenta las ventajas inherentes que nos ofrece Java no resulta complicado comprender que su uso en HPC se vea incrementado día a día. Se pueden destacar dos capacidades principales que hacen de Java un lenguaje con el potencial necesario para su uso en HPC: “el recolector de basura” y “el compilador Just-In-Time”.

El recolector de basura (Garbage Collector) se encarga de liberar la memoria no usada, lo cual facilita el trabajo de los programadores, deshaciéndose de la necesidad de liberar la memoria explícitamente en las aplicaciones permitiendo un código más limpio, más seguro y unas aplicaciones más robustas. Aunque esta ventaja también implica un gasto mayor de memoria del que otros lenguajes requieren. El compilador Just-In-Time (JIT), que ofrece la posibilidad de la creación y compilación de nuevas funciones mientras la aplicación se esta ejecutando, permite mejorar el rendimiento.

Cálculo numérico con Java

En lo concerniente a las operaciones de cálculo, Java es incapaz de seguir a otros lenguajes como C, tardando tres o incluso cuatro veces más en completar dichas tareas. Esto se debe a que Java no dispone de soporte nativo para números complejos, arrays multidimensionales y que las funciones trigonométricas no se encuentran optimizadas.

Proyectos de supercomputación en Java para el procesamiento de datos

En los últimos dos años se ha avanzado mucho en lo que a supercomputación con Java se refiere, han surgido grandes proyectos destinados tanto al cálculo científico, como al intercambio de grandes cantidades de información en los sectores financieros. Incluso en la Organización Europea para la Investigación Nuclear (CERN) se han llevado a cabo grandes proyectos con Java.

Gaia satellite

The data collected by the Gaia satellite will be analized using Java.

Dentro del ámbito del tratamiento de datos científicos en HPC mediante el uso de Java podemos encontrar la misión astrométrica espacial Gaia. El objetivo de esta misión es enviar una sonda que orbitará alrededor del Sol a una distancia de 1,5 millones de kilómetros de la Tierra durante los próximos 5 años para crear un mapa tridimensional de nuestra galaxia. Se estima que a lo largo de los cinco años que durará la misión la sonda observará miles de millones de estrellas más de 70 veces para obtener datos como: luminosidad, temperatura, gravitación, la composición en elementos químicos… Esta ingente cantidad de datos se analizarán con Java.

Un supercomputador esta formado por diversos nodos de cálculo interconectados entre sí que trabajan conjuntamente. Para esta colaboración es necesaria que los nodos se intercambien información. El modelo más utilizado para lograrlo es el paso de mensajes (Message Passing Interface, MPI), y su equivalente en Java es Message Passing in Java (MPJ). En este proyecto habría que destacar la creación de una aplicación Java llamada “MPJ-Cache”. Este middleware mediante el uso de MPJ ofrece una interfaz de programación (API) de alto nivel que ofrece al programador funcionalidades como: almacenamiento temporal en cache, precarga de datos, división y recombinación de archivos grandes, precarga de datos… de forma distribuida en los nodos. El uso de la misma registró un rendimiento total de hasta 100 Gbps.

En cuanto al procesamiento de grandes cantidades de datos en Java orientados a la supercomputación nos encontramos con la herramienta “LMAX Disruptor”. Fue creada inicialmente para manejar el procesamiento de datos en un entorno financiero, sin embargo, debido al gran avance que ha supuesto aspira a llegar más allá. El problema inicial es que que los bloqueos en las colas que requieran la mediación del Sistema Operativo resultan muy costosos, por ello decidieron crear este framework libre de bloqueos. Para lograrlo hace uso del “magic ring buffer” que, como indica su propio nombre, es un anillo el cual se usa de buffer para pasar de un proceso a otro. Cada registro del buffer guarda un puntero al siguiente proceso. Este sistema sustituye el uso de las colas lo cual ofrece un mayor rendimiento al evitar los bloqueos, sin embargo, incrementa la complejidad del propio código.

Conclusión

Es posible que Java aun tarde años en acabar por alcanzar a C++ y Fortran en su uso, sin embargo la portabilidad que nos ofrece el propio Java es un gran punto a su favor. Esto unido a las diversas librerías y herramientas dota a Java con las funcionalidades necesarias para suplir con creces las necesidades de proyectos de supercomputación. A pesar de ello, tiene carencias difíciles de ser pasadas por alto, como las dificultades mencionadas para los cálculos. Otra desventaja añadida al uso de Java en comparación con otros lenguajes es la memoria, Java requiere más de la que C++ utiliza. De modo que, si bien Java dispone de las capacidades necesarias para el HPC, no siempre resulta ser eficiente en todos los aspectos necesarios, lo cual le augura un futuro incierto como entorno de desarrollo general en HPC, aunque si es viable en ciertos campos.

Gorka Frade Camino,
Alumno en prácticas del centro IEFPS Elorrieta-Erreka Mari en prácticas en el IZO-SGI.

Referecias

Tesis de Aidan Fries. The use of Java in large scientific applications in HPC environments.
Java vs C++ performace.
Wikipedia. High performance computing.

Wikipedia. Compilación en tiempo de ejecución.

Wikipedia. Java.

Wikipedia. Java performance.

Análisis del rendimiento de Java.
LMAX Disruptor.

 

 

1 comment to Java en supercomputación

Leave a Reply