Los cursos que imparto generalmente son: Programación Paralela (CUDA-OpenMP-MPI), Programación Avanzada, Arquitectura de Computadoras, Computación Móvil, Diseño de Herramientas para Sistemas Distribuidos, Tópicos Selectos en Computación Científica y Tópicos Selectos de HPC I, II y III.

Varios de estos cursos se han adaptado para dar capacitación a otras instituciones o empresas.
Cursos
Enero-Abril: Tópicos Selectos de HPC II
Mayo-Agostol: Tópicos Selectos de HPC III
Enero-Abril: Tópicos Selectos de HPC II
Mayo-Agostol: Tópicos Selectos de HPC III
Septiembre-Dociembre: Programación Avanzada, Programación Orientada a Objetos y Tópicos Selectos HPC I
Enero-Abril: Computación Paralela
Mayo-Agostol: Sistemas Operativos
Septiembre-Dociembre: Tópicos Selectos HPC I
Enero-Abril: Computación Paralela
Mayo-Agostol: Seminario de tesis III
Enero-Abril: Computación Paralela
Mayo-Agostol: Tópicos Selectos en Computación Científica I
Septiembre-Diciembre: Seminario de Tesis de Maestría I
Enero-Abril: Computación Paralela
Mayo-Agostol: Sistemas Oprativos, Tópicos Selectos en Computación Científica I
Septiembre-Diciembre: Programación Avanzada
Contenidos
I. Conceptos básicos.
I.1 Proceso de desarrollo de un programa.
I.2 Tipos de datos abstractos.
I.3 Organización de código.
I.4 Funciones.
I.5 Punteros y manejo de memoria.
I.6 Fugas de memoria.

II. Estructuras de datos.
II.1 Pilas, colas, listas, listas doblemente ligadas.
II.2 árboles: árboles, binarios, recorridos, balanceo, b˙squeda.
II.3 Algoritmos de b˙squeda, ordenamiento y hash.

III STL (Standar Template Library)
III.1 Vectores
III.2 Iteradores.
III.3 Vectores bidimiensionales.
III.4 Colas y listas.

IV Scripts
IV.1 Shell.
IV.2 Perl.
IV.3 Phyton.
IV.4 Ruby.

Bibliografía sugerida
1. Reema Thareja. Data Structures Using C. Oxford University Press, Inc., New York, NY, USA. 2011.
2. Kernighan, Brian W., Rob Pike. El entorno de programación UNIX. Prentice-Hall Hispanoamericana, 1987.
3. Kernighan, Brian W., and Dennis M. Ritchie. El lenguaje de programación C. Pearson Educación, 1991.
4. Wall, Larry, Tom Christiansen, and Jon Orwant. Programming perl. O'Reilly Media, Inc., 2004.
5. Sanner, Michel F. Python: a programming language for software integration and development.} J Mol Graph Model 17.1 (1999): 57-61.
6. Flanagan, David, and Yukihiro Matsumoto. The ruby programming language.}O'Reilly Media, Inc.", 2008.
7. Marquez, Francisco. Unix-Programacion Avanzada. Alfaomega Grupo Editor, 2005.

1. Findamentos de Programacion Orientada a Objetos
1.1. Abstracción.
1.1.1. Objetos como interfaces.
1.1.2. Interfaces e implementación.
1.1.3. Reutilización de código.
1.1.4. Reutilización de interfaces (herencia)
1.1.5. Polimorfismo
1.2. Tecnologías de desarrollo.
1.2.1 Compiladores, cargadores y ligadores (ligado dinámico y estático).
1.2.2 Sistema en tiempo de ejecución (constructores – destructores, colector de basura)
1.2.3. Memoria dinámica (manejo de pila, pool y liberación de memoria).
1.2.3 Manejo de errores y notificaciones .

2. C++.
2.1. Espacio de nombres.
2.2. Manejo de iostreams.
2.3. Tipos de datos abstractos.
2.4. Clases.
2.5. Inicialización y destructor.
2.6. Sobrecarga de funciones y argumentos por omisión.
2.7. Elementos estáticos.
2.8. Apuntadores en C++.
2.6. Sobrecarga de métodos.
2.7. Creación dinámica de objetos
2.8. Herencia y composición.
2.9. Polimorfismo y funciones virtuales.

