[en] This project, as the title suggests, focuses on the optimization and parallelization of a seismic simulator using multi-core architectures. Begining with the study of the model all the necessary mathematic equation are showed, including the reasons of the usage of the SSG data structure (that gives the name of the H-MSSG algorithm, running the simulator). This simulator is implemented into two different hardware architectures: A first architecture, base on an Intel's x86 CPU and a second one, based on NVIDIA's GPU. From a sequential code, an initial version of the simulator is made using software optimizations. Two of the main points of improvement are the changes in the data structures of the simulator as well as improved memory accesses using different techniques. Then, the simulation time is reduced using jump and branches and loop reduction techniques. Taking advantage of the CPU multimedia instructions (SIMD), a second revision of the simulator is made using this technology. Finally, this previous code is paralelized using OpenMP interface. From the sequential code, and using the CUDA technology present on NVIDIA's graphics cards (GPU's), both the GPU and CUDA arquitecture are studied in order to create a new simulator code. As the last step, the OpenACC programming interface is used to generate an executable that supports the GPU using the same sequential code. At the end of each section, the performance is analized using several metrics (time and SpeedUp) and the precision of the results is checked.

[es] Este proyecto, tal como el título indica, se centra en la optimización y paralelización de un simulador sísmico en arquitecturas multinúcleo. A partir de las formulas matemáticas necesarias, se presenta el modelo y se razona el porqué del uso de la estructura de datos SSG (que da parte del nombre al algoritmo H-MSSG que ejecuta el simulador). Este simulador es implementado a dos arquitecturas hardware diferentes: La primera arquitectura és una CPU basada en x86 de Intel y la segona una GPU de la mano de NVIDIA. A partir de un código secuencial y utilizando optimizaciones software se realiza una primera versión. Como principales puntos a destacar, se encuentra un cambio en la estructura de datos del simulador i la mejora de los accesos a memoria utilizando diferentes técnicas sofware. A continuación se incrementa el rendimiento secuencial del simulador mediante técnicas de reducción del numero de saltos. Aprovechando los recursos y las nuevas instrucciones multimedia (SIMD) disponibles en el procesador, se implementa una version del simulador aprovechando esta tecnología. Finalmente, se paraleliza el código anterior utilizando la interfaz de programacion OpenMP. A partir del código secuencial y mediante la tecnología CUDA presente en las tarjetas gráficas (GPU's) de NVIDIA, se estudia con detalle la arquitectura para implementar una nueva version del codigo utilizando esta tecnologia. Ya como último paso, se utiliza la interfaz de programación OpenACC, para generar un ejecutable compatible con la GPU utilizando el mismo código secuencial. En cada apartado se analiza el rendimiento utilitzando diferentes metricas (tiempos y/o SpeedUp) y se comprueban los resultados numèricos obtenidos.