Los cursos que imparto generalmente son: Tópicos Selectos en Computación Sustentable, 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, Tópicos Selectos en Computación Sustentable
Mayo-Agosto: Tópicos Selectos de HPC III, Seminario de Tesis III
Septiembre-Diciembre: Tópicos Selectos de HPC I, Seminario de Tesis I, Tópicos Selectos en Aprendizaje Automático Aplicado a Problemas de Físico-Química, Comoputación (Programa de Comunicaciones)
Enero-Abril: Tópicos Selectos de HPC II
Mayo-Agosto: Tópicos Selectos de HPC III
Septiembre-Diciembre: Tópicos Selectos de HPC I, Sistemas Telefónicos de Comunicación
Enero-Abril: Tópicos Selectos de HPC II
Mayo-Agostol: Tópicos Selectos de HPC III
Septiembre-Diciembre: Tópicos Selectos de HPC I, Sistemas Telefónicos de Comunicación
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
I. INTRODUCCIÓN
I.1 ARQUITECTURAS PARALELAS
ORGANIZACION DE COMPUTADORAS PARALELAS
I.2 CICLO DE INSTRUCCION
I.3 PARALELIZACION LLVM
I.4 ARQUITECTURAS MUTICORE
I.5 ARQUITECTURAS MANYCORE

II: CONCEPTOS DE SISTEMAS OPERATIVOS
II.1 PROCESOS Y CALENDARIZADORES
II.2 MECANISMOS DE COMUNICACION
II.3 SISTEMAS DE ARCHIVOS
II.4 CONCURRECIA, MULTIHILOS Y PARALELISMO
II.5 MODELOS DE PROGRAMACION

III. PROGRAMACION MULTICORE
III.1 PROGRAMACION CON PTHREADS
III.2 PROGRAMACION CON OPENMP

IV. DISEÑO DE PROGRAMAS PARALELOS
IV.1. METODOLOGIA DE IAN FOSTER.
IV.1. PATRONES PARA PROGRAMACION PARALELA
V. ANALISIS Y RENDIMIENTO DE PROGRAMAS PARALELOS
V.1 TIEMPO, ACELERACION Y EFICIENCIA DE PROGRAMAS PARALELOS
V.2 LEY DE AMDAHL Y SUS EXTENSIONES
V.3 LEY DE GUSTAFSON-BARSIS Y METRICA KARP-FLAPP
V.4 ANALISIS DE CONSUMO DE ENERGIA

VI. CUDA
VI.1 TARJETAS ACELERADORAS GRAFICAS Y CUDA
VI.2 HERRAMIENAS DE PROGRAMACION
VI.3 ESTRUCTURA DE PROGRAMA CUDA
VI.4 BLOQUES E HILOS
VI.5 MANEJO DE DATOS MULTIDIMENSIONALES
VI.6 MANEJO DE MEMORIA Y REDUCCION
VI.8 ESTRATEGIAS DE OPTIMIZACION
VI.9 EXTENSIONES A MULTIPLES TARJETAS DE VIDEO


Bibliografía:
[1] Dongarra, Jack, et al. Sourcebook of parallel computing. Vol. 3003. San Francisco: Morgan Kaufmann Publishers, 2003.
[2] Armstrong, Joe. Programming Erlang: software for a concurrent world. Pragmatic bookshelf, 2013.
[3] Mattson, Timothy G., Beverly Sanders, and Berna Massingill. Patterns for parallel programming. Pearson Education, 2004.
[4] Andrews, Gregory R. Foundations of multithreaded, parallel, and distributed programming. Vol. 11. Reading: Addison-Wesley, 2000.
[5] Quinn, J. Michael. Parallel Programming in C with MPI and OpenMP. McGraw Hill. 2004.
[6] Cook, Shane. CUDA programming: a developer's guide to parallel computing with GPUs. Newnes, 2012.
[7] Sanders, J. CUDA by example: an introduction to general-purpose GPU programming. Addison-Wesley Professional. 2010.
[8] [14] Pllana, Sabri and Xhafa, F. Programming multi-core and many-core computing systems. Wiley. 2017.
I. SISTEMAS DISTRIBUIDOS
I.1 INTRODUCCION
I.2 ALGORITMOS DISTRIBUIDOS
I.3 TIEMPO LOGICO
I.4 SINCRONIZACION
I.5 TRANSACCIONES
I.6 DETECCION DE FIN-EJECUCION

II. MIDDLEWARES
II.1 INTRODUCCION
II.2 DISEÑO BASADO EN MIDDLEWARES
II.3 ARQUITECTURAS
II.4 DISEÑO DE API's PARA MIDDLEWARES
II.5 CASOS CORBA y MPI

III. CORBA
III.1 CONCEPTOS Y ELEMENTOS DELESTANDAR DE CORBA
III.2 EL IDL
III.3 EL SISTEMA DE TIEMPO DE EJECUCION ORB
III.4 OBJETOS REMOTOS

IV. PROGRAMACION MPI
IV.1 MODELO DE PROGRAMACION CON PASO DE MENSAJES
IV.2 TIPOS DE COMUNICACION
IV.3 MANEJO DE DATOS

V. PROGRAMACION PARALELA HIBRIDA-HETEROGENEA
V.1 INTRODUCCION
V.2 DISEÑO DE PROGRAMAS
V.3 PROGRAMACION PARALELA HIBRIDA CON MPI Y OPENMP
V.4 PROGRAMACION CON OPENMP Y CUDA
V.5 PROGRAMACION DISTRIBUIDA Y HETEROGENEA CON MPI Y CUDA
V.6 PROGRAMACION HIBRIDA.HETEROGENEA CON MPI, OPENMP Y CUDA



Bibliografía:
[1] Tanenbaum, Andrew S., and Maarten Van Steen. Distributed systems: principles and paradigms. Prentice-Hall, 2007.
[2] Andrews, Gregory R. Foundations of multithreaded, parallel, and distributed programming. Vol. 11. Reading: Addison-Wesley, 2000.
[3] Buyya, Rajkumar, James Broberg, and Andrzej M. Goscinski, eds. Cloud computing: Principles and paradigms. Vol. 87. John Wiley & Sons, 2010.
[4] Verissimo, Paulo, and Luis Rodrigues. Distributed systems for system architects. Vol. 1. Springer Science & Business Media, 2012.
[5] Cerami, Ethan. Web services essentials: distributed applications with XML-RPC, SOAP, UDDI & WSDL. O'Reilly Media, Inc., 2002.
[6] Laurent, Simon St, et al. Programming Web Services with XML-RPC: Creating Web Application Gateways. O'Reilly Media, Inc., 2001.
[7] Etzkorn, Letha Hughes. Introduction to Middleware: Web Services, Object Components, and Cloud Computing. CRC Press, 2017.
[8] Britton, Chris, and Peter Bye. IT architectures and middleware: strategies for building large, integrated systems. Pearson Education, 2004.
[9] Quinn, J. Michael. Parallel Programming in C with MPI and OpenMP. McGraw Hill. 2004.
Contenido:
I. DISEÑO DE HERRAMIENTAS PARA SISTEMAS DISTRIBUIDOS
I.1 PATRONES DE MIDDLEWARES
I.2 ARQUITECTURAS DE CLOUD COMPUTING
I.3 ARQUITECRURAS DE GRID COMPUTING
I.4 INFRAESTRUCTURA COMO SERVICIOS

II. HERRAMIENTAS PARA BIG DATA
II.1 HADOOP
II.2 STORM
II.3 SPARK
II.4 CASSANDRA

III. HERRAMIENTAS DE SOPORTE PARA HPC
III.1 PROGRAMACION ORIENTADA A TAREAS
III.2 HERRAMIENTAS PARA SISTEMAS HIBRIDOS HETEROGENEO
III.3 DESPACHADORES PARA SISTEMAS HETEREGOENEOS
III.4 MANEJADORES DE COLAS
III.5 SISTEMAS DE ARCHIVOS PARALELOS

