Ateji PX es una extensión de lenguaje de programación orientada a objetos para Java . Está destinado a facilitar la computación en paralelo en procesadores multinúcleo , GPU , Grid y Cloud.
Paradigma | orientado a objetos , cálculo pi |
---|---|
Disciplina de mecanografía | fuerte , estático |
Licencia | comercial, prueba premium gratuita de 30 días y edición gratuita |
Sitio web | www.Ateji.com |
Influenciado por | |
Java |
Ateji PX se puede integrar con Eclipse IDE , requiere un aprendizaje mínimo de las construcciones paralelas adicionales y no altera el proceso de desarrollo.
Ejemplos de código
Hola Mundo
public class HelloWorld { public static void main ( String [] args ) { [ || Sistema . fuera . println ( "Hola" ); || Sistema . fuera . println ( "Mundo" ); ] } }
Cada ||
símbolo introduce una rama paralela. Ejecutar este programa imprimirá
HolaMundo
o
MundoHola
dependiendo de cómo se programen las ramas paralelas.
Paralelismo de datos
[ || ( int i : matriz . longitud ) matriz [ i ] ++ ; ]
La cuantificación (int i : N)
crea una rama paralela para cada valor de i
. El efecto de este código es incrementar todos los elementos de array
en paralelo. Este código es equivalente a
[ || matriz [ 0 ] ++ ; || matriz [ 1 ] ++ ; ... || matriz [ matriz . longitud - 1 ] ++ ; ]
Son posibles cuantificaciones más complejas. El siguiente ejemplo cuantifica sobre el triángulo superior izquierdo de una matriz cuadrada:
[ || ( int i : N , int j : N , si i + j < N ) matriz [ i ] [ j ] ++ ; ]
El código que realiza una operación similar y típicamente pequeña en una gran colección de elementos se denomina datos en paralelo y aparece a menudo en aplicaciones científicas de alto rendimiento. Un representante típico de lenguajes paralelos de datos para los ecosistemas C / C ++ o Fortran es OpenMP .
Las funciones de paralelismo de datos también se pueden implementar mediante bibliotecas que utilizan estructuras de datos dedicadas, como matrices paralelas .
Paralelismo de tareas
El término paralelismo de tareas se utiliza cuando el trabajo puede descomponerse conceptualmente en varias tareas lógicas. En este ejemplo, las tareas se crean de forma recursiva:
int fib ( int n ) { if ( n <= 1 ) return 1 ; int fib1 , fib2 ; // crea recursivamente ramas paralelas [ || fib1 = fib ( n - 1 ); || fib2 = fib ( n - 2 ); ] return fib1 + fib2 ; }
El paralelismo de tareas se implementa en lenguajes como Cilk y en bibliotecas similares al fork/join
par de llamadas al sistema Unix.
Paso de mensajes
Las ramas paralelas tienen dos formas de comunicarse; ya sea leyendo y escribiendo simultáneamente variables compartidas o enviando mensajes explícitos. Los operadores !
y ?
respectivamente envían y reciben un mensaje en un canal.
En este ejemplo, dos ramas paralelas se comunican mediante el paso de mensajes explícitos:
Chan < Cadena > chan = nuevo Chan < Cadena > (); [ // rama 1 envía un valor por el canal || chan ! "Hola" ; // la rama 2 recibe un valor del canal y lo imprime || chan ? s ; Sistema . fuera . println ( s ); ]
Flujo de datos
Se dice que un programa es un flujo de datos cuando el cálculo se inicia y se sincroniza mediante la disponibilidad de datos en un flujo. Un ejemplo típico es un sumador: tiene dos entradas, una salida, y cuando las dos entradas están listas, envía su suma a la salida.
Sumador vacío ( Chan < Integer > in1 , Chan < Integer > in2 , Chan < Integer > out ) { para (;;) { int valor1 , valor2 ; [ in1 ? valor1 ; || in2 ? valor2 ; ] ; fuera ! valor1 + valor2 ; }}
Tenga en cuenta la lectura paralela [ in1 ? value1; || in2 ? value2; ]
. Significa que los dos valores de entrada pueden venir en cualquier orden. Sin él, el código puede bloquearse si los valores vienen en el orden incorrecto. Esto muestra que las primitivas paralelas en un lenguaje de programación no solo se refieren al rendimiento, sino también al comportamiento de los programas.
El sumador por sí solo no hace nada, ya que reacciona a los datos de entrada. Debe colocarse en un contexto en el que otras partes alimentan valores de entrada y leen valores de salida. La forma de expresar esto es componer todas las piezas en un gran bloque paralelo:
[ || fuente ( c1 ); // genera valores en c1 || fuente ( c2 ); // genera valores en c2 || sumador ( c1 , c2 , c3 ); || fregadero ( c3 ); // leer valores de c3 ]
Cualquier cosa que pueda considerarse una combinación de puertas lógicas o circuitos eléctricos puede expresarse fácilmente de esta manera como un programa de flujo de datos.
enlaces externos
- El libro blanco de Ateji PX Una breve introducción a las funciones del idioma
- El manual de idioma de Ateji PX
- Artículo Think Parallel, Think Java en Dr. Dobbs
- Empresa francesa elabora una oferta de Java paralela