3. Java.
3.1. Tipos de datos.
3.2. Inicialización y borrado.
3.3. Control de acceso.
3.4. Reutilización de clases.
3.5 Polimorfismo.
3.6 Interfaces.
3.7. Clases internas.
3.8 Manejo de errores.
3.9. Objetos String y Array.
3.10 Manejo de entrada y salida

4. Estructuras de datos.
4.1. Arreglos y vectores.
4.2. Matrices.
4.3. Listas, pilas y colas.
4.4. Diccionario de datos y tablas hash.
4.5. Árboles (binarios, AVL, Btree y Btree+)

5. Python
5.1 Introducción
5.2. Patrones.
5.3. Frameworks.
5.4. Decorador: tipos selección dinámica.
5.5. Iteradores.
5.6. Fábricas: encapsulamiento de la creación de objetos.
5.7. Objetos funcionales.
5.8. Patrones para cambiar interface (Adapter y Facade).


Bibliografía

• Castagna, Giuseppe. Object-Oriented Programming A Unified Foundation. Springer Science & Business Media, 2012.

• Lutz, Mark. Learning Python: Powerful Object-Oriented Programming. " O'Reilly Media, Inc.", 2013.

• Blaschek, Günther. Object-oriented Programming: With Prototypes. Springer Science & Business Media, 2012.

• Drozdek, Adam. Data Structures and algorithms in C++. Cengage Learning, 2012.
• Zeigler, Bernard P. Objects and systems: principled design with implementations in C++ and Java. Springer Science & Business Media, 2012.

• Josuttis, Nicolai M. The C++ standard library: a tutorial and reference. Addison-Wesley, 2012.

• Goodrich, Michael T., Roberto Tamassia, and Michael H. Goldwasser. Data structures and algorithms in Java. John Wiley & Sons, 2014.

• Lutz, Mark. Learning Python: Powerful Object-Oriented Programming. " O'Reilly Media, Inc.", 2013.

• Lafore, Robert. Data structures and algorithms in Java. Sams publishing, 2017.

1. Introducción a la computación paralela
1.2 Definiciones básica
1.3 Taxonomía de programas paralelos
1.4 Arquitecturas paralelas
1.4.1 Arquitecturas basadas en memoria
1.4.2 Arquitecturas multicore y manycore
1.4.3 Constelaciones
1.4.4 Arquitecturas basadas en clusters
1.4.5 Arquitecturas híbridas-heterpgeneas
1.5 Diseño de algoritmos paralelos
1.5.1 Modelo tarea-canal
1.5.2 Metodologia de Ian-Foster
1.5.3 Patrones de programas paralelos

2. Programación Multicore
2.1 Modelo de memoria compartida y tecnologías de desarrollo
2.2 Hilos
2.3 OpenMP
2.4 Algoritmos SIMD y MIMD

3. Análisis de rendimiento de programas paralelos
3.1 Modelo de tiempo de ejecución
3.2 Aceleración y eficiencia
3.3 Ley de Amdahl
3.4 Ley de Gustafson-Barsis
3.5 Métrica Karp-Flatt
3.6 Métrica de isoeficiencia
3.7 Análisis de consumo energético

4. Programación Many-Core
4.1 Modelos de programas en arquitecturas heterogéneas
4.2 Lenguajes y herramientas de desarrollo
4.3 Programación en CUDA y OpenACC
4.4 Programación para XEON-PHI

5. Programación para memoria distribuida
5.1 Modelos de programación
5.2 Programación en MPI
5.2.1 Modelo de paso de mensajes
5.2.2 La interfaz de paso de mensajes
5.2.3 Funciones básicas y ejecución de programas MPI
5.2.4 Introducción a la comunicación colectiva
5.2.5 Medición de tiempos de ejecución.
5.2.6 Comunicación punto a punto.
5.2.7 Comunicación Avanzada (Scatter, Gather, Broadcast, All to All)
5.2.5 Ejemplos.

6. Programación multi-many core
6.1 Revisando la metodologia de Foster y patrones de programas paralelos.
6.2 Programación OpenMP-CUDA
6.2 Algoritmos y programas paralelos híbridos
6.3 Algoritmos y programas paralelos híbridos-heterogéneos
Cinvestav-IPN, Departamento de Computación
ameneses@cs.cinvestav.mx
Tel: (+ 52) 5557473800 ext 6551