IV. COMPUTACION VERDE
IV.1 INSTRODUCCION Y
IV.1 INSFRAESTRUCTURAS DE COMPUTO: CENTROS DE DATOS Y SUPERCOMPUTO
IV.2 INDICADORES DE ENERGIA EN SERVIDORES
IV.3 INDICADORES DE ENERGIA PARA CENTRO DE DATOS
IV.4 INDICADORES DE ENERGIA PARA CENTROS DE SUPERCOMPUTO


Bibliografía:
[1] Buyya, Rajkumar, James Broberg, and Andrzej M. Goscinski, eds. Cloud computing: Principles and paradigms. Vol. 87. John Wiley & Sons, 2010.
[2] Tanenbaum, Andrew S., and Maarten Van Steen. Distributed systems: principles and paradigms. Prentice-Hall, 2007.
[3] Verissimo, Paulo, and Luis Rodrigues. Distributed systems for system architects. Vol. 1. Springer Science & Business Media, 2012.
[4] Cerami, Ethan. Web services essentials: distributed applications with XML-RPC, SOAP, UDDI & WSDL. O'Reilly Media, Inc., 2002.
[5] Laurent, Simon St, et al. Programming Web Services with XML-RPC: Creating Web Application Gateways. O'Reilly Media, Inc., 2001.
[6] Britton, Chris, and Peter Bye. IT architectures and middleware: strategies for building large, integrated systems. Pearson Education, 2004.
[7] Dulhare, Uma N., Khaleel Ahmad, and Khairol Amali Bin Ahmad, eds. Machine Learning and Big Data: Concepts, Algorithms, Tools and Applications. John Wiley & Sons, 2020.
[8] Salloum, Salman, et al. Big data analytics on Apache Spark. International Journal of Data Science and Analytics 1.3-4 (2016): 145-164.
[9] Iqbal, Muhammad Hussain, and Tariq Rahim Soomro. Big data analysis: Apache storm perspective. International journal of computer trends and technology 19.1 (2015): 9-14.
[10] Jain, Ankit, and Anand Nalya. Learning storm. Packt Publishing, 2014.
[9] Shoro, Abdul Ghaffar, and Tariq Rahim Soomro. Big data analysis: Apache spark perspective. Global Journal of Computer Science and Technology (2015).
[10] Karau, Holden, and Rachel Warren. High performance Spark: best practices for scaling and optimizing Apache Spark. O'Reilly Media, Inc., 2017.
[11] Chebotko, Artem, Andrey Kashlev, and Shiyong Lu. A big data modeling methodology for Apache Cassandra. 2015 IEEE International Congress on Big Data. IEEE, 2015.
[12] Reese, George. Cloud application architectures: building applications and infrastructure in the cloud. O'Reilly Media, Inc., 2009.
[13] Quintero, Dino, et al. Implementing the IBM General Parallel File System (GPFS) in a Cross Platform Environment. IBM Redbooks, 2011.
[14] Pllana, Sabri and Xhafa, F. Programming multi-core and many-core computing systems. Wiley. 2017.
[15] Hu, Wen-Chen, ed. Sustainable ICTs and management systems for green computing. IGI Global, 2012.
[16] Smith, Bud E. Green Computing: Tools and Techniques for Saving Energy, Money, and Resources. CRC Press, 2013.
[17] Feng, Wu-chun, ed. The Green Computing Book: Tackling Energy Efficiency at Large Scale. CRC Press, 2014.
[18] Khosrow-Pur, M. Green Computing Strategies for Competitive Advantage and Business Sustainability (Advances in Systems Analysis, Software Engineering, and High Performance Computing).
Cinvestav-IPN, Departamento de Computación
ameneses@cs.cinvestav.mx
Tel: (+ 52) 5557473800 ext 6551