Lenguajes Modernos en Computación de Altas Prestaciones
|
|
- Felipe Hidalgo López
- hace 8 años
- Vistas:
Transcripción
1 ESCUELA UNIVERSIDAD DE LA LAGUNA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA PROYECTO FINAL DE CARRERA Lenguajes Modernos en Computación de Altas Prestaciones Rafael Rodríguez Martín LA LAGUNA, a 13 de octubre de 2008
2
3 Preliminares D. Francisco de Sande González, profesor de la Escuela Técnica Superior de Ingeniería Informática, adscrito al Departamento de E. I. O. y Computación Certifica Que la presente memoria titulada Lenguajes Modernos en Computación de Altas Prestaciones Ha sido realizada bajo su dirección por D. Rafael Rodríguez Martín, y constituye su Proyecto para optar al grado de Ingeniero en Informática por la Universidad de La Laguna. Y para que así conste, en cumplimiento de la legislación vigente y a los efectos que haya lugar, firman la presente en La Laguna a 13 de octubre de Fdo: Francisco de Sande González
4
5 A mis padres
6
7 Agradecimientos Quiero dar las gracias en primer lugar a mi familia, motivo principal para estar donde estoy. También a mis amigos, a esos que, a pesar de que pasen los años, se pueden seguir considerando parte fundamental de mi vida. Agradezco también a Francisco de Sande la paciencia, el tesón y el empuje con los que me ha ayudado a superar el reto con más obstáculos que me he encontrado hasta el día de hoy: mil gracias por la confianza y el tiempo dedicado. Por último, quiero hacer una mención especial a la vital labor que desarrollan tanto Ruymán Reyes como Carlos Segura, así como de Antonio Dorta (padre de llcomp), sin cuyo trabajo y ayuda este proyecto seguiría aún entre bambalinas.
8
9 Índice general Prólogo 5 1. Estado del arte en lenguajes de programación paralela OpenMP MPI UPC: Unified Parallel C X Chapel Fortress Otros Cluster OpenMP Cilk Cilk OpenMPD OpenWP Otros sistemas SDSM El problema de la falsa compartición SDSMs basados en páginas SDSMs basados en objetos SDSMs basados en t-uplas o variables llc El modelo de computación OTOSP Introducción a llc a través de un ejemplo Paralelismo de datos en llc Pipelines en llc
10 2 ÍNDICE GENERAL 2.5. Colas de tareas en llc Comparativa con el constructo task de OpenMP Intel Threading Building Blocks (TBB) Contenidos de la librería Sistemas multi-core Algunas herramientas para la programación de sistemas multicore POSIX threads (Pthreads) QtConcurrent Implementación de algoritmos TBB parallel for parallel reduce parallel scan parallel while y parallel do pipeline parallel sort Ejemplos Cálculo de π Quicksort Molecular Dynamics Algoritmos y resultados computacionales Plataformas utilizadas en los experimentos SGI Origin Bull Novascale Server Cluster ULL Intel Quad-Core Algoritmo del conjunto de Mandelbrot Cálculo de π Molecular Dynamics El problema de asignación de un único recurso QuickSort
11 ÍNDICE GENERAL 3 5. Conclusiones y trabajos futuros Conclusiones Trabajos futuros Bibliografía 106 Índice de figuras 116 Índice de tablas 119 Índice de listados 120
12 4 Prólogo
13 Prólogo Bienvenidos al más esperado avance de los procesadores desde que cruzamos la barrera del Gigaherzio! Debido a problemas de disipación de calor, los procesadores ya no pueden ofrecer mejoras sustanciales en su velocidad de reloj. Esto ha provocado una estabilización de su rendimiento durante muchos meses. Finalmente, Intel ha dado un paso adelante con su nuevo concepto para incrementar los niveles de rendimiento, integrando dos o más núcleos en un solo chip. Con este desarrollo, quedan de nuevo a nuestro alcance mejoras significativas de rendimiento. Como muchos ya sabéis de las máquinas con dos procesadores, la mera presencia de dos CPUs no duplica el rendimiento automáticamente. Tras disponer en un sistema los componentes adecuados, el sistema operativo necesita distribuir las tareas entre todos los recursos de los procesadores disponibles. Para aprovechar las múltiples CPUs, el software moderno necesita un diseño que permita utilizar múltiples hilos de ejecución, que encapsulen fragmentos del programa que puedan ejecutarse independientemente. Así presentaba el portal web Tom s Hardware [83] el lanzamiento del Pentium D en abril de Con el desarrollo del primer procesador de doble núcleo orientado a equipo de escritorio, Intel destapó la caja de Pandora. Se abrían nuevos objetivos: ya no bastaba con tener una aplicación MPI que predijera el clima dos horas antes o un programa OpenMP que calculara una secuencia de ADN de la manera más eficiente. La nueva masa de clientes necesita que su procesador de textos cargue los documentos el doble de rápido, que su navegador web no se quede congelado y poder reproducir películas en alta definición a pantalla completa.
14 6 Prólogo El primer paso para que todas estas aspiraciones se cumplan consistía en que los programadores cambiaran radicalmente su forma de pensar. Tras décadas en un mundo donde los sistemas tenían normalmente un procesador, el panorama había mutado completamente. Cuando un programador se habitúa a pensar en términos de descomposición de problemas, escalabilidad, hilos, concurrencia y toda la problemática asociada, le llegará el momento de pensar qué herramienta debe utilizar para resolver un problema concreto. Las herramientas maduras que provienen del mundo de la supercomputación (MPI, OpenMP, etc.) tienen ahora en el terreno de los SMP nuevos adversarios, diseñados teniendo en cuenta desde el principio los sistemas multi-core: TBB, QtConcurrent, X10, Fortress, Chapel, etc. En otro ámbito, la supercomputación sigue en auge, y la carrera por entrar en la lista Top500 tiene cada vez más contendientes, que ya no proceden solo de Estados Unidos, Europa y Japón, sino también de las potencias emergentes: India, Taiwan, Rusia, etc. En este contexto observamos, además, otro frente abierto: la investigación para desarrollar herramientas con el nivel de abstracción suficiente para permitir a los expertos en las diferentes ramas de la ciencia resolver problemas sin necesidad de tener conocimientos avanzados de informática o programación. La explosión de los sistemas multi-core requiere más que nunca el establecimiento de un estándar que soporte un modelo de computación híbrido, que aproveche tanto las capacidades de las máquinas SMP como las bondades de los clusters en cuanto a coste y facilidad de diseño. Mientras se anuncia la llegada de sistemas con decenas y cientos de núcleos en los próximos años, no hay acuerdo aún en el modelo que debemos seguir para la Computación de Altas Prestaciones de nueva generación. Este Proyecto de Final de Carrera ha tenido como objetivo realizar un análisis de la situación de los lenguajes de Computación de Altas Prestaciones, repasando desde los modelos ya establecidos como estándares de facto hasta las últimas innovaciones aportadas tanto por las comunidades académica y científica como por intereses del sector privado. Las principales aportaciones que incorpora este Proyecto son el estudio de los nuevos mecanismos que intentan explotar la próxima ubicuidad de los sistemas multi-core y la revisión del estado del arte de lenguajes para supercomputación, intentando averiguar cuán convergentes son ambas líneas
15 Prólogo 7 de investigación. Para ello hemos tenido que desarrollar algunos códigos de los cuales no disponíamos, especialmente en sus versiones TBB, y establecer comparativas de rendimiento en diferentes sistemas, que incluyen tanto superordenadores como equipos de usuario. La memoria está estructurada en cinco capítulos. En el primero, revisamos el estado del arte de los lenguajes de programación paralela. En nuestro estudio, hemos considerado tanto modelos ya establecidos y con gran cuota de mercado, hasta nuevos proyectos considerados aún en fase de experimentación. En esta tormenta de ideas participa la Universidad de La Laguna con su lenguaje llc, que propone un modelo para llevar las bondades de OpenMP al mundo de la memoria distribuida. En el segundo capítulo hacemos una introducción de sus principales características, ilustrando los conceptos más avanzados con códigos a modo de ejemplo. El tercer capítulo está dedicado a TBB, la apuesta de futuro de Intel para sistemas multi-core. Se presentan las bases para desarrollar algoritmos con esta librería, pensada para que la curva de aprendizaje de un desarrollador procedente del mundo de la programación secuencial tenga la menor pendiente posible. En el cuarto capítulo mostramos las implementaciones de varios algoritmos clásicos en paralelismo en diferentes lenguajes, realizando comparaciones de rendimiento en diversos sistemas que abarcan tanto supercomputadoras destinadas al cálculo como equipos de los que cualquier usuario puede disponer hoy en día. Por último, en el quinto capítulo se presentan brevemente conclusiones y líneas de investigación interesantes en el futuro a corto y medio plazo.
16 Capítulo 1 Estado del arte en lenguajes de programación paralela Como se describe en [30], los modelos de programación paralelos pueden clasificarse en fragmentados y no fragmentados. En los modelos de programación fragmentados, los algoritmos deben expresarse tarea a tarea, descomponiendo las estructuras de datos y el flujo de control en conjuntos. El ejemplo claro de este modelo es MPI, en el que se debe tener en cuenta en todo momento el número de procesadores que ejecutarán el algoritmo para dividir los datos consecuentemente e implementar las comunicaciones entre procesadores de forma explícita. Por otro lado, en los modelos no fragmentados, los algoritmos se desarrollan de forma global, asumiendo que un único procesador ejecuta todo el código salvo en aquellas secciones para las que se explicita ejecución paralela. OpenMP es el lenguaje más ampliamente utilizado basado en este modelo, introduciendo el paralelismo en constructos concretos mediante directivas como for o sections. A continuación, se recogen los lenguajes de programación paralela actuales que, por su amplitud de uso o por mostrar características prometedoras para las líneas de investigación futuras, hemos considerado los más relevantes.
17 2 Estado del arte en lenguajes de programación paralela 1.1. OpenMP OpenMP es un lenguaje basado en directivas de compilador, funciones de librería y variables de entorno empleado para especificar paralelismo (en entornos de memoria compartida) en C, C++ y Fortran. Es el fruto del desarrollo conjunto de varios fabricantes, entre los que se incluyen Intel, HP, IBM, Cray o Sun Microsystems. OpenMP es diferente de la mayoría de lenguajes paralelos utilizados en la práctica, puesto que es uno de los pocos clasificado dentro del modelo de los no fragmentados [30], al igual que Chapel (ver Apartado 1.5) y TBB (ver Capítulo 3). La manera típica de desarrollar aplicaciones con OpenMP es anotar secciones de paralelismo dentro de un código secuencial, principalmente bucles de código que podrían realizarse en paralelo (es decir, con iteraciones independientes entre sí). Esto deriva en ventajas a la hora de desarrollar el código, puesto que, si se descartan las directivas añadidas, el código secuencial conserva su forma original. Los compiladores de OpenMP y los entornos de ejecución implementan paralelismo utilizando conjuntos de hilos de ejecución. Los programas desarrollados bajo este modelo (denominado modelo fork-join) comienzan con un único hilo de ejecución (hilo maestro o master thread), y cuando se encuentra una directiva parallel, la ejecución se divide para que la región paralela sea ejecutada por un equipo de hilos. Cuando esta región termina, los hilos se unen de nuevo y el hilo maestro continúa la ejecución (ver Figura 1.1). OpenMP se puede también utilizar de forma fragmentada, puesto que dispone de llamadas a funciones de librería para identificar hilos, conocer cual es el número máximo de hilos disponibles, etc. Sin embargo, se utiliza más frecuentemente bajo el modelo no fragmentado, identificando las oportunidades de paralelismo y dejando las operaciones de bajo nivel al compilador y las librerías de ejecución. Esta habilidad de inyectar paralelismo incrementalmente en un programa secuencial se considera la mayor ventaja de OpenMP, puesto que redunda en una ganancia de productividad importante para los programadores. Si bien el estándar OpenMP soporta paralelismo anidado, la mayoría de
18 1.1 OpenMP 3 Figura 1.1: Modelo fork-join
19 4 Estado del arte en lenguajes de programación paralela implementaciones sólo manejan un nivel de paralelismo. Además, salvo casos concretos (como la implementación realizada por Intel en su compilador ICC[90]), OpenMP no estaba, hasta su especificación 2.5, preparado para implementar paralelismo orientado a tareas, aunque siempre había existido interés por investigar este campo [85, 87]. La situación cambiará cuando las implementaciones adopten masivamente el estándar 3.0, aprobado en su versión final en mayo de 2008 [1]. La nueva especificación aporta, además de otras novedades, mejoras en el soporte para paralelismo anidado y nuevas herramientas en el control de la planificación de los bucles. La mayor desventaja de OpenMP es su dependencia de máquinas de memoria compartida, que por lo general no escalan para un número grande de procesadores. Por este motivo, OpenMP suele emplearse en porciones de memoria compartida de una máquina mayor de memoria distribuida. Puede implementar, por ejemplo, paralelismo a nivel de hilo en un nodo de memoria compartida que forme parte de un cluster mayor, comunicado mediante MPI. 1 #pragma omp parallel private(i, local) 2 { 3 #pragma omp single 4 pi_omp = 0.0; 5 #pragma omp for reduction (+: pi_omp) 6 for (i = 0; i < N; i++) { 7 local = (i + 0.5)*w; 8 pi_omp = pi_omp + 4.0/(1.0 + local*local); 9 } 10 } 11 pi_omp *= w; Listado 1.1: Algoritmo de cálculo de π con OpenMP En el Listado 1.1 se muestra el bucle principal de un algoritmo de cálculo de π en OpenMP, analizado en profundidad en 2.2. El código se anota con #pragma omp parallel (línea 1) para que el bucle anotado con #pragma omp for (línea 5) sea paralelizado por el compilador y la librería, y se destaca que i y local serán variables privadas de cada hilo (línea 1), mientras que pi omp será compartida (como lo son por defecto todas aquellas cuyo ámbito no se especifica en el pragma).
20 1.2 MPI 5 La inicialización de la variable pi omp la realiza un único hilo (#pragma omp single en la línea 3) y el resto del bucle lo ejecutan todos los hilos. Tras la finalización del bucle, se suman los valores de pi omp y se actualiza la variable fuera del bucle paralelo (reduction (+: pi omp) en la línea 5) MPI MPI (Message Passing Interface) [62] es posiblemente la herramienta de programación más empleada en supercomputación. Se basa en el modelo fragmentado, en el que varias instancias del programa se ejecutan simultáneamente, comunicándose entre ellas mediante llamadas a la librería MPI. Estas rutinas soportan varios paradigmas de comunicación, incluyendo comunicación bidireccional, comunicación uno a muchos (broadcast), reducciones, y comunicaciones todos a todos (all-to-all). MPI-2 es una extensión del estándar original que introduce creación dinámica de tareas, permitiendo la creación de hilos en cualquier punto del programa en lugar de sólo en el inicio de la ejecución. Si bien MPI-1 carece de manejo de memoria compartida, MPI-2 introduce de forma limitada soporte para estas arquitecturas. Además, MPI-2 es capaz de ejecutar las aplicaciones desarrolladas bajo MPI-1, aunque algunas funciones han sido marcadas como obsoletas. Si bien la adopción de MPI-1 ha sido prácticamente universal en el mundo de la supercomputación, la aceptación de MPI-2 ha sido más limitada. Entre las razones, se suelen citar [2]: Si bien MPI-1 se apoya en paso de mensajes y un entorno de ejecución minimalista y estático, las implementaciones completas de MPI-2 incluyen funciones de entrada y salida y gestión dinámica de procesos, por lo que el tamaño del entorno crece considerablemente. Además, la mayoría de sistemas de planificación de trabajos no pueden soportar gestión dinámica de procesos. La mayoría de aplicaciones desarrolladas para MPI-1 tienen un buen rendimiento con MPI-2, por lo que muchos programadores prefieren no correr el riesgo de perder portabilidad adoptando MPI-2. MPI ha tenido un gran éxito en la comunidad científica debido a que es un
21 6 Estado del arte en lenguajes de programación paralela estándar bien definido, con implementaciones de libre distribución y un alto grado de portabilidad y rendimiento entre diferentes arquitecturas. Como resultado, MPI se ha convertido en el estándar de facto para la programación en paralelo. La interfaz de MPI soporta C y Fortran, y MPI-2 añade C++ a ese conjunto. Además, han aparecido implementaciones libres para Python, Java, OCaml,.NET, etc. [2] La mayoría de críticas que recibe de la comunidad se deben a la complejidad que acarrea su limitada abstracción, requiriendo al programador emplear mucho tiempo en funciones de bajo nivel. En el Listado 1.2 se muestra el código MPI que implementa el mismo algoritmo de cálculo de π que el Listado pi_mpi = 0.0; 2 for(i = MPI_NAME; i < N; i += MPI_NUMPROCESSORS) { 3 local = (i + 0.5) * w; 4 pi_mpi += 4.0/(1.0 + local*local); 5 } 6 MPI_Allreduce(&pi_mpi, &gpi_mpi, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); Listado 1.2: Algoritmo de cálculo de π con MPI Para dividir el trabajo entre los procesadores, cada uno realiza el cálculo de las iteraciones mi identificador + número de procesadores. Para ello, utilizamos en la línea 2 las variables MPI NAME (que contiene el identificador correspondiente al procesador actual) y MPI NUMPROCESSORS, que corresponde al número total de procesadores que maneja el entorno de ejecución. Así, para 32 procesadores, el procesador 0 realizaría las iteraciones 0, 32, 64, etc. Al final, MPI Allreduce (línea 6) suma los valores obtenidos por cada uno de los procesadores individuales.
22 1.3 UPC: Unified Parallel C UPC: Unified Parallel C Unified Parallel C (UPC)[34, 43] pertenece a un grupo de lenguajes de programación paralelos conocidos como lenguajes de espacio de direcciones global particionado (Partitioned Global Address Space, PGAS). Estos lenguajes están basados en un modelo de memoria en el cual un espacio de direcciones global se particiona de manera que una porción del mismo se asigna a cada procesador, y se implementan típicamente en máquinas de memoria distribuida. Precisamente, la mayor limitación de UPC que los arrays compartidos, al estar basados en C, heredan muchos de sus problemas. Los lenguajes PGAS [94] suponen una mejora a las librerías de paso de mensajes en cuanto que proveen abstracciones para crear estructuras de datos distribuidas y proveer comunicación entre diferentes instancias de un programa. Además, al estar cada parte del espacio de direcciones asignado físicamente a un procesador, se puede optimizar la localidad de los datos. En este contexto, UPC es una extensión del lenguaje ANSI C, que presenta al programador un espacio de direcciones único, compartido y particionado, en el que las variables se pueden leer y escribir por cualquier hilo de ejecución, aunque físicamente cada variable tiene asociado un único procesador. UPC también soporta una visión de control más cercana al modelo no fragmentado, introduciendo una nueva estructura de bucle: upc forall. En ella, las iteraciones globales de un bucle for típico de C se asignan a los diferentes hilos de ejecución mediante una expresión de afinidad. Si bien el soporte para crear un espacio de iteraciones global puede resultar útil, puede también derivar en un contraste en el modelo de programación. UPC utiliza el modelo SPMD (Single Program Multiple Data), en el que el nivel de paralelismo está fijado cuando se arranca el programa, típicamente con un único hilo de ejecución por procesador. Sin embargo, este modelo se rompe cuando llegamos a un bucle upc forall. La característica diferencial de este lenguaje es la posibilidad de disponer de punteros al espacio de direcciones compartido. Los punteros se pueden declarar privados (locales a un hilo de ejecución) o compartidos, y pueden además apuntar a datos que también pueden ser privados o compartidos. Esta abstracción para la programación con espacio de
23 8 Estado del arte en lenguajes de programación paralela direcciones compartidos provee una noción de afinidad, puesto que la diferenciación privado/compartido de un símbolo es parte del sistema, y visible tanto para el programador como para el compilador. En el Listado 1.3 se muestra un extracto de una implementación del algoritmo clásico de cálculo de π. En este ejemplo, los hilos llaman colectivamente a la función upc all lock alloc() (línea 5) para crear el bloqueo l. Cada hilo realiza una suma parcial en su variable privada local pi, tras lo que se realiza una reducción en la línea 11, estableciendo un bloqueo en la variable l inicializada anteriormente para evitar condiciones de carrera en la variable pi. Por último, en la línea 13 se ejecuta una barrera para sincronizar los diferentes hilos. 1 void main ( void ) 2 { 3 float local_pi = 0.0 ; 4 int i ; 5 l = upc_all_lock_alloc(); 6 upc_forall (i=0;i<n ; i++; i) 7 local_pi += (float) f ((. 5 + i) / (N)) ; 8 local_pi *= (float) (4.0 / N) ; 9 10 upc_lock(l) ; 11 pi += local_pi ; 12 upc_unlock(l) ; 13 upc_barrier; 14 if (MYTHREAD==0) printf ( "PI= %f\n", pi ) ; 15 if (MYTHREAD==0) upc_lock_free ( l ) ; 16 } Listado 1.3: Código de ejemplo de UPC 1.4. X10 El lenguaje X10 [93] está siendo desarrollado por IBM, en colaboración con algunas alianzas del ámbito académico. El objetivo es crear un nuevo modelo de programación que aumente la productividad de la programación paralela mediante una reducción de la curva de aprendizaje. Para ello, el nuevo
24 1.4 X10 9 lenguaje es muy similar a Java, e intenta adoptar los conceptos habituales en los lenguajes de programación paralela: Paralelismo de datos Paralelismo de control Paso de mensajes Productor-consumidor Además, para intentar abarcar el mayor número de máquinas objetivo, intenta que las implementaciones algorítmicas sean independientes de las arquitecturas, para poder así llegar al caso general de clusters compuestos de varios nodos SMP con jerarquías de memoria no uniformes interconectados mediante tecnologías heterogéneas. 1 do { 2 now(c) { 3 ateach (n: nodes) { //Cluster-level parallelism 4 foreach (s: Sweeps) { // SMP parallelism 5 // receive inputs 6 flows = new Flux[R](k) { // SMT parallelism 7 async (...) inputs[s][k].receive(); 8 } 9 // Choice of using clock or force to synchronize 10 // on flows 11 // Thread-local with vector & co-processor 12 // parallelism 13 flux = compute(s, flows); 14 // send outputs } // foreach 17 } // ateach 18 } // now 19 // use clock c to wait for al sweeps to complete 20 next c; } while (err > MAX_ERROR); Listado 1.4: Código de ejemplo de X10
25 10 Estado del arte en lenguajes de programación paralela Dichas jerarquías de paralelismo se intentan aprovechar, como se muestra en el Listado 1.4, extraído de [82], que representa parte de un código que resuelve el problema del transporte mallado no estructurado (UMT: Unstructured Mesh Transport) [32]. En el mismo, se observa que en el bucle más interno se aprovecha el paralelismo a nivel de multi-hilo (línea 6); en el bucle que lo envuelve, paralelismo a nivel SMP (línea 4); y en el bucle más externo, paralelismo a nivel de cluster (línea 3). Existe un compilador de IBM basado en la especificación 0.41, y un compilador libre basado en lo que se cree tendrá la especificación 0.5 (sobrecarga de operadores, tipos genéricos, etc.). Se denomina XTC-X10 y está disponible para descarga en [17] Chapel Chapel (Cascade High Productivity Language) [51, 30] es un lenguaje de programación paralela impulsado por Cray Inc. como parte del proyecto Cray Cascade. El objetivo del proyecto es aumentar la abstracción de los lenguajes actuales y mejorar la separación entre la expresión de los algoritmos y los detalles de implementación de las estructuras de datos. Chapel es un lenguaje no fragmentado cuya sintaxis se diferencia de otros lenguajes paralelos basados en C o Fortran, si bien no carece de similitudes con ellos. Soporta un modelo de programación paralela de alto nivel mediante abstracciones que soportan paralelismo de datos, de tareas y paralelismo anidado. Permite optimizaciones para la localidad de datos y cálculos en el programa, mediante abstracciones para la distribución de los datos y reparto de cálculos según la misma. Además, dispone de características de programación orientada a objetos para permitir la reutilización de código. Una de las nuevas abstracciones que aporta es el concepto de locale. Una locale es una unidad de una arquitectura paralela, capaz de ejecutar código y tener acceso a la memoria de la máquina. En un cluster, por ejemplo, cada nodo y su memoria local asociada sería considerado una locale. El diseño se basa en un modelo de ejecución multi-hilo en el que no se ofrecen al programador funciones de bajo nivel para manejo de hilos, sino que éste emplea abstracciones de alto nivel para que el compilador y el entorno de
26 1.5 Chapel 11 ejecución sean quienes realizan las tareas de bajo nivel mediante un conjunto de hilos anónimos. Para el paralelismo de datos, Chapel introduce el concepto de dominio, que consiste en un conjunto de índices utilizados para definir el tamaño y la forma de un vector y para soportar iteración en paralelo. Existen diferentes tipos de dominio según el tipo de datos empleado para el indexado. Esto proporciona una gran flexibilidad, pudiendo por ejemplo crearse una tabla hash fácilmente (teniendo un dominio indexado mediante cadenas). Sobre estos tipos dominio (o también arrays u otras expresiones) se puede iterar mediante bucles forall. De esta forma se pueden recorrer total o parcialmente las diferentes estructuras de datos de forma paralela. Chapel soporta también paralelismo de tareas (sentencia cobegin) y paralelismo anidado. Si bien Chapel toma conceptos de muchos lenguajes anteriores, está más claramente basado en High-Performance Fortran (HPF) [44], ZPL [31] y las extensiones MTA de Cray para Fortran y C [26]. Aunque los planes apuntan a una liberación de Chapel cuando alcance una madurez adecuada, actualmente no es posible su descarga para realizar pruebas. 1 def main ( } { 2 const ProblemSpace = [ 1..n,1..n],BigDomain = [ 0..n+1,0..n+1]; 3 var X,XNew : [BigDomain] real = 0.0; 4 X[n+1, 1..n] = 1.0 ; 5 var iteration = 0, delta : real; 6 const north = (-1,0), south = (1,0), 7 east = (0,1), west = (0,-1); 8 do { 9 forall ij in ProblemSpace do 10 XNew (ij) = (X(ij+north) + X(ij+south) + 11 X(ij+east) + X(ij+west)) / 4.0; 12 delta = max reduce abs(xnew[problem5pace] -X[Problem5pace]); 13 X[ProblemSpace] = XNew[ProblemSpace]; 14 iteration += 1 ; 15 } while ( delta > epsilon ); 16 } Listado 1.5: Algoritmo de Jacobi implementado con Chapel
27 12 Estado del arte en lenguajes de programación paralela El Listado 1.5 muestra parte de una implementación del algoritmo de Jacobi realizada en Chapel. El tamaño de la cuadrícula para los cálculos se define usando dos dominios (línea 2), y el espacio del problema se declara a través de estos dominios. Las direcciones en la cuadrícula se representan usando t-uplas de dos valores (líneas 6 y 7), que se añaden a cualquier coordenada de la cuadrícula (líneas 10 y 11) para indicar los puntos correctos que rodean la coordenada actual. En la línea 9 se muestra el bucle paralelo forall, que realiza los principales cálculos para todas las coordenadas i,j dentro del espacio del problema de forma concurrente. Finalmente, se realiza una operación de reducción (línea 12) para calcular la diferencia entre el espacio anterior del problema y el nuevo Fortress Fortress [63, 23] es la apuesta de Sun Microsystems para el proyecto de investigación HPCS [36] de DARPA, en los que también están incluidos X10 y Chapel. La mayor diferencia respecto a estos dos reside en que Fortress, a pesar de que toma conceptos de lenguajes ya existentes, ha desarrollado una sintaxis novedosa que no se parece a ningún lenguaje actual en concreto, como se comprobará en el análisis del Listado 1.6. El motivo de esta ruptura con los lenguajes actuales es el intento explorar nuevas maneras de mejorar la programabilidad de los lenguajes, por lo que se ha diseñado Fortress partiendo de cero. De esta forma, se ha podido dotar al lenguaje de soporte para transacciones, localidad de datos y computación paralela implícita. La sintaxis y el sistema de tipado se han creado teniendo en cuenta el uso científico que se les iba a dar, por lo que contemplan notación matemática, chequeo de tipos de matrices multidimensionales, etc. El lenguaje está pensado para crear programas modulares de forma natural. El propio lenguaje sigue esta máxima, estando preparado para implementar nuevas características en un futuro de forma transparente. De hecho, la mayor parte del propio Fortress está implementado en librerías que se ejecutan sobre un pequeño núcleo subyacente.
28 1.6 Fortress 13 Los bloques básicos de Fortress son objetos (objects) y traits. Los objetos definen campos y métodos, mientras que los traits declaran conjuntos de métodos. Los traits pueden declarar métodos abstractos (es decir, únicamente para cabeceras) o concretos (cabeceras y definiciones). 1 component buffons 2 3 export Executable 4 5 run(args:string...):()=do 6 needlelength = 20 7 numrows = 10 8 tableheight = needlelength numrows 9 var hits : RR64 := var n : RR64 := println("starting parallel Buffons") 13 recordtime(6.0) 14 for i <- 1#3000 do 15 delta_x = random(2.0) delta_y = random(2.0) rsq = delta_x^2 + delta_y^2 18 if 0 < rsq < 1 then 19 y1 = tableheight random(1.0) 20 y2 = y1 + needlelength (delta_y / SQRT rsq) 21 (y_l, y_h) = (y1 MIN y2, y1 MAX y2) 22 if ceiling(y_l/needlelength) = floor(y_h/needlelength) then 23 atomic do hits += 1.0 end 24 end 25 atomic do n += 1.0 end 26 end 27 end 28 probability = hits/n 29 pi_est = 2.0/probability 30 printtime(6.0) 31 println("") 32 print("estimated Pi = ") 33 println(pi_est) 34 end 35 end Listado 1.6: Cálculo de π mediante el algoritmo de la aguja de Buffon en Fortress
29 14 Estado del arte en lenguajes de programación paralela El Listado 1.6 es una implementación en Fortress del algoritmo de cálculo de π denominado La aguja de Buffon [84]. La estimación se realiza dividiendo el número de veces que la aguja que se deja caer toca una línea entre el número total de caídas. Cuanto mayor sea el número de experimentos o iteraciones, más precisa será la estimación. Los cálculos entre iteraciones son independientes entre sí, por lo que el bucle puede ser ejecutado en paralelo. Para conseguir este paralelismo se utiliza el bucle implícitamente paralelo de la línea 14. El ejemplo ilustra varias características del lenguaje: en la línea 9 (así como en la 20 y en la 21) se muestra que la yuxtaposición de variables representa multiplicación, tomando la notación del lenguaje matemático. El Listado 1.6 también muestra las diferentes declaraciones de variables que se pueden realizar, con variables mutables de tipos especificados y otras variables inmutables o constantes. Las expresiones atómicas (líneas 23 y 25) se utilizan para control de concurrencia, y aseguran que sólo un hilo puede leer o escribir simultáneamente las variables dentro de la expresión. Fortress es un lenguaje interpretado. El intérprete actualmente se ejecuta sobre la máquina virtual de Java. La versión 1.0 del intérprete se puede descargar libremente en la página web del proyecto [63] Otros En este apartado nos centraremos en describir algunos otros lenguajes, que si bien no tienen la relevancia de los estudiados hasta este punto, también pensamos que merecen nuestra atención por su relación tanto con llc como con la programación de sistemas multi-core que estudiaremos respectivamente en los Capítulos 2 y Cluster OpenMP El avance de OpenMP tiene como principal factor limitante la dependencia de sistemas de memoria compartida. A medida que se necesita un mayor número de procesadores, las máquinas de memoria compartida necesitan interconexiones cada vez más costosas. Cuando este número crece lo
30 1.7 Otros 15 suficiente, ya ni siquiera hay máquinas de memoria compartida de ese tamaño [22]. Los clusters de memoria distribuida, sin embargo, cuentan con conexiones mucho más asequibles (Ethernet, Infiniband, etc.) y pueden desarrollarse con hardware mucho más barato. Sin embargo, el estándar de facto para este tipo de sistemas (MPI) tiene una curva de aprendizaje mayor que la de OpenMP, y cuenta con otras problemáticas de implementación a medida que los algoritmos paralelos se complican y sus estructuras de datos se hacen más irregulares. Principalmente por estos motivos, muchos proyectos han intentado acercar el mundo OpenMP al de los sistemas de memoria distribuida. Cluster OpenMP y llc son buenos ejemplos de ello. Intel ha desarrollado Cluster OpenMP[48] como una extensión de OpenMP capaz de ejecutarse en múltiples sistemas SMP simultáneamente sin necesidad de utilizar MPI. Este sistema DSM (Distributed Shared Memory) está basado en el sistema TreadMarks [70], desarrollado por la Universidad de Rice como un proyecto de investigación académica. Cluster OpenMP extiende OpenMP con una nueva directiva (sharable) para identificar aquellas variables que pueden ser referenciadas por más de un hilo, y que, por lo tanto, deben ser gestionadas por el sistema DSM. Algunas variables son automáticamente identificadas como sharable por el compilador (variables creadas en la pila de una subrutina, variables declaradas como shared en una región paralela, etc.), mientras que otras deben declararse explícitamente (principalmente las variables globales de la aplicación). El mecanismo DSM actúa agrupando las variables compartidas en las mismas páginas de memoria, y aplicando protecciones de lectura o escritura según el estado de esas páginas en el resto de nodos. Por ejemplo, si se quiere leer una variable que ha sido modificada por otro nodo pero el sistema emite una señal SIGSEGV por estar protegida contra lectura, significa que otro nodo ha modificado alguna variable compartida, y se ha de sincronizar esa página, tras lo cual se vuelve a ejecutar la instrucción que provocó la señal. Por tanto, la protección en Cluster OpenMP es a nivel de página, y realizar una operación de sincronización sobre una variable compartida equivale a sincronizarlas todas.
31 16 Estado del arte en lenguajes de programación paralela Para que este modelo escale adecuadamente, es necesario evitar la sincronización en la medida de lo posible, puesto que un acceso a una página contenida en otro nodo es mucho más costoso que un acceso a caché o a memoria local. En la tabla 1.1 se muestra una comparativa del coste de los diferentes accesos soportados por el DSM (extraída de [48]), en la cual se observa que los accesos mediante red tienen una latencia de dos órdenes de magnitud mayor. Tipo de acceso Ciclos de CPU Caché L1 1-2 Caché L2 5-7 Caché L Memoria Nodo remoto (Gigabit Ethernet) Nodo remoto (Infiniband) Tabla 1.1: Latencia de los diferentes tipos de acceso a memoria del procesador Itanium Así pues, como cabe esperar, los problemas ideales para sacar el máximo rendimiento de Cluster OpenMP son aquellos con mucho grano (es decir, mucha computación entre sincronizaciones). El Listado 1.7, extraído de [73], implementa parte de un algoritmo para calcular la energía potencial de un conjunto de partículas que interactúan mediante el potencial de cada par. Observamos en el mismo cómo tres variables se declaran sharable (xdim, ydim y n), puesto que son variables globales y compartidas entre todos los hilos. Además, la zona de memoria a la que apuntan se aloja con la rutina kmp sharable malloc, en lugar del malloc convencional. 1 int n; 2 int niter; 3 double *xdim, *ydim; 4 #pragma intel omp sharable(xdim,ydim,n) 5 6 double computepot(); 7 void power(double *x, double*y, int i, int j); 8 void allocpositions(); 9 void initpositions(); 10 void updatepositions(); 11
32 1.7 Otros int main() { 13 int i; 14 double pot; n = 2000; 17 niter = 10; allocpositions(); 20 initpositions(); 21 updatepositions(); for( i=0; i<niter; i++ ) { 24 pot = computepot(); 25 printf("potential: %f\n", pot); 26 updatepositions(); 27 } 28 } void allocpositions() 31 { 32 double * r_tmp2; 33 int i; r_tmp2 = (double *)kmp_sharable_malloc(sizeof(double)*2*n); 36 if (!r_tmp2) 37 { 38 printf("error allocating memory\n"); 39 exit(-1); 40 } xdim = r_tmp2; 43 r_tmp2 += n; 44 ydim = r_tmp2; 45 } double computepot() { 48 int i, j; 49 double pot = 0.0; 50 double distx, disty, dist; #pragma omp parallel private(distx, disty, dist, i, j) 53 { 54 #pragma omp for schedule(static) reduction(+: pot)
33 18 Estado del arte en lenguajes de programación paralela 55 for( i=0; i<n; i++ ) { 56 for( j=0; j<i; j++ ) { 57 power(&distx, &disty, i, j); 58 dist = sqrt( distx + disty ); 59 pot += 1.0 / dist; 60 } 61 } 62 } 63 return pot; 64 } void updatepositions() { 67 int i, j; for( j=0; j<n; j++ ) 70 { 71 xdim[j] -= ( (double) rand() / (double) RAND_MAX ); 72 ydim[j] -= ( (double) rand() / (double) RAND_MAX ); 73 } 74 } Listado 1.7: Algoritmo para calcular energía potencial en partículas con Cluster OpenMP Cilk El Proyecto Cilk [56, 3] surgió en el Instituto Tecnológico de Massachusetts (MIT) en 1994, siendo presentado al gran público por primera vez entre los años 1995 y 1996 [25]. Está basado en el lenguaje Cilk, un superconjunto de C. Dispone de un compilador/preprocesador para convertir el código en C y un entorno de ejecución. Se distribuye mediante licencia GPL. El principio básico de diseño del lenguaje es que el programador debería ser responsable de expresar el paralelismo, identificando las tareas que pueden ser ejecutadas en paralelo, y dejar el resto de detalles al entorno de ejecución. Concretamente, el planificador será quien se encargue de dividir el trabajo entre los procesadores disponibles. Por lo tanto, podemos situar este lenguaje dentro del conjunto de los no fragmentados.
34 1.7 Otros 19 Para expresar el paralelismo, Cilk extiende el lenguaje C con algunas palabras reservadas. Si se eliminan dichas palabras reservadas de una aplicación Cilk, el resultado es un programa secuencial C válido, por lo que permite introducir paralelismo de forma secuencial. 1 cilk int fib (int n) 2 { 3 if (n<2) { 4 return n; 5 } else { 6 int x, y; 7 x = spawn fib (n-1); 8 y = spawn fib (n-2); 9 sync; 10 return (x+y); 11 } 12 } cilk int main (int argc, char *argv[]) 15 { 16 int n, result; 17 n = atoi(argv[1]); 18 result = spawn fib(n); 19 sync; 20 printf ("Result: %d\n", result); 21 return 0; 22 } Listado 1.8: Algoritmo para calcular el enésimo número de Fibonacci con Cilk Las palabras reservadas actualmente implementadas son: cilk: necesaria para distinguir código Cilk de código C, puesto que las funciones Cilk pueden hacer llamadas a funciones C, pero no al contrario. spawn: indica que la llamada a procedimiento que acompaña puede ser ejecutada en paralelo si el planificador así lo determina. sync: detiene la ejecución hasta que finalicen todos los procesos spawn que se estén ejecutando. Actúa como una llamada de sincronización.
35 20 Estado del arte en lenguajes de programación paralela inlet y abort se utilizan para implementar operaciones avanzadas (como secuencias atómicas) dentro de procesos spawn. El Listado 1.8, extraído del manual de Cilk [74] y que calcula el enésimo número de la secuencia de Fibonacci, muestra la similitud de un algoritmo implementado mediante Cilk respecto a su versión secuencial. Para paralelizar esta implementación del algoritmo, tan sólo es necesario introducir las 3 palabras clave fundamentales de Cilk: cilk para indicar que ambas rutinas pertenecen al lenguaje, spawn para indicar qué procedimientos pueden ser ejecutados en paralelo, y sync para forzar la sincronización al final de la ejecución de los mismos Cilk++ Cilk++ [7] surgió como respuesta al crecimiento del mercado de los sistemas multi-core. En 2006, un profesor que había estado trabajando en el proyecto creó la empresa Cilk Arts Inc. para llevar al mercado una versión comercial de Cilk que respondiera a las necesidades y oportunidades que se estaban generando. El nuevo software, reescrito por completo, fue denominado Cilk++, e incluye soporte para C++, tanto con compiladores Microsoft como GCC, soporte para bucles, y el concepto de hiperobjetos Cilk, que consiste en un nuevo constructo diseñado para resolver condiciones de carrera generadas por acceso paralelo a variables globales OpenMPD OpenMPD [27] es un modelo de programación basado en directivas para sistemas de memoria distribuida, desarrollado por la Universidad de Tsukuba. El proyecto surge como una evolución de Omni/SCASH (analizado dentro del Apartado ). Al igual que llcomp, toma como entrada código C (o Fortran) anotado con dichas directivas (similares a OpenMP) y lo traduce a MPI. Por tanto, aunque no es compatible de ningún modo con OpenMP, guarda similitudes en
36 1.7 Otros 21 las ventajas que aporta: paralelización incremental sobre el código secuencial y modelo no fragmentado que mejora la productividad del programador. En el Listado 1.9 (extraído de [27]) podemos observar que las directivas han de incluir cláusulas para indicar al compilador cómo se distribuyen las variables y cómo sincronizarlas (línea 5). De esta manera se puede inducir, por ejemplo, que un array se replique en todos los procesadores, o bien que cada procesador almacene tan sólo aquella porción que necesita para realizar los cálculos que le corresponden. Por tanto, la sincronización en este modelo es explícita y se implementa mediante diferentes patrones (comunicación entre vecinos, reducciones, etc.). En un futuro, se planea añadir a este modelo paralelismo anidado, integración con OpenMP para implementar modelos de programación híbridos y nuevos patrones de comunicación y distribuciones de datos. 1 #pragma ompd distvar(var = array;dim = 2) 2 3 main(){ 4 int i, j, res; 5 res = 0; 6 7 #pragma ompd for affinity(array) reduction(+:res) 8 for(i = 0; i < 10; i++) 9 for(j = 0; j < 10; j++){ 10 array[i][j] = func(i, j); 11 res += array[i][j]; 12 } 13 } Listado 1.9: Código de ejemplo de OpenMPD OpenWP El INRIA [9] (Instituto Nacional Francés para la Investigación en Informática y Control) ha desarrollado un modelo de programación denominado OpenWP [16], compatible con OpenMP y utilizable en aplicaciones híbridas con éste o con MPI. Actualmente soporta C, Fortran y Java, y es compatible con códigos existentes en estos lenguajes. El objetivo es ejecutar (de manera transparente a los programadores) los códigos existentes en
37 22 Estado del arte en lenguajes de programación paralela OpenMP sobre arquitecturas distribuidas, así como facilitar el desarrollo de nuevas aplicaciones gracias a que mantiene la compatibilidad con lenguajes ampliamente establecidos. El sistema, que consta de un compilador y un entorno de ejecución, trata de modelar el paralelismo de una aplicación mediante flujos, expresando así dependencias entre tareas y permitiendo al entorno de ejecución determinar cuáles puede ejecutar concurrentemente en un momento dado. El compilador ofrece como salida una librería con los bloques funcionales (que se distribuyen a todos los nodos), un archivo que describe el flujo de trabajo, y operaciones de acceso a datos que, añadidas a las funciones de la aplicación, permiten implementar las dependencias entre las tareas identificadas. El entorno de ejecución sincroniza los nodos con llamadas RPC no bloqueantes basadas en las directivas introducidas por el programador Otros sistemas SDSM Durante la fase de recopilación de información realizada en este proyecto para estudiar el estado del arte de los lenguajes modernos aplicados a la supercomputación, hemos incidido con especial énfasis en el estudio de las diferentes opciones desarrolladas en los últimos años para implementar sistemas de memoria compartida por software en máquinas de memoria distribuida (Software Distributed Shared Memory o SDSM ). En su gran mayoría no han llegado a tener gran difusión fuera del ámbito puramente académico, pero otros han sido la base para desarrollos posteriores que han dado lugar a algunos de los sistemas comentados anteriormente. Es precisamente su relación con entornos académicos lo que, en algunos casos, impide recopilar información amplia acerca de los sistemas, dada la carencia de código publicado o información en general. El apartado se divide en diferentes secciones, correspondientes a los diseños más habituales seguidos según la manera de distribuir la memoria entre los diferentes nodos. La principal fuente de información ha sido un estudio [50] llevado a cabo
38 1.7 Otros 23 por Javid Huseynov, profesor de la Universidad de California Irvine, a partir de la cual se han obtenido diversas líneas de investigación, mientras que hemos recabado otros a través de un estudio bibliográfico [49, 52] El problema de la falsa compartición Como veremos más adelante, algunas de las aproximaciones estudiadas están lastradas por un mismo problema, denominado falsa compartición (false sharing en el término inglés). La falsa compartición se produce cuando las variables utilizadas por diferentes hilos comparten las mismas posiciones en memoria caché [79]. Si se produce esta situación, los accesos sobre las mismas líneas de caché por diferentes hilos provocarán una contención innecesaria, y la memoria caché deberá refrescar su contenido continuamente, llegando a ser incluso más lenta que la memoria principal SDSMs basados en páginas Este tipo de software distribuye entre los diferentes nodos páginas de memoria virtual de tamaño fijo. Tiene varias desventajas: El tamaño de las zonas de memoria compartida no siempre se acercará al óptimo. Da lugar a problemas de falsa compartición. Aun así, son los de mayor proliferación debido a la mayor complejidad de otras aproximaciones que analizaremos posteriormente. CASHMERE (Coherence Algorithms for SHared MEmory architectures) [71] Trata de implementar coherencia de cachés por sofware en máquinas NCC-NUMA, desarrollado por la Universidad de Rochester, que llegó a establecer una patente sobre el sistema.
39 24 Estado del arte en lenguajes de programación paralela CVM (Coherent Virtual Machine) [55] Es una librería en espacio de usuario que provee memoria compartida por software en máquinas NCC-NUMA (Non-Cache-Coherent Non-Uniform Memory Access). Fue desarrollado por la Universidad de Maryland, pero el proyecto quedó discontinuado años atrás, quedando el código disponible en [20]. HAMSTER (Hybrid-DSM based Adaptive and Modular Shared memory architecture) [68] Este SDSM desarrollado por la Universidad de Munich forma parte de un proyecto más complejo (Smile Project, ver Figura 1.2) cuyo objetivo es soportar clusters de PCs consiguiendo un alto rendimiento gracias a una tecnología de interconexión denominada SCI (Scalable Coherent Interface) sobre la cual se soportan varios paradigmas de programación paralela (PVM, MPI, etc.). Entre estos, todos los que se basen en memoria distribuida estarán soportados por el SDSM denominado HAMSTER (ver Figura 1.3). Figura 1.2: Organización en capas del proyecto Smile PM2 [53] PM2 (Parallel Multithreaded Machine) es un entorno multihilo distribuido diseñado para soportar de manera eficiente aplicaciones con paralelismo irregular sobre arquitecturas distribuidas de nodos SMP. Está diseñado en una arquitectura de tres capas independientes: librerías de comunicación, de ejecución y de manejo de hilos.
40 1.7 Otros 25 Figura 1.3: Organización en capas de Hamster Actualmente, PM2 se desarrolla en el LaBRI (Laboratoire Bordelais de Recherche en Informatique) [13], un centro de investigación en Burdeos, financiado por INRIA [9], el CNRS (Centre National de la Recherche Scientifique) [12] y la Universidad de Burdeos. Dispone de licencia GPL, y está disponible para descarga en [21]. ctdsm [64] Es un módulo dentro de unas librerías de propósito general denominadas CORAL, que tratan de proporcionar un conjunto de servicios y funcionalidades independientes del sistema. Aunque el proyecto ya no está activo, disponía de operaciones de consistencia estricta y relajada, así como tolerancia a fallos. Estaba desarrollado por una empresa privada: Infinite Monkeys Incorporated [8]. PCOMP: Compiler from a high level parallel programming language with nested parallel constructs to DSM systems [67] El objetivo del proyecto PCOMP, desarrollado por la Universidad de Haifa y ya finalizado, era aplicar tecnología de compiladores para acelerar la ejecución de programas paralelos de alto nivel ejecutados por un sistema DSM que acepte sólo un estilo de programación de bajo nivel. Esto quiere decir que el compilador optimiza el código de un programa dado para que la simulación de la memoria compartida mejore mediante movimiento de páginas del sistema DSM que la soporta.
4. Programación Paralela
4. Programación Paralela La necesidad que surge para resolver problemas que requieren tiempo elevado de cómputo origina lo que hoy se conoce como computación paralela. Mediante el uso concurrente de varios
Más detallesIntroducción a las redes de computadores
Introducción a las redes de computadores Contenido Descripción general 1 Beneficios de las redes 2 Papel de los equipos en una red 3 Tipos de redes 5 Sistemas operativos de red 7 Introducción a las redes
Más detallesPreliminares. Tipos de variables y Expresiones
Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un
Más detallesCOPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA
COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA Autor: Carlos Javier Martín González. Licenciado en Física Teórica por la Universidad Autónoma de Madrid. Analista programador y funcional. Desarrollador
Más detallesUNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos
2.1. Principios básicos del Modelado de Objetos UNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos Hoy en día muchos de los procesos que intervienen en un negocio o empresa y que resuelven
Más detallesNicolás Zarco Arquitectura Avanzada 2 Cuatrimestre 2011
Clusters Nicolás Zarco Arquitectura Avanzada 2 Cuatrimestre 2011 Introducción Aplicaciones que requieren: Grandes capacidades de cómputo: Física de partículas, aerodinámica, genómica, etc. Tradicionalmente
Más detallesModelo de aplicaciones CUDA
Modelo de aplicaciones CUDA Utilización de GPGPUs: las placas gráficas se utilizan en el contexto de una CPU: host (CPU) + uno o varios device o GPUs Procesadores masivamente paralelos equipados con muchas
Más detallesK2BIM Plan de Investigación - Comparación de herramientas para la parametrización asistida de ERP Versión 1.2
K2BIM Plan de Investigación - Comparación de herramientas para la parametrización asistida de ERP Versión 1.2 Historia de revisiones Fecha VersiónDescripción Autor 08/10/2009 1.0 Creación del documento.
Más detallesIntroducción a la Firma Electrónica en MIDAS
Introducción a la Firma Electrónica en MIDAS Firma Digital Introducción. El Módulo para la Integración de Documentos y Acceso a los Sistemas(MIDAS) emplea la firma digital como método de aseguramiento
Más detallesCreación y administración de grupos de dominio
Creación y administración de grupos de dominio Contenido Descripción general 1 a los grupos de Windows 2000 2 Tipos y ámbitos de los grupos 5 Grupos integrados y predefinidos en un dominio 7 Estrategia
Más detallesIntroducción a la programación orientada a objetos
Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación
Más detallesPropuesta de Portal de la Red de Laboratorios Virtuales y Remotos de CEA
Propuesta de Portal de la Red de Laboratorios Virtuales y Remotos de CEA Documento de trabajo elaborado para la Red Temática DocenWeb: Red Temática de Docencia en Control mediante Web (DPI2002-11505-E)
Más detallesParámetros con la ventana de selección de usuario, reglas, texto y descomposición (IVE)
QUÉ SON CONCEPTOS PARAMÉTRICOS? Los conceptos paramétricos de Presto permiten definir de una sola vez una colección de conceptos similares a partir de los cuales se generan variantes o conceptos derivados
Más detallesIngº CIP Fabian Guerrero Medina Master Web Developer-MWD
1 Java es un lenguaje de programación de Sun Microsystems originalmente llamado "Oak. James Gosling Bill Joy 2 Oak nació para programar pequeños dispositivos electrodomésticos, como los asistentes personales
Más detallesElementos requeridos para crearlos (ejemplo: el compilador)
Generalidades A lo largo del ciclo de vida del proceso de software, los productos de software evolucionan. Desde la concepción del producto y la captura de requisitos inicial hasta la puesta en producción
Más detallesCAPÍTUL07 SISTEMAS DE FILOSOFÍA HÍBRIDA EN BIOMEDICINA. Alejandro Pazos, Nieves Pedreira, Ana B. Porto, María D. López-Seijo
CAPÍTUL07 SISTEMAS DE FILOSOFÍA HÍBRIDA EN BIOMEDICINA Alejandro Pazos, Nieves Pedreira, Ana B. Porto, María D. López-Seijo Laboratorio de Redes de Neuronas Artificiales y Sistemas Adaptativos Universidade
Más detallesMódulo: Modelos de programación para Big Data
Program. paralela/distribuida Módulo: Modelos de programación para Big Data (título original: Entornos de programación paralela basados en modelos/paradigmas) Fernando Pérez Costoya Introducción Big Data
Más detallesIntroducción En los años 60 s y 70 s cuando se comenzaron a utilizar recursos de tecnología de información, no existía la computación personal, sino que en grandes centros de cómputo se realizaban todas
Más detallesMANUAL DE USUARIO DE LA APLICACIÓN DE ACREDITACION DE ACTIVIDADES DE FORMACION CONTINUADA. Perfil Entidad Proveedora
MANUAL DE USUARIO DE LA APLICACIÓN DE ACREDITACION DE ACTIVIDADES DE FORMACION CONTINUADA Perfil Entidad Proveedora El objetivo del módulo de Gestión de Solicitudes vía Internet es facilitar el trabajo
Más detallesARQUITECTURA DE DISTRIBUCIÓN DE DATOS
4 ARQUITECTURA DE DISTRIBUCIÓN DE DATOS Contenido: Arquitectura de Distribución de Datos 4.1. Transparencia 4.1.1 Transparencia de Localización 4.1.2 Transparencia de Fragmentación 4.1.3 Transparencia
Más detallesArquitectura de sistema de alta disponibilidad
Mysql Introducción MySQL Cluster esta diseñado para tener una arquitectura distribuida de nodos sin punto único de fallo. MySQL Cluster consiste en 3 tipos de nodos: 1. Nodos de almacenamiento, son los
Más detallesGENERACIÓN DE CÓDIGO
GENERACIÓN DE CÓDIGO INTRODUCCION La generación de código es la fase más compleja de un compilador, puesto que no sólo depende de las características del lenguaje fuente sino también de contar con información
Más detallesTema 4. Gestión de entrada/salida
Tema 4. Gestión de entrada/salida 1. Principios de la gestión de E/S. 1.Problemática de los dispositivos de E/S. 2.Objetivos generales del software de E/S. 3.Principios hardware de E/S. 1. E/S controlada
Más detallesCapítulo 5. Cliente-Servidor.
Capítulo 5. Cliente-Servidor. 5.1 Introducción En este capítulo hablaremos acerca de la arquitectura Cliente-Servidor, ya que para nuestra aplicación utilizamos ésta arquitectura al convertir en un servidor
Más detallesTema 1 Introducción. Arquitectura básica y Sistemas Operativos. Fundamentos de Informática
Tema 1 Introducción. Arquitectura básica y Sistemas Operativos Fundamentos de Informática Índice Descripción de un ordenador Concepto básico de Sistema Operativo Codificación de la información 2 1 Descripción
Más detallesPráctica del paso de generación de Leads
Práctica del paso de generación de Leads La parte práctica de este módulo consiste en poner en marcha y tener en funcionamiento los mecanismos mediante los cuales vamos a generar un flujo de interesados
Más detallesInstalación y mantenimiento de servicios de Internet. U.T.3.- Servicio DNS
Instalación y mantenimiento de servicios de Internet U.T.3.- Servicio DNS 1 Qué es el servicio DNS? A los usuarios de Internet les resulta complicado trabajar con direcciones IP, sobre todo porque son
Más detallesBase de datos en Excel
Base de datos en Excel Una base datos es un conjunto de información que ha sido organizado bajo un mismo contexto y se encuentra almacenada y lista para ser utilizada en cualquier momento. Las bases de
Más detallesCURSO: APACHE SPARK CAPÍTULO 2: INTRODUCCIÓN A APACHE SPARK. www.formacionhadoop.com
CURSO: APACHE SPARK CAPÍTULO 2: INTRODUCCIÓN A APACHE SPARK www.formacionhadoop.com Índice 1 Qué es Big Data? 2 Problemas con los sistemas tradicionales 3 Qué es Spark? 3.1 Procesamiento de datos distribuido
Más detallescomunidades de práctica
1. Introducción CoSpace es una plataforma web diseñada para proporcionar un espacio virtual de interacción y colaboración entre formadores en comunidades virtuales. Se originó como resultado de las necesidades
Más detallesServicios avanzados de supercomputación para la ciència y la ingeniería
Servicios avanzados de supercomputación para la ciència y la ingeniería Servicios avanzados de supercomputación para la ciència y la ingeniería HPCNow! provee a sus clientes de la tecnología y soluciones
Más detallesIntroduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia
Introduccion al Lenguaje C Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introducción C es un lenguaje de programación creado en 1972 por
Más detallesCAPÍTULO 1 Instrumentación Virtual
CAPÍTULO 1 Instrumentación Virtual 1.1 Qué es Instrumentación Virtual? En las últimas décadas se han incrementado de manera considerable las aplicaciones que corren a través de redes debido al surgimiento
Más detallesDiseño orientado a los objetos
Diseño orientado a los objetos El Diseño Orientado a los Objetos (DOO) crea una representación del problema del mundo real y la hace corresponder con el ámbito de la solución, que es el software. A diferencia
Más detallesLos distintos navegadores para movernos por Internet
www.solucionesenlaweb.com Los distintos navegadores para movernos por Internet Para que los usuarios puedan navegar por Internet y ver la información que más les interesa en cada momento, utilizamos los
Más detallesUna computadora de cualquier forma que se vea tiene dos tipos de componentes: El Hardware y el Software.
ARQUITECTURA DE LAS COMPUTADORAS QUE ES UNA COMPUTADORA (UN ORDENADOR)? Existen numerosas definiciones de una computadora, entre ellas las siguientes: 1) Una computadora es un dispositivo capaz de realizar
Más detallesGrupo de Computación de Altas Prestaciones GCAPULL, Univers. GCAPULL, Universidad de La Laguna, Tenerife
Grupo de Computación de Altas Prestaciones GCAPULL, Universidad de La Laguna, Tenerife Febrero 2010, Alicante Contents El grupo 1 El grupo 2 3 4 Composición 6 doctores 7 alumnos en fase de tesis Información
Más detallesLA LOGÍSTICA COMO FUENTE DE VENTAJAS COMPETITIVAS
LA LOGÍSTICA COMO FUENTE DE VENTAJAS COMPETITIVAS Los clientes compran un servicio basandose en el valor que reciben en comparacion con el coste en el que incurren. Por, lo tanto, el objetivo a largo plazo
Más detallesArquitectura de Aplicaciones
1 Capítulo 13: Arquitectura de aplicaciones. - Sommerville Contenidos del capítulo 13.1 Sistemas de procesamiento de datos 13.2 Sistemas de procesamiento de transacciones 13.3 Sistemas de procesamiento
Más detallesCLUSTER FING: PARALELISMO de MEMORIA DISTRIBUIDA
CLUSTER FING: PARALELISMO de MEMORIA DISTRIBUIDA SERGIO NESMACHNOW Centro de Cálculo, Instituto de Computación FACULTAD DE INGENIERÍA, UNIVERSIDAD DE LA REPÚBLICA, URUGUAY CONTENIDO Introducción: arquitecturas
Más detallesMetodología y Framework para el Desarrollo de Aplicaciones Científicas con Computación de Alto Rendimiento a través de Servicios Web
Metodología y Framework para el Desarrollo de Aplicaciones Científicas con Computación de Alto Rendimiento a través de Servicios Web J.Corral-García, D.Cortés-Polo, C.Gómez-Martín, J.L.González-Sánchez
Más detallesEL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET
1 EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET La familia de protocolos TCP/IP fue diseñada para permitir la interconexión entre distintas redes. El mejor ejemplo es Internet: se trata
Más detallesAlgoritmos y Diagramas de Flujo 2
Algoritmos y Diagramas de Flujo 2 Programación Java NetBeans 7.0 RPC Contenido 2.1 Algoritmo...1 Fase de creación de un algoritmo...1 Herramientas de un algoritmo...2 2.2 Diagrama de Flujo...2 Símbolos
Más detallesComponentes de Integración entre Plataformas Información Detallada
Componentes de Integración entre Plataformas Información Detallada Active Directory Integration Integración con el Directorio Activo Active Directory es el servicio de directorio para Windows 2000 Server.
Más detallespymegnu v2.0 PRESENTACIÓN DE PRODUCTOS
PRESENTACIÓN DE PRODUCTOS pymegnu v2.0 1 INTRODUCCIÓN Nuestros sistemas 100% web le permitirán poder obtener todas las ventajas competitivas que ofrece Internet, como la disponibilidad de tener sus sistemas
Más detallesAnálisis de aplicación: Virtual Machine Manager
Análisis de aplicación: Virtual Machine Manager Este documento ha sido elaborado por el Centro de Apoyo Tecnológico a Emprendedores bilib, www.bilib.es Copyright 2011, Junta de Comunidades de Castilla
Más detallesUNIDADES FUNCIONALES DEL ORDENADOR TEMA 3
UNIDADES FUNCIONALES DEL ORDENADOR TEMA 3 INTRODUCCIÓN El elemento hardware de un sistema básico de proceso de datos se puede estructurar en tres partes claramente diferenciadas en cuanto a sus funciones:
Más detallesforma de entrenar a la nuerona en su aprendizaje.
Sistemas expertos e Inteligencia Artificial,Guía5 1 Facultad : Ingeniería Escuela : Computación Asignatura: Sistemas expertos e Inteligencia Artificial Tema: SISTEMAS BASADOS EN CONOCIMIENTO. Objetivo
Más detallesCapítulo 12: Indexación y asociación
Capítulo 12: Indexación y asociación Conceptos básicos Índices ordenados Archivos de índice de árbol B+ Archivos de índice de árbol B Asociación estática Asociación dinámica Comparación entre indexación
Más detallesNovedades en Q-flow 3.02
Novedades en Q-flow 3.02 Introducción Uno de los objetivos principales de Q-flow 3.02 es adecuarse a las necesidades de grandes organizaciones. Por eso Q-flow 3.02 tiene una versión Enterprise que incluye
Más detallesProceso Unificado de Rational PROCESO UNIFICADO DE RATIONAL (RUP) El proceso de desarrollo de software tiene cuatro roles importantes:
PROCESO UNIFICADO DE RATIONAL (RUP) El proceso de desarrollo de software tiene cuatro roles importantes: 1. Proporcionar una guía de actividades para el trabajo en equipo. (Guía detallada para el desarrollo
Más detallesGestión de la Configuración
Gestión de la ÍNDICE DESCRIPCIÓN Y OBJETIVOS... 1 ESTUDIO DE VIABILIDAD DEL SISTEMA... 2 ACTIVIDAD EVS-GC 1: DEFINICIÓN DE LOS REQUISITOS DE GESTIÓN DE CONFIGURACIÓN... 2 Tarea EVS-GC 1.1: Definición de
Más detallesDISCOS RAID. Se considera que todos los discos físicos tienen la misma capacidad, y de no ser así, en el que sea mayor se desperdicia la diferencia.
DISCOS RAID Raid: redundant array of independent disks, quiere decir conjunto redundante de discos independientes. Es un sistema de almacenamiento de datos que utiliza varias unidades físicas para guardar
Más detallesUtilidades de la base de datos
Utilidades de la base de datos Desde esta opcion del menú de Access, podemos realizar las siguientes operaciones: Convertir Base de datos Compactar y reparar base de datos Administrador de tablas vinculadas
Más detallesCapítulo 4. Requisitos del modelo para la mejora de la calidad de código fuente
Capítulo 4. Requisitos del modelo para la mejora de la calidad de código fuente En este capítulo definimos los requisitos del modelo para un sistema centrado en la mejora de la calidad del código fuente.
Más detallesCiclo de vida y Metodologías para el desarrollo de SW Definición de la metodología
Ciclo de vida y Metodologías para el desarrollo de SW Definición de la metodología La metodología para el desarrollo de software es un modo sistemático de realizar, gestionar y administrar un proyecto
Más detallesCapítulo 1 Introducción a la Computación
Capítulo 1 Introducción a la Computación 1 MEMORIA PRINCIPAL (RAM) DISPOSITIVOS DE ENTRADA (Teclado, Ratón, etc) C P U DISPOSITIVOS DE SALIDA (Monitor, Impresora, etc.) ALMACENAMIENTO (Memoria Secundaria:
Más detallesCapítulo 4. Vectores y matrices. 4.1 Declaración de tablas. 4.2 Declaración estática de tablas
Capítulo 4 Vectores y matrices En FORTRAN se puede utilizar un tipo especial de variable que sirve, en particular, para almacenar vectores y matrices. De esta forma, se utiliza un sólo nombre para referirse
Más detallesResumen del trabajo sobre DNSSEC
Resumen del trabajo sobre Contenido 1. -...2 1.1. - Definición...2 1.2. - Seguridad basada en cifrado...2 1.3. - Cadenas de confianza...3 1.4. - Confianzas...4 1.5. - Islas de confianza...4 2. - Conclusiones...5
Más detallesUnidad didáctica: Funcionamiento de un parking. Actividad: Funcionamiento de un parking de vehículos con entrada y salida automática con:
Unidad didáctica: Funcionamiento de un parking Descripción: Actividad: Funcionamiento de un parking de vehículos con entrada y salida automática con: Detección del vehiculo entrante Recogida de ticket
Más detallesApp para realizar consultas al Sistema de Información Estadística de Castilla y León
App para realizar consultas al Sistema de Información Estadística de Castilla y León Jesús M. Rodríguez Rodríguez rodrodje@jcyl.es Dirección General de Presupuestos y Estadística Consejería de Hacienda
Más detallesFigura 4.1 Clasificación de los lenguajes de bases de datos
1 Colección de Tesis Digitales Universidad de las Américas Puebla Romero Martínez, Modesto Este capítulo describen los distintos lenguajes para bases de datos, la forma en que se puede escribir un lenguaje
Más detallesA continuación resolveremos parte de estas dudas, las no resueltas las trataremos adelante
Modulo 2. Inicio con Java Muchas veces encontramos en nuestro entorno referencias sobre Java, bien sea como lenguaje de programación o como plataforma, pero, que es en realidad Java?, cual es su historia?,
Más detallesCAPÍTULO 2 Sistemas De Base De Datos Multiusuarios
CAPÍTULO 2 Sistemas De De Multiusuarios Un sistema multiusuario es un sistema informático que da servicio, manera concurrente, a diferentes usuarios mediante la utilización compartida sus recursos. Con
Más detallesEn cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.
Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa
Más detallesUN ENTORNO A MEDIDA PARA EL DISEÑO Y LA SIMULACIÓN DE MAQUINARIA POR COMPUTADOR
UN ENTORNO A MEDIDA PARA EL DISEÑO Y LA SIMULACIÓN DE MAQUINARIA POR COMPUTADOR Manuel González y Javier Cuadrado Departamento de Ingeniería Industrial II, Campus de Esteiro, 15403 Ferrol Universidad de
Más detallesGeneral Parallel File System
General Parallel File System Introducción GPFS fue desarrollado por IBM, es un sistema que permite a los usuarios compartir el acceso a datos que están dispersos en múltiples nodos; permite interacción
Más detallesModificación y parametrización del modulo de Solicitudes (Request) en el ERP/CRM Compiere.
UNIVERSIDAD DE CARABOBO FACULTAD DE CIENCIA Y TECNOLOGÍA DIRECCION DE EXTENSION COORDINACION DE PASANTIAS Modificación y parametrización del modulo de Solicitudes (Request) en el ERP/CRM Compiere. Pasante:
Más detallesConclusiones. Particionado Consciente de los Datos
Capítulo 6 Conclusiones Una de las principales conclusiones que se extraen de esta tesis es que para que un algoritmo de ordenación sea el más rápido para cualquier conjunto de datos a ordenar, debe ser
Más detallesPROGRAMACIÓ DIDÁCTICA: Secuanciación, Temporalización y Unidades Didácticas
Departamento de Informática PROGRAMACIÓN DIDÁCTICA Curso 11-12 1 CONSEJERÍA DE EDUCACIÓN I.E.S. NERVIÓN Departamento de Informática CICLO FORMATIVO: TÉCNICO SUPERIOR EN DESARROLLO DE APLICACIONES MULTIPLATAFORMA.
Más detalles1 GLOSARIO. Actor: Es un consumidor (usa) del servicio (persona, sistema o servicio).
1 GLOSARIO A continuación se definen, en orden alfabético, los conceptos básicos que se han abordado a lo largo del desarrollo de la metodología para la gestión de requisitos bajo la Arquitectura Orientada
Más detallesLiLa Portal Guía para profesores
Library of Labs Lecturer s Guide LiLa Portal Guía para profesores Se espera que los profesores se encarguen de gestionar el aprendizaje de los alumnos, por lo que su objetivo es seleccionar de la lista
Más detallesPROGRAMACIÓN ORIENTADA A OBJETOS Master de Computación. II MODELOS y HERRAMIENTAS UML. II.2 UML: Modelado de casos de uso
PROGRAMACIÓN ORIENTADA A OBJETOS Master de Computación II MODELOS y HERRAMIENTAS UML 1 1 Modelado de casos de uso (I) Un caso de uso es una técnica de modelado usada para describir lo que debería hacer
Más detallesISO 9001:2000 DOCUMENTO INFORMATIVO DOCUMENTO ELABORADO POR CHRISTIAN NARBARTE PARA EL IVECE
ISO 9001:2000 DOCUMENTO INFORMATIVO DOCUMENTO ELABORADO POR CHRISTIAN NARBARTE PARA EL IVECE MARZO 2007 Este documento contesta las preguntas más frecuentes que se plantean las organizaciones que quieren
Más detallesAdelacu Ltda. www.adelacu.com Fono +562-218-4749. Graballo+ Agosto de 2007. Graballo+ - Descripción funcional - 1 -
Graballo+ Agosto de 2007-1 - Índice Índice...2 Introducción...3 Características...4 DESCRIPCIÓN GENERAL...4 COMPONENTES Y CARACTERÍSTICAS DE LA SOLUCIÓN...5 Recepción de requerimientos...5 Atención de
Más detallesFundamentos del diseño 3ª edición (2002)
Unidades temáticas de Ingeniería del Software Fundamentos del diseño 3ª edición (2002) Facultad de Informática necesidad del diseño Las actividades de diseño afectan al éxito de la realización del software
Más detallesConcurrencia. Primitivas IPC con bloqueo
Concurrencia Primitivas IPC con bloqueo Primitivas de IPC con bloqueo La solución de Peterson es correcta, pero tiene el defecto de requerir espera ocupada: Cuando un proceso quiere entrar en su región
Más detallesLos mayores cambios se dieron en las décadas de los setenta, atribuidos principalmente a dos causas:
SISTEMAS DISTRIBUIDOS DE REDES 1. SISTEMAS DISTRIBUIDOS Introducción y generalidades La computación desde sus inicios ha sufrido muchos cambios, desde los grandes equipos que permitían realizar tareas
Más detalles8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
Más detallesNo se requiere que los discos sean del mismo tamaño ya que el objetivo es solamente adjuntar discos.
RAIDS MODO LINEAL Es un tipo de raid que muestra lógicamente un disco pero se compone de 2 o más discos. Solamente llena el disco 0 y cuando este está lleno sigue con el disco 1 y así sucesivamente. Este
Más detalles6. DESCRIPCIÓN DEL SOFTWARE
Capítulo 2. Equipo 6. DESCRIPCIÓN DEL SOFTWARE 6.1 Introducción El equipo de medida descrito en el capítulo anterior lleva asociado un software que hace de sistema de control del proceso de medición. Este
Más detallesCapítulo 1 Documentos HTML5
Capítulo 1 Documentos HTML5 1.1 Componentes básicos HTML5 provee básicamente tres características: estructura, estilo y funcionalidad. Nunca fue declarado oficialmente pero, incluso cuando algunas APIs
Más detallesAnexo A Diagramas de Navegación
Anexo A Diagramas de Navegación Figura D.1: Diagrama de navegación de la pantalla principal. 43 Figura D.2: Diagrama de navegación del apartado Crear Encuesta. 44 Figura D.3: Diagrama de navegación del
Más detallesAHORRACOM SOLUCIONES AVANZADAS S.L. Avda. de la Industria 13, Oficina 25. 28108 Alcobendas, Madrid. www.ahorracom.com
PAGTE Plan de Ahorro y Gestión de Telecomunicaciones para Empresas En Ahorracom nos ponemos de su parte. Por eso nos interesa que usted, nuestro cliente, esté al tanto de todos los procesos que llevamos
Más detallesPROPÓSITO... 2 DETERMINANTES PARA UNA BUENA EXPERIENCIA DE USO...
Tabla de Contenido PROPÓSITO... 2 DETERMINANTES PARA UNA BUENA EXPERIENCIA DE USO... 2 1. LA PRESENCIA DE INFORMACIÓN Y AYUDA ÚTIL PARA COMPLETAR LOS TRÁMITES EN LÍNEA.... 2 2. LA DISPONIBILIDAD DE DIVERSOS
Más detallesREDES INFORMATICAS: Protocolo IP
REDES INFORMATICAS: Protocolo IP 1. PRINCIPIOS BÁSICOS DE IP El protocolo IP se basa en tres principios básicos: Un direccionamiento de los ordenadores. Un tipo de dato: el datragrama IP. Un algoritmo
Más detallesProcesos. Bibliografía. Threads y procesos. Definiciones
Procesos Prof. Mariela Curiel Bibliografía A. Tanembaum & M. Van Steen. Sistemas Distribuidos. Principios y Paradigmas. 2da. Edición. Smith & Nair. The Architecture of Virtual Machines. IEEE Computer.
Más detallesSistemas Operativos Windows 2000
Sistemas Operativos Contenido Descripción general 1 Funciones del sistema operativo 2 Características de 3 Versiones de 6 Sistemas Operativos i Notas para el instructor Este módulo proporciona a los estudiantes
Más detallesActividades para mejoras. Actividades donde se evalúa constantemente todo el proceso del proyecto para evitar errores y eficientar los procesos.
Apéndice C. Glosario A Actividades de coordinación entre grupos. Son dinámicas y canales de comunicación cuyo objetivo es facilitar el trabajo entre los distintos equipos del proyecto. Actividades integradas
Más detallesDía 5-6-2012 17:00h Lugar: Obra Social Ibercaja, Sala De actos, Rambla Ferran 38, 3º, Lleida
Resumen de la conferencia Día 5-6-2012 17:00h Lugar: Obra Social Ibercaja, Sala De actos, Rambla Ferran 38, 3º, Lleida Ponente: Luis Muñiz Socio Director de Sisconges & Estrategia y experto en Sistemas
Más detallesSÍNTESIS Y PERSPECTIVAS
SÍNTESIS Y PERSPECTIVAS Los invitamos a observar, a identificar problemas, pero al mismo tiempo a buscar oportunidades de mejoras en sus empresas. REVISIÓN DE CONCEPTOS. Esta es la última clase del curso.
Más detallesBechtle Solutions Servicios Profesionales
Soluciones Tecnología Bechtle Solutions Servicios Profesionales Fin del servicio de soporte técnico de Windows Server 2003 No hacer nada puede ser un riesgo BECHTLE Su especialista en informática Ahora
Más detallesJava Inicial (20 horas)
Java Inicial (20 horas) 1 Temario 1. Programación Orientada a Objetos 2. Introducción y Sintaxis Java 3. Sentencias Control Flujo 4. POO en Java 5. Relaciones entre Objetos 6. Polimorfismo, abstracción
Más detallesMaquinas virtuales Conceptos Básicos
Jimenez Zamudio Eduardo Aplicaciones de redes de computadoras 13 de septiembre de 2014 Maquinas virtuales Conceptos Básicos Concepto Básicamente, es un equipo dentro de un equipo, implementado en el software.
Más detallesCurso Online de Microsoft Project
Curso Online de Microsoft Project Presentación El curso a distancia estudia conceptos generales sobre las tecnologías relacionadas con Internet. Conceptos que cualquier usuario de ordenadores debe conocer
Más detallesEstas visiones de la información, denominadas vistas, se pueden identificar de varias formas.
El primer paso en el diseño de una base de datos es la producción del esquema conceptual. Normalmente, se construyen varios esquemas conceptuales, cada uno para representar las distintas visiones que los
Más detallesLINEAMIENTOS ESTÁNDARES APLICATIVOS DE VIRTUALIZACIÓN
LINEAMIENTOS ESTÁNDARES APLICATIVOS DE VIRTUALIZACIÓN Tabla de Contenidos LINEAMIENTOS ESTÁNDARES APLICATIVOS DE VIRTUALIZACIÓN... 1 Tabla de Contenidos... 1 General... 2 Uso de los Lineamientos Estándares...
Más detallesResolución de problemas en paralelo
Resolución de problemas en paralelo Algoritmos Paralelos Tema 1. Introducción a la computación paralela (segunda parte) Vicente Cerverón Universitat de València Resolución de problemas en paralelo Descomposición
Más detallesOficina Online. Manual del administrador
Oficina Online Manual del administrador 2/31 ÍNDICE El administrador 3 Consola de Administración 3 Administración 6 Usuarios 6 Ordenar listado de usuarios 6 Cambio de clave del Administrador Principal
Más detallesCorrespondencias entre taxonomías XBRL y ontologías en OWL Unai Aguilera, Joseba Abaitua Universidad de Deusto, EmergiaTech
Correspondencias entre taxonomías XBRL y ontologías en OWL Unai Aguilera, Joseba Abaitua Universidad de Deusto, EmergiaTech Resumen Todo documento XBRL contiene cierta información semántica que se representa
Más detalles