Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porManuela Toro Cruz Modificado hace 7 años
1
GRIDS & e- Ciencia Curso Postgrado CSIC Junio 2006, Santander
David Rodríguez Consejo Superior de Investigaciones Científicas Instituto de Física de Cantabria, IFCA (Centro Mixto CSIC-Universidad de Cantabria) Santander España Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
2
Programación Paralela con MPI
David Rodríguez Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
3
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Contenido Introducción Modelos de computación: HTC y HPC Computación paralela Paradigma de paso de mensajes El estándar MPI Tipos de comunicación Funciones básicas y tipos de datos Algunas implementaciones Introducción a la programación en MPI Compilar y ejecutar programas MPI con MPICH Obtención de información e intercambio de mensajes MPICH-G2 Ejecución de programas en el grid Una aplicación más compleja en grid (ANN). Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
4
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
HTC y HPC High throughput computing (HTC). Se utilizan grandes cantidades de recursos computacionales durante largos periodos de tiempo. Lo importante es conseguir una gran cantidad de tiempo de cpu de media durante mucho tiempo, no la respuesta rápida. Se lanzan muchos trabajos independientes, y se trata de optimizar el número de trabajos ejecutados por unidad de tiempo. Colas tipo Condor, PBS, LSF… Ejemplo: simulación de sucesos en colisionadores de altas energías. High performance computing (HPC). Consiste en lograr disponer durante un periodo de tiempo corto de una gran cantidad de recursos computacionales. Lo importante es que la aplicación se ejecute en el menor tiempo posible. Aplicaciones paralelas. Ejemplo: entrenamiento distribuido de una red neuronal artificial. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
5
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Computación paralela La que se realiza usando procesos separados. Interactúan intercambiando información. Existen diversos tipos de computación paralela. Todas usan distintos datos en cada proceso: Paralelismo en los datos (“data-parallel”): Mismas operaciones en datos distintos. También llamado SIMD (Single Instruction Multiple Data). Máquinas vectoriales. SPMD: Mismo programa, datos distintos. MIMD: Programas y datos diferentes. SPMD y MIMD son esencialmente lo mismo porque cualquier programa MIMD puede implementarse como SPMD. MPI se utiliza principalmente para SPMD/MIMD. HPF (High Performance Fortran) es un ejemplo de una interfaz de programación SIMD. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
6
¿Por qué es necesaria la computación paralela?
Límites físicos en la mejora de las máquinas. Los sistemas de alto rendimiento especializados resultan muy caros. La computación paralela en clusters de PCs resulta más asequible. Y hace más fácil compartir los recursos (como en el grid). Muchos problemas pueden ser resueltos mucho más rápidamente gracias a la paralelización. Sin embargo, esta no es siempre una buena solución, depende mucho del tipo de problema a resolver. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
7
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Speedup “Speedup”: es la medida de la mejora que se consigue al ejecutar un programa o algoritmo en varios procesadores de forma paralela, con respecto a lo que se tarda en un sistema uniprocesador. Entonces el speedup S es el cociente entre el tiempo secuencial ts y el tiempo en n procesadores tn: S = ts/tn Pero hay que tener en cuenta que no todo el código de un programa es paralelizable. Ley Amdahl: da un límite para el speedup S = (ts + tn)/(ts + tn/n) Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
8
Paradigma de paso de mensajes
Probablemente más extendido hoy día en programación de aplicaciones paralelas. Consiste en una serie de procesos que interactúan por medio de mensajes. Cada proceso puede ejecutar código distinto y sobre diferentes datos. El modelo de paso de mensajes es valido tanto para sistemas de memoria compartida como para sistemas de memoria distribuida (cluster & grid computing). El intercambio de mensajes es cooperativo: los datos deben ser tanto enviados como recibidos explícitamente. Esto supone una ventaja en cuanto a que la modificación en la memoria del proceso es conocida por este. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
9
MPI (Message Passing Interface)
Es una interfaz estándar (1993) para la programación usando el paradigma de paso de mensajes. Sirve tanto para grandes computadores de memoria compartida, como para clusters o redes de ordenadores heterogéneos (incluido el grid computing). Definida para C, C++ y FORTRAN. Comprende una gran cantidad de funciones (128), macros, etc. Pero con 6 funciones básicas se puede empezar a programar usando MPI. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
10
Implementaciones de MPI
Existen bastantes implementaciones del estándar MPI. Algunas son debidas a proveedores de hardware que las proporcionan (optimizadas) paras sus máquinas (IBM, HP, SGI…), otras son desarrolladas en el ámbito académico. Algunas implementaciones son: MPICH (MPICH 2 implementa MPI2) Disponible para múltiples devices incluido globus2. LAM/MPI OpenMPI unión de varios proyectos (FT-MPI, LA-MPI, LAM/MPI, y PACX-MPI) . Más detalles en la charla de Sven Stork el martes. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
11
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Uso de MPI Se puede usar MPI para: Programas paralelos “portables”. Librerías paralelas. Programas con relaciones entre datos irregulares o dinámicas que no se ajusten a un modelo de paralelismo en los datos. Cuando no usar MPI: Si se puede usar HPF o un programa paralelo Fortran 90. Si se pueden usar librerías de más alto nivel (que pueden haber sido escritas usando MPI). Si no se necesita realmente el paralelismo Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
12
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
MPI tipos de datos Se definen los siguientes tipos de datos MPI: MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED Corresponde a los de C, pero se añaden el tipo byte, y el empaquetado, que permite enviar simultáneamente datos de distintos tipos. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
13
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
MPI Funciones básicas Funciones básicas: MPI_Init => Inicialización de MPI. MPI_Finalize => Termina MPI. MPI_Comm_size => Para averiguar el número de procesos. MPI_Comm_rank => Identifica el proceso. MPI_Send => Envía un mensaje. MPI_Recv => Recibe un mensaje. Referencia del estándar en Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
14
Ejemplo Básico: Hola Mundo
Escribir y Compilar el programa Hola Mundo usando MPICH. Ejecución en un cluster. Ejecución en el grid. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
15
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
MPICH MPICH es una implementación gratuita de MPI 1.2 Implementa parte del nuevo estándar MPI-2 MPICH 2 implementa MPI-2 Es una implementación muy “portable”: Supercomputadores de memoria distribuida Sistemas de memoria compartida Clusters Grid Esta se puede compilar para distintos “devices” de comunicación. Consideraremos dos: MPICH-P4 Device ch-p4 dirigido a redes de ordenadores. MPICH-G2 Es una implementación “grid” de MPICH mediante el device globus2 Completamente rediseñada desde la anterior versión MPICH-G Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
16
Escribiendo programas MPI
De las seis funciones básicas que mencionamos antes MPI_Init y MPI_Finalize son imprescindibles para que haya un programa MPI. Veamos un ejemplo trivial #include "mpi.h" #include <stdio.h> int main( int argc, char **argv ) { MPI_Init( &argc, &argv ); printf( "Hola Mundo\n" ); MPI_Finalize(); return 0; } Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
17
Programas MPI (compilación)
El programa anterior solo inicializa y termina el entorno MPI. Entre tanto cada proceso imprime un mensaje por pantalla. Para un programa pequeño como este podemos hacer una llamada directamente al comando de compilación: mpicc (para programas C) mpif77 (Fortran 77). mpif90 (Fortran 90) mpiCC (C++) Para aplicaciones más complicadas conviene usar un Makefile. En nuestro caso anterior (fichero hello.c): mpicc –o hello hello.c Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
18
Ejecución de un programa MPI con MPICH
El comando mpirun se usa para ejecutar los programas MPI en MPICH. (esto no es parte del estándar) mpirun admite diversas opciones. Destacaremos las siguientes: -np N: N indica el número de procesos que se quiere en la ejecución del programa. -p4pg pgfile: indica explícitamente las máquinas en las que se quiere correr y el path del programa y usuario que se usará en cada una de ellas. -machinesfile mfile: fichero de máquinas para correr en lugar del estándar (se usa en combinación con –np). Digamos que queremos correr nuestro programa en dos máquinas de la lista estándar: mpirun -np 2 hello Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
19
Ejemplo pgfile y machinefile
grid079 0 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid079 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid006 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid007 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid008 1 /grid/mpi/marco/Portal/NeuralNetwork/test-nn/ExampleApplication.exe mpi grid073.ifca.unican.es:2 grid074.ifca.unican.es:2 grid075.ifca.unican.es:2 grid076.ifca.unican.es:2 grid077.ifca.unican.es:2 grid078.ifca.unican.es:2 Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
20
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
MPICH-P4 en grid UI WN WN WN WN WN RB CE WN WN Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
21
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
MPICH-G2 en grid UI RB WN WN WN WN WN CE WN WN WN WN WN WN WN WN WN WN WN WN CE CE WN WN WN WN Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
22
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
JDL Para MPICH P4 Para MPICH G2 Executable = "hello"; JobType = "mpich"; NodeNumber = 8; VirtualOrganisation = "cg"; StdOutput = "std.out"; StdError = "std.err"; InputSandbox = {"hello"}; OutputSandbox = {"std.out","std.err"}; Executable = "hello.g2"; JobType = "mpich-g2"; NodeNumber = 2; VirtualOrganisation = "cg"; StdOutput = "std.out"; StdError = "std.err"; InputSandbox = {"hello.g2"}; OutputSandbox = {"std.out","std.err"}; Rank = other.GlueCEStateFreeCPUs; Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
23
Grupos y Comunicadores
Un grupo es un conjunto ordenado de procesos. Cada proceso de un grupo lleva asociado un identificador entero que se suele denominar “rank”. Un comunicador representa una colección de procesos que se pueden comunicar entre sí. Es un objeto con cierto número de atributos, asociado a algunas funciones para crearlos, usarlos y destruirlos. Especifica un dominio de comunicación que puede ser usado tanto en las comunicaciones punto-a-punto como en las colectivas (por los procesos que son parte de él). Evitan que exista comunicación no deseada entre determinados procesos. Contiene un grupo y un contexto Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
24
Delimitación del alcance de la comunicación
Grupos separados de subprocesos trabajando en diferentes subprogramas. Invocación paralela de librerías paralelas: Los mensajes propios de la aplicación deben mantenerse separados de los de la librería. MPI proporciona grupos de procesos Inicialmente el grupo “all”. Se proporcionan rutinas para la administración de los grupos. Todas las comunicaciones, no solo las colectivas, tienen lugar en grupos. Un grupo (group) y un contexto (context) se combinan en un comunicador (communicator). Fuente y destino en una operación send o receive se refieren al rank en el grupo asociado con un comunicador dado. Se puede usar MPI_ANY_SOURCE en una operación receive. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
25
MPI tipos de comunicación
La comunicación MPI entre procesos puede ser de dos tipos: Punto a punto: el proceso “origen” conoce el identificador del proceso “destino” y envía un mensaje dirigido solo a él. Se usan las funciones MPI_Send y MPI_Recv. Colectiva: Operaciones en las que participan todos los procesos de un operador. Ejemplo: “Broadcast”: El proceso origen manda el mensaje a todos los demas (que pertenezcan al mismo comunicador). Esto es típico de un esquema “master-slave”. Se usa la función MPI_Bcast. Las funciones MPI de recepción de datos son por lo general “bloqueantes”, es decir, un proceso que debe recibir un mensaje espera hasta que de hecho lo ha recibido completo. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
26
Obteniendo información de MPI
Usaremos ahora dos más de las seis funciones básicas: MPI_Comm_size y MPI_Comm_rank. Así averiguaremos desde el programa el número de procesos que participan y la identificación de cada uno. int main( argc, argv ) { int rank, size; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); printf( “Hola Mundo! Soy el proceso %d de %d\n", rank, size ); MPI_Finalize(); return 0; } Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
27
Funciones de comunicación MPI
A continuación veremos un poco más en detalle las funciones básicas de envío y recepción de mensajes punto a punto y broadcast. MPI_Send MPI_Recv MPI_Bcast MPI_Reduce Imagen del Tutorial de Gropp Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
28
Sintaxis de MPI_Send y MPI_Recv
La operación básica de envío (bloqueante) es: MPI_Send( start, count, datatype, dest, tag, comm ) start: puntero a los datos a enviar count: número de elementos a enviar datatype: tipo de dato dest: Identificación del proceso destino tag: etiqueta de la comunicación comm: Identificación del comunicador La operación básica de recepción correspondiente: MPI_Recv(start, count, datatype, source, tag, comm, status) start: puntero para la recepción de los datos count: número de elementos datatype: tipo de dato source: Identificación del proceso origen tag: etiqueta de la comunicación comm: Identificación del comunicador status: puntero para acceso a información sobre mensaje Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
29
Ejemplo MPI_Send/MPI_Recv
char msg[100]; if(my_rank==0) { sprintf(msg,"\n\n\t Esto es un mensaje del proceso %d al proceso %d",source,dest); MPI_Send(msg,100,MPI_CHAR,dest,TAG,MPI_COMM_WORLD); printf("\n Mensaje enviado a %d",dest); } else if(my_rank==1) { MPI_Recv(msg,100,MPI_CHAR,source,TAG,MPI_COMM_WORLD,&status); printf("\n Mensaje recibido en %d",dest); printf(msg); Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
30
Adquiriendo información sobre un mensaje
MPI_TAG y MPI_SOURCE son usados principalmente cuando hay MPI_ANY_TAG y/o MPI_ANY_SOURCE en la llamada MPI_Recv. MPI_Get_count se usa para determinar la cantidad de datos de un tipo dado que se han recibido. MPI_Status status; MPI_Recv( ..., &status ); ... status.MPI_TAG; ... status.MPI_SOURCE; MPI_Get_count( &status, datatype, &count ); Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
31
Operaciones colectivas
Comunicación colectiva: envío de un mensaje de uno a muchos. Se hace con MPI_Bcast (Broadcast) Típicamente un master envía los mismos datos a sus esclavos. Por ejemplo, en la paralelización del entrenamiento de una red neuronal enviamos a todos los esclavos los nuevos pesos al final de cada época de entrenamiento. Operaciones colectivas: se realiza una operación matemática distribuida y se devuelve el resultado al root de la operación También es típico en un esquema master-slave. En la neura se utiliza por ejemplo en la suma de los errores de todos los esclavos. Operaciones definidas: Aritméticas: suma, multiplicación… Lógicas: AND, OR… Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
32
Operaciones colectivas
Imagen del Tutorial de Gropp Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
33
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Reduce MPI_MAX maximum integer, float integer, real, complex MPI_MIN minimum integer, float integer, real, complex MPI_SUM sum integer, float integer, real, complex MPI_PROD product integer, float integer, real, complex MPI_LAND logical AND integer logical MPI_BAND bit-wise AND integer, MPI_BYTE integer, MPI_BYTE MPI_LOR logical OR integer logical MPI_BOR bit-wise OR integer, MPI_BYTE integer, MPI_BYTE MPI_LXOR logical XOR integer logical MPI_BXOR bit-wise XOR integer, MPI_BYTE integer, MPI_BYTE MPI_MAXLOC max value and location float, double and long double real, complex,double precision MPI_MINLOC min value and location float, double and long double real, complex, double precision Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
34
Sintaxis de Broadcast y Reduce
MPI_Bcast(start, count, datatype, root, comm) start: puntero a los datos a enviar count: número de elementos a enviar datatype: tipo de dato root: identificación del proceso origen comm: Identificación del comunicador Reduce: MPI_Reduce(start, result, count, datatype, operation, root, comm) start: puntero a los datos a enviar result: puntero para almacenar el resultado count: número de elementos a enviar datatype: tipo de dato operation: identificación de la operación colectiva root: identificación del proceso origen comm: Identificación del comunicador Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
35
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Reduce Operaciones predefinidas para MPI_Reduce: MPI_MAX máximo MPI_MIN mínimo MPI_SUM suma MPI_PROD producto MPI_LAND “and” lógico MPI_LOR “or” lógico MPI_LXOR “xor” lógico MPI_BAND “bitwise and” MPI_BOR “bitwise or” MPI_BXOR “bitwise xor” MPI_MAXLOC máximo e índice del máximo MPI_MINLOC mínimo e índice del mínimo Además existe un mecanismo para que el usuario cree sus propias funciones para el “Reduce”. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
36
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Ejemplo BroadCast Char msg[100]; if(my_rank==source) { sprintf(msg,"\n Esto es un mensaje del proceso %d a todos los demás",sourc e); MPI_Bcast(msg,100,MPI_CHAR,source,MPI_COMM_WORLD); printf("\n Mensaje enviado a todos desde %d",source); } else printf("\n Mensaje recibido en %d desde %d",my_rank,source); printf(msg); Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
37
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Ejemplo Reduce int value; int result; value = my_rank; MPI_Reduce(&value,&result,1,MPI_INT,MPI_SUM,source,MPI_COMM_WORLD); if(my_rank==source) { printf("\n Resultado de la suma colectiva %d", result); } Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
38
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Topologías Una topología es una estructura virtual de procesos MPI. Sirve para contestar a la pregunta ¿Quiénes son mis vecinos? Asocia un esquema de direccionamiento a los procesos de un comunicador. Una topología típica es la cartesiana que consiste en un malla en la que los procesos se identifican mediante dos subíndices. Otro tipo es la topología en grafo que es más genérica. Imagen del Tutorial de Gropp Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
39
Otras características. Extensiones MPI-2
Parallel I/O. Varios procesos de un programa paralelo acceden a datos (lectura o escritura) de un fichero común. Alto rendimiento. DPM (Dynamic Process Management): Permite a un job MPI crear nuevos procesos en tiempo de ejecución y comunicarse con ellos. One sided operations. Remote Memory Access. Puede proporcionar mayor rendimiento sobre todo en redes que soportan nativamente este tipo de comunicaciones (InfiniBand y Myrinet). Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
40
MPICH-G2 MPI sobre globus2
MPICH-G2 es una implementación “grid enabled” del estándar MPI 1.2 Por medio del llamado globus2 device usa los servicios del Globus Toolkit 2 para ejecutar de forma distribuida (en máquinas heterogéneas) aplicaciones paralelas programadas usando MPI. La librería de comunicaciones Nexus de globus define una interfaz de comunicación de bajo nivel que utilizada para dar soporte a un amplio rango de lenguajes y librerías de nivel superior. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
41
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Usando MPICH-G2 Requisitos: Certificado de usuario. En cada máquina en que se quiera correr usando mpirun Hay que tener cuenta Debe estar instalado globus y MPICH-G2 Globus gatekeeper Compilación con mpicc, mpif77, etc. Ejecutar la aplicación usando mpirun: Bajo el globus2 device esto genera un RSL Se envía a las máquinas del grid Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
42
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Bibliografía MPI Pacheco, P.S. Parallel Programming with MPI. Morgan Kaufmann Publishers, 1997. Snir, M. et al. MPI - The Complete Reference. Volume 1, The MPI Core. The MIT Press, 1998. Gropp, W., Lusk, E. y Skjellum, A. Using MPI, Portable Parallel Programming with the Message-Passing Interface. The MIT Press, 1994. Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
43
Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Más sobre MPI Charla de Sven Stork el martes sobre OpenMPI. Tutorial en HLRS: On-line: ¿Tutorial especial para Int.Eu.Grid? Otros recursos en el Web: MPI Forum: MPI en Argonne: MPICH 1: MPICH 2 OpenMPI: LAM/MPI: PACX MPI: Curso de Postgrado CSIC Grids & e-Ciencia Santander Junio 2006
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.