relatÓrio de graduaÇÃo em geofÍsica · “a melhor coisa a fazer quando se está triste é...
TRANSCRIPT
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE CIÊNCIAS EXATAS E DA TERRA CURSO DE GRADUAÇÃO EM GEOFÍSICA
RELATÓRIO DE GRADUAÇÃO EM GEOFÍSICA
ANÁLISE DA MIGRAÇÃO REVERSA NO TEMPO EM
ARQUITETURAS PARALELAS
Autor: Daniel Araújo de Medeiros
Orientador: João Medeiros de Araújo
Relatório N 37
Natal/RN Dezembro de 2013
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE
CENTRO DE CIÊNCIAS EXATAS E DA TERRA CURSO DE GRADUAÇÃO EM GEOFÍSICA
ANÁLISE DA MIGRAÇÃO REVERSA NO TEMPO EM
ARQUITETURAS PARALELAS
POR
Daniel Araújo de Medeiros
Relatório N 37
Comissão examinadora:
______________________ Dr. João Medeiros de Araújo (DFTE/UFRN) – Orientador
______________________ Dr. Madras Viswanathan Gandhi Mohan (DFTE/UFRN)
______________________ MSc. Heron Antônio Schots (CPGeo)
Data da aprovação: __________
“A melhor coisa a fazer quando se está triste é aprender algo.
Essa é a única coisa que nunca falha. Você pode ficar velho e trêmulo em sua
anatomia, pode passar a noite acordado escutando a desordem de suas veias, pode
sentir saudades de seu único amor, pode ver o mundo a seu redor ser devastado por
lunáticos malvados ou saber que sua honra foi pisoteada no esgoto das mentes
baixas. Só há uma coisa para isso: aprender. Aprender por que o mundo gira e o que
o faz girar. Essa é a única coisa da qual a mente não pode jamais se cansar, nem se
alienar, nem se torturar, nem temer ou descrer, e nunca sonhar em se arrepender.
Aprender é o que lhe resta.”
Mago Merlin para um futuro Rei Arthur.
T.H. White, “A Espada na Pedra”.
UFRN/CCET– Relatório de Graduação em Geofísica Agradecimentos
Agradecimentos
Existem inúmeras maneiras as quais se pode agradecer a alguém por
qualquer contribuição no seu crescimento intelectual, e até mesmo humano, durante
um curso de graduação. Citar tais pessoas em um trabalho de conclusão de curso,
definitivamente, não é a maneira mais apropriada – mas seguem-se aqui aquelas
pessoas que considero como sendo as mais importantes ao longo de minha vida
acadêmica.
Primeiramente à minha família, o que inclui principalmente meus pais (Hild e
Ana), além de minha irmã mais nova (Maria Clara) e meu irmão mais velho (Bruno).
É desnecessário dizer o porquê deste agradecimento, já que sem a família, não se
consegue ir a lugar algum. O apoio deles foi fundamental em qualquer coisa que eu
tenha feito – por mais impulsiva que tenha sido, sempre recebi algo como um
“estamos sempre ao seu lado, independente de sua decisão”. Caso algum tio, tia,
avô, avó, primo, prima ou qualquer pessoa relacionada por sangue à minha pessoa
ler este trabalho de conclusão de curso, o que não deve acontecer, sinta-se incluído
nesta categoria – e incluo aqui também meus dois amigos de infância que considero
como meus irmãos, Mateus Alves e Breno Sabino.
Meu segundo agradecimento segue para um grupo de pessoas que, ao longo
de quase sete anos, se tornaram parte essencial de mim também, antes mesmo de
eu entrar na universidade. Estas pessoas, que conheci na internet, sempre me
“aturaram” por mais impossível ou nervoso que eu estivesse, e sempre estão juntas
comigo para me dar conselhos ou fazer alguma besteira que possa gerar risadas,
desde procurar falhas em websites até ficar discutindo coisas totalmente irrelevantes
para a humanidade ou, simplesmente, nossas vidas. Essas pessoas me viram
entrando na faculdade, como também estão me vendo sair dela. Por isso, referindo-
me aos membros diretos e indiretos do grupo morningspeed, gostaria de citar os
amigos Artur Moura, Cainã Costa, Éberson Polita, Edmilson Júnior, Ernesto Kado,
Fabrício Webber, George Wesley, Giuseppe Angeli, Gustavo Bennemann, Gustavo
Hoffmann, Gustavo José, Jacques Szmelcynger, Johannes Lochter, Leandro
Menezes, Renato Schmidt, Rodrigo Nonose e Tiago Scaranelo.
Medeiros, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Agradecimentos
página ii
Podemos seguir para as pessoas da universidade agora, falando sempre das
que, junto a mim, enfrentaram os “trancos e barrancos” ao longo dos quatro anos de
curso. Devo meus maiores cumprimentos aos amigos Adler Araújo, Arthur Messias e
Diego Galdino (este último resolveu perseguir seus sonhos e virar um Engenheiro
Civil) por sempre matarem comigo aquelas aulas tediosamente chatas de Cálculo e
renderem bons momentos de risadas, além de pagarem meus almoços no
Restaurante Universitário ou na cantina, já que eu quase sempre andava (e ando,
até hoje!) sem dinheiro na carteira. Ao Yago Medeiros, Querzia Soares, Pedro
Augusto, Carlos Fernandes e Rener Antônio (vulgo Caicó) por sempre discutirem
comigo sempre que estou na iminência de fazer besteiras e, de certa forma,
acabarem me convencendo a desistir de certas ideias. Também não posso me
esquecer de pessoas como Amanda Barbosa, Bruno Vasconcelos, Camila Medeiros,
Dário Guedes, Giankarlo Rocha, Igor Galvão, Jerbeson Santana, Joilderson de
Paula, Juliana Alves, Humberto Mendes, Maria Denize, Naira Freire, Rosana
Nascimento e Sofia Coelho que quase sempre tinham algo para compartilhar
referente às disciplinas ou, simplesmente, me contavam boas histórias durante os
intervalos no departamento de Geofísica ou Setor III.
Existem também aquelas pessoas que já estavam na universidade antes de
mim, e que tive o grande prazer de conhecer, em especial em meio às dificuldades
das disciplinas de Geofísica Matemática (que estava mais para “Geofísica
Problemática”) e Geodinâmica; em especial com ideias que podem ser consideradas
no mínimo excepcionais para o estudo conjunto destas disciplinas. Cito aqui: Átila
Torres, Arthur Gerard, Eliebe Matias, Isaac Vinícius, João Paulo Ferreira, Marcus
Magnum, Ricardo Tenório, Rodrigo Revoredo e Tiago Rafael.
Já que falei das pessoas que chegaram antes de mim, não posso esquecer-
me das grandes amizades que fiz com as pessoas de entrada posterior à minha na
UFRN. Elas foram indispensáveis para que eu olhasse novamente o mundo com um
misto de seriedade e ingenuidade, virtudes as quais acabaram sendo esquecidas no
decorrer de determinadas experiências. E é bastante importante lembrar de amigos
como o Douglas Marcondes, Klinger Cruz e Yago Martins, pelas saídas a rodízios
após uma ida a academia e com comilanças até passarmos mal, além do Oscar
Neto com a Aline Tavares, Isabella Gama e a Thayane Samara, que me
acompanharam todo o tempo durante o 13º Congresso Internacional da Sociedade
Brasileira de Geofísica no Rio de Janeiro. Agradeço aos valorosos conselhos da
Medeiros, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Agradecimentos
página iii
Victória Cedraz, que foram extremamente úteis em determinados momentos, além
do Diego Soares e da Sabrina Luz por sempre trocarem boas ideias comigo quando
nos encontramos. Também é interessante citar os companheiros Bruno Araújo,
David Wendell, Danyelle Cristiny, Flávia Valânea, Gilsijane Vieira, Jefferson Moura,
Mara Cristina, Maria Luíza Cardoso, Mariana Mamede e Raphael Carvalho que,
durante o decorrer destes longos (ou curtos, em uma perspectiva geológica) quatro
anos, se tornaram companhias indispensáveis.
Agradeço também aos mentores durante o curso. Inicialmente, os externos ao
meu departamento, sendo do Departamento de Computação e Automação da
UFRN: Paulo Motta, pelo exemplo de pessoa que ele é, e Diogo Pedrosa, por ter me
concedido meu primeiro projeto de Iniciação Científica quando me veio à cabeça a
ideia de mudar de curso para Engenharia Elétrica – que não deu muito certo, mas
sou extremamente feliz por este fracasso. Ao professor Marcos Nascimento, do
Departamento de Geologia da UFRN, por me dar uma perspectiva um pouco
diferente sobre o uso da geologia, uma vez que eu não era (e continuo sem ser) fã
da mesma. Em seguida, aos internos do departamento de Geofísica: Carlos César
Nascimento da Silva, pelas tentativas incansáveis de injetar um pouco de juízo na
minha cabeça (apesar de que admito me divertir com as reações dele, mesmo indo
um pouco longe demais vez por outra) e pelos incríveis conselhos que me fez tomar
sábias decisões em determinadas horas complicadas da minha trajetória acadêmica,
e que me fizeram, mesmo sem nunca ter explicitado isso diretamente, ser bastante
grato ao mesmo. Ao José Antônio de Morais Moreira por mostrar que a persistência
sempre tem um retorno no final, principalmente nas disciplinas que ministrou.
Também agradeço aos professores Aderson do Nascimento, Jordi Julià, Josibel
Gomes e Walter Medeiros por passarem (muito bem) seus conhecimentos em sala
de aula. Um agradecimento em especial à professora Rosângela Correa Maciel por
realmente me dar uma chance e ter acreditado em mim desde o início, onde sem tal
apoio não teria conseguido absolutamente nada do que consegui hoje e, por isso,
sou extremamente grato a ela. Aos funcionários do departamento Mateus Carlos,
Otto Araújo e Taynara Souza por me deixarem invadir a secretaria e passar o tempo
vago por lá trocando ideias enquanto não havia nada para fazer. À Huganisa Dantas
que, apesar de não deixar fazer o mesmo que os outros secretários, ela me ajudou
bastante sempre que precisei perturbar com assuntos como a colação de grau
individual ou meus processos de dispensa de disciplina.
Medeiros, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Agradecimentos
página iv
Agradeço também ao meu orientador, João Medeiros de Araújo, por
realmente TUDO que aconteceu durante o ano de 2013 – e ressalto que foram
somente coisas boas – e gostaria de deixar registrado que palavras são insuficientes
para expressar o quão sou grato a ele. Um obrigado também à banca de avaliação
deste trabalho, composta pelo Madras Gandhi e pelo Heron Schots, por aceitarem
avaliá-lo (e espero que o apreciem).
Por fim, gostaria de citar o apoio financeiro do Centro Potiguar de
Geociências pelo ano de 2013 e, também, da Agência Nacional de Petróleo, Gás
Natural e Biocombustível em conjunto com a Financiadora de Estudos e Projetos e o
Ministério de Ciência e Tecnologia por meio do Programa de Recursos Humanos 22
referente ao ano de 2012. Algumas partes do trabalho foram realizadas com a ajuda
do supercomputador do Instituto Internacional de Física e do sistema distribuído do
Programa de Pós-graduação em Ciências Climáticas.
É isso. That’s it. Ijou desu.
UFRN/CCET– Relatório de Graduação em Geofísica Resumo
Resumo
A Migração Reversa no Tempo é um processo que consiste na relocalização
de eventos para onde de fato eles ocorreram. Este processo está começando a ser
bastante recorrente na indústria do petróleo graças à sua grande capacidade de
imagear locais de alta complexidade geológica e estrutural, tais como regiões em
que existam falhas ou que exista uma grande variação no gradiente de velocidades,
muitas vezes associada à presença de domos salinos. Contudo, tal poder em
resolução lateral e horizontal possui a grande desvantagem do alto custo
computacional devido à sua intensividade de cálculos advindos pela resolução da
equação de onda através do uso do método de diferenças finitas e das condições de
contorno comumente impostas. Desta forma, na busca de uma maior eficiência
computacional, alternativas como computação paralela e distribuída, juntamente
com a implementação de algoritmos em outras arquiteturas computacionais – como
x86_64 e GPU – começaram a surgir, visando sempre diminuir ao máximo o tempo
de execução dos algoritmos. Sendo assim, este trabalho propõe uma abordagem
comparativa das arquiteturas e paradigmas acima citados de forma a verificar quais
são as alternativas mais interessantes e viáveis a serem utilizadas e, por fim, discutir
os diversos desafios aos quais a indústria do petróleo deve enfrentar para conseguir
resultados ainda melhores.
Palavras-chave: Processamento sísmico, Migração Reversa no Tempo,
computação de alta performance, GPU.
UFRN/CCET – Relatório de Graduação em Geofísica Abstract
Abstract
The Reverse Time Migration is a process which relocates events to where
they did de-facto occur. This process is beginning to be very recurrent at the oil
industry due to its great capability of imaging high-complexity places with either
structural or geological features, such as places where faults occurrences can be
observed or regions where a great velocity gradient exists, which is usually
associated to salt domes. However, such powerful horizontal and vertical resolutions
have the big drawback of the high-computational cost due to the algorithm being very
calculus-intensive which is a result from the solution of the wave equation through
the finite differences method plus the boundary conditions that were imposed. Hence,
in the search for a computational efficiency increase, options like parallel/distributed
computing alongside the implementation of algorithms in others computational
architectures such as x86_64 and GPUs, began to arise and try to low the
computational runtime at maximum. Thus, this work tries to propose a comparative
approach of the above cited architectures and paradigms in order to verify which
ones are the most interesting and viable. By the end of the work, it’s noticed that
there are challenges to be perceived by the oil industry in order to improve results
even more.
Key-words: Seismic processing, Reverse Time Migration, high-performance
computing, GPU.
UFRN/CCET– Relatório de Graduação em Geofísica Índice
Índice
Agradecimentos . pág. i
Resumo pág. v
Abstract pág. vi
Lista de Figuras pág. ix
Lista de Algoritmos, Equações e Tabelas pág. xi
Lista de Abreviações pág. xii
Capítulo I – Introdução
1.1 – Um breve histórico pág. 01
1.2 – Motivação e Objetivos pág. 04
1.3 – Estrutura do Trabalho de Conclusão de Curso pág. 04
1.4 – Direitos Autorais pág. 05
Capítulo II – Sísmica Aplicada à Prospecção de Petróleo
2.1 – Por que sísmica, afinal? pág. 06
2.2 – Fundamentos da Técnica CDP pág. 08
2.3 – Análise de Dados Reais e Sintéticos; Softwares pág. 09
2.4 – Processamento Sísmico pág. 11
2.4.1 – Uma tentativa de fluxograma pág. 11
2.4.2 – Setup pág. 12
2.4.3 – Correções Estáticas pág. 13
2.4.4 – Análise de Velocidade e Correção NMO pág. 14
2.4.5 – Filtro de Frequência pág. 15
2.4.6 – Deconvolução e o Modelo Convolucional pág. 16
2.4.7 – Correção dos Fatores de Propagação pág. 19
2.4.8 – Migração pág. 20
2.4.9 – Empilhamento pág. 22
2.5 – Controle de Qualidade pág. 22
2.6 – Interpretação pág. 23
Medeiros, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Índice
página ix
Capítulo III – Migração Reversa no Tempo pág. 24
Capítulo IV – Arquiteturas de Computadores
4.1 – O modelo de um computador pág. 31
4.2 – Arquiteturas x86 e x86_64 pág. 34
4.3 – Unidade de Processamento Gráfico pág. 35
4.5 – Outras Arquiteturas pág. 38
Capítulo V – Paralelismo Aplicado
5.1 – A Geofísica e a Computação de Alta Performance pág. 39
5.2 – Fundamentos de Computação Paralela pág. 40
5.2.1 – Tasks e Threads pág. 40
5.2.2 – Condições de Corrida pág. 41
5.2.3 – Métricas pág. 42
5.3 – Bibliotecas Paralelas pág. 44
5.3.1 – OpenMP / OpenACC pág. 44
5.3.2 – Message-Parsing Interface pág. 45
5.3.3 – Computer Unified Device Architecture pág. 46
Capítulo VI – Performance de um Algoritmo de Migração Reversa no
Tempo a partir de Computação Distribuída e Paralela
6.1 – Medindo Tempos pág. 47
6.2 – Modelo e Parametrização pág. 48
6.3 – Condições de Processamento pág. 49
6.4 – Registros de Desempenhos pág. 50
6.4.1 – x86_64 single-core pág. 50
6.4.2 – x86_64 paralelizado em OpenMP pág. 52
6.4.3 – Tarefas Distribuídas pág. 55
6.4.4 – GPUs pág. 58
Capítulo VII – Análise dos Resultados Obtidos pág. 61
Capítulo VIII – Desafios pág. 73
Capítulo IX – Referências Bibliográficas pág. 75
UFRN/CCET – Relatório de Graduação em Geofísica Lista de Figuras
Lista de Figuras
Figura 1.1 – Diagrama de distribuição de tarefas no esquema master-slave. pág. 02
Figura 1.2 – Diagrama de dificuldade de implementação em variadas arquiteturas. pág. 03
Figura 2.1 – Diagrama de relação entre as cadeias de processos na sísmica. pág. 07
Figura 2.2 – Exemplo esquemático de uma aquisição sísmica . pág. 08
Figura 2.3 – Comparação entre CMP e CDP . pág. 09
Figura 2.4 – Modelo de velocidades do Marmousi. pág. 10
Figura 2.5 – Fluxograma básico para dados terrestres e de geologia complexa. pág. 11
Figura 2.6 – Estrutura computacional do SEG-Y. pág. 12
Figura 2.7 – Dado sísmico no domínio da CMP antes e depois da correção NMO. pág. 14
Figura 2.8 – Análise de velocidade pelo método de semblance no Seismic Unix. pág. 15
Figura 2.9 – Modelo convolucional simplificado. pág. 17
Figura 2.10 – Deconvolução através de um filtro Wiener-Levinson. pág. 18
Figura 2.11 – Função Ricker. pág. 18
Figura 2.12 – Correção da Divergência Esférica. pág. 19
Figura 2.13 – Gráfico de indicação para tipos de migração. pág. 20
Figura 2.14 – Modelo Marmousi suavizado migrado em profundidade. pág. 21
Figura 2.15 – Diferentes tipos de empilhamento em comparação. pág. 22
Figura 3.1 – Algoritmo RTM para diversos tiros. pág. 25
Figura 3.2 – Correlação de Imagem. pág. 27
Figura 3.3 – Fluxograma operacional da Migração Reversa no Tempo pág. 29
Figura 4.1 – Arquitetura de von Neumann e a relação entre componentes. pág. 32
Figura 4.2 – Processador Intel 8086. pág. 34
Figura 4.3 – Relação de recursos de GPU ao longo dos anos. pág. 36
Figura 4.4 – Arquitetura de uma GPU. pág. 37
Figura 4.5 – Relação de grids, blocos e threads em uma GPU. pág. 37
Figura 5.1 – Algoritmo de matriz. pág. 40
Figura 5.2 – Gráfico da Lei de Amdahl. pág. 43
Figura 5.3 – Modelo de execução do OpenMP. pág. 45
Figura 5.4 – Modelo de execução do MPI. pág. 46
Figura 6.1 – Fluxograma de medidas dos tempos do algoritmo RTM. pág. 47
Figura 6.2 – Modelo utilizado para a simulação RTM. pág. 49
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET – Relatório de Graduação em Geofísica Lista de Figuras
página x
Figura 6.3 – Imageamento do algoritmo RTM em single-core. pág. 51
Figura 6.4 – Imageamento do algoritmo RTM utilizando 4 threads. pág. 54
Figura 6.5 – Alguns tiros diretos simulados pelo algoritmo RTM em MPI. pág. 57
Figura 6.6 – Imagem final da migração por uma GPU. pág. 60
Figura 7.1 – Gráfico de Speedup por Threads para a implementação do OpenMP pág. 61
Figura 7.2 – Gráfico de Speedups obtidos com o uso de MPI pág. 67
Figura 7.3 – Tempo por processo da propagação direta do campo de ondas pág. 67
Figura 7.4 – Tempo por processo da propagação inversa do campo de ondas pág. 68
Figura 7.5 – Modelo esquemático de um grid CUDA pág. 70
Figura 7.6 – Gráfico comparativo de speedups obtidos em cada tipo de paralelização pág. 72
Figura 8.1 – Nível computacional exigido por diferentes algoritmos de migração pág. 73
UFRN/CCET– Relatório de Graduação em Geofísica Lista de Abreviações
Lista de Abreviações
Abaixo, a lista de abreviações utilizadas durante o decorrer do trabalho. A
tradução para o português encontra-se sempre que o termo está consagrado na
língua em questão.
AMD - Advanced Micro Devices
ARM - Advanced RISC Machines
APU - Accelerated Processing Unit
AVO - Amplitude versus Offset
ASIC - Application Specific Integrated Circuit
CDP - Common Dip Point (Ponto Médio em Profundidade)
CMP - Common Mid-Point (Ponto Médio Comum)
CGG - Compagnie Générale de Géophysique
CISC - Complex Instruction Set Computer
CPU - Central Processing Unit (Unidade de Processamento Central)
CRP - Common Receiver Point
CRS - Common Reflection Surface
CUDA - Computer Unified Device Architecture
CPGeo - Centro Potiguar de Geociências
DGPS - Diferential Global Positioning System (Sistema de Posicionamento Global Diferencial)
DMO - Dip Move-out
EBCDIC - Extended Binary Coded Decimal Interchange Code
ENIAC - Eletronic Numerical Integrator and Calculator
(f-k) - Domínio da frequência-número de onda
FBI - Frame buffer Interface
FFT - Fast Fourier Transform (Transformada Rápida de Fourier)
FPGA - Field-programmable Gate Array
FWI - Full Waveform Inversion (Inversão da Forma de Onda)
GCC - GNU Compiler Collection
GPGPU - General Purpose Graphics Processing Unit
GPL - General Public Licence
GPU - Graphics Processing Unit (Unidade de Processamento Gráfico)
HD - Hard-disk (Disco Rígido)
IBM - International Business Machine
Medeiros, D.A. Relatório No. 37 dezembro/2013
página xiii
IEEE - Instituto de Engenheiros Eletrônicos e Elétricos
IIF - Instituto Internacional de Física
INPE - Instituto Nacional de Pesquisas Espaciais
LSI - Large Scale Integration
MP - Memória Primária
MPI - Message-Parsing Interface
MSI - Medium Scale Integration
NMO - Normal Move-out (Sobretempo Normal)
NVCC - NVIDIA C Compiler
OpenCL - Open Computing Language
OpenMP - Open Multi-Processing
PSPI - Phase Shift Plus Interpolation
RISC - Reduced Instruction Set Computer
RAM - Random Access Memory (Memória de Acesso Aleatório)
ROP - Raster Operation
RTM - Reverse Time Migration (Migração Reversa no Tempo)
SDK - Software Development Kit
SDM - Seismic Depth Migration (Migração Sísmica em Profundidade)
SO - Sistema Operacional
STM - Seismic Time Migration (Migração Sísmica em Tempo)
SSE - Streaming SIMD Extensions
SSI - Small Scale Integration
SU - Seismic Unix
(t-x) - Domínio do tempo-distância
ULA - Unidade Lógico-Aritmética
UC - Unidade de Controle
UES - Unidade de Entrada e Saída
UFRN - Universidade Federal do Rio Grande do Norte
VHDL - VHSIC Hardware Description Language
VHSIC - Very-high-speed Integrated Circuits
VLSI - Very Large Scale Integration
VS/T&L - Vertex shading transform and lightning
WE - Wave Equation (Equação da Onda)
WEM - Wave Equation Migration (Migração da Equação da Onda)
UFRN/CCET– Relatório de Graduação em Geofísica Lista de Algoritmos, Equações e Tabelas
Lista de Algoritmos, Equações e Tabelas
Algoritmo 5.1 – Calculador de produto escalar entre duas matrizes. pág. 41
Algoritmo 6.1 – Uso da biblioteca “time.h” para medir tempo. pág. 48
Algoritmo 7.1 – Convolução tridimensional. pág. 63
Algoritmo 7.2 – Distribuição de tarefas do MPI. pág. 66
Equação 3.1 – Equação Escalar de Onda. pág. 25
Equação 3.2 – Equação Escalar da Onda com uma Fonte. pág. 26
Equação 3.3 – Discretização da Equação de Onda. pág. 26
Equação 3.4 – Correlação contínua de Imagem Receptor-Fonte. pág. 27
Equação 3.5 – Correlação discreta de Imagem Receptor-Fonte. pág. 27
Equação 3.6 – Perfect Matched Boundary. pág. 28
Equação 5.1 – Formulação matemática do Speedup. pág. 42
Equação 5.2 – Formulação matemática da Lei de Amdahl. pág. 42
Equação 5.3 – Cálculo do Speedup máximo. pág. 43
Equação 5.4 – Eficiência computacional. pág. 43
Tabela 3.1 – Descrição dos processos existentes na imagem 3.3. pág. 30
Tabela 4.1 – História da computação. pág. 31
Tabela 6.1 – Configurações das máquinas do IIF. pág. 50
Tabela 6.2 – Configurações das máquinas do laboratório CoRoT. pág. 50
Tabela 6.3 – Tempo de processamento utilizando um único núcleo. pág. 51
Tabela 6.4 – Tempos de processamento da propagação direta em múltiplos núcleos. pág. 52
Tabela 6.5 – Tempos de processamento da propagação inversa em múltiplos núcleos. pág. 52
Tabela 6.6 – Tempos de processamento da correlação em múltiplos núcleos. pág. 53
Tabela 6.7 – Tempos de processamento de propagação direta em MPI. pág. 55
Tabela 6.8 – Tempos de processamento de propagação inversa em MPI. pág. 56
Tabela 6.9 – Configurações do sistema do device. pág. 58
Tabela 6.10 – Tempos relativos a execução do algoritmo RTM em uma GPU. pág. 59
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo I – Introdução
Capítulo I – Introdução
1.1 – Um breve histórico
Dentre os mais variados métodos de prospecção geofísica, a sísmica de reflexão
– método geofísico que tem como base a propagação da onda acústica em uma
determinada região - destaca-se na indústria do hidrocarboneto devido a sua boa
capacidade de imagear a subsuperfície. Entretanto, juntamente a tal acurácia, existe
um problema intrínseco: o tratamento dos dados do respectivo método é
particularmente custoso graças ao grande volume de informações exigido pelo
mesmo e do processamento relacionado que é minucioso e detalhado, o que quase
sempre está diretamente ligado a uma gama de cálculos matemáticos no domínio
discreto.
À medida que este nível de minuciosidade do processamento cresce, a
quantidade de informações extraídas de um determinado dado tende a seguir o
mesmo caminho. Nunes do Rosário (2012) cita o exemplo da empresa de
consultoria de processamento sísmico CGG (ex-CGGVeritas), a qual anunciou que
realizou testes de reprocessamentos do levantamento sísmico 3D realizados nos
anos de 2001 e 2002 no mega-campo de Tupi, na bacia de Santos, onde houve um
aumento expressivo da qualidade da imagem do reservatório abaixo da camada de
sal e que, baseado neste sucesso, a empresa está reprocessando todos os dados
de tal levantamento que exibem os reservatórios de hidrocarbonetos no pré-sal
brasileiro a uma profundidade de 8.000 metros da superfície. Esta realização por
parte da empresa acima citada acaba por estimular mais e mais pesquisas na área
de forma a aumentar a quantidade de informação extraída do mesmo dado.
Entretanto, o fator tempo também é fundamental para a indústria e, com o
consequente aumento da carga computacional dos algoritmos utilizados, o tempo de
processamento acaba por se elevar de alguma maneira. Desta forma, a indústria
procurou, e ainda procura, alternativas que possam minimizar o tempo de execução
(runtime) dos algoritmos executados. Citando não só a indústria da sísmica, mas a
de computação de alto desempenho ao todo, uma abordagem tradicional para a
resolução deste problema foi o aumento da frequência do processador. Tal
abordagem, entretanto, falhou, visto que os mesmos tendiam a dissipar mais energia
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo I – Introdução
página 2
e, consequentemente, superaquecer e derreter. A tentativa seguinte pela indústria
foi a introdução de múltiplos núcleos de processamento, abordagem que ainda é
utilizada nos dias de hoje e que introduziu o paradigma de programação paralela;
desta forma, muitos problemas matemáticos estão sendo modelados para fazer uso
destes recursos provenientes dos processadores, muitas vezes através dos padrões
OpenMP (acrônimo para Open Multi-Processing), OpenCL (Open Computing
Language) e do kit de desenvolvimento da NVIDIA, CUDA (Compute Unified Device
Architecture), dentre várias outras. Nos capítulos seguintes, cada paradigma será
discutido e analisado, mas é interessante explicitar que a implementação de um
determinado problema usando algum dos mesmos pode aumentar significativamente
a dificuldade de programação, mas também possibilitar uma diminuição imediata em
seu runtime.
Outra abordagem da programação paralela, porém em uma granularidade maior,
é a chamada programação distribuída, a qual consiste em diversos processadores
agrupados, podendo ter memórias e discos compartilhados ou não, onde são
delegadas tarefas que são realizadas por cada um independentemente para, depois,
concatenar-se todos os resultados em um só, conforme se pode observar no
diagrama da figura 1.1. O padrão MPI (Message Passing Interface) é o mais
utilizado na programação para tal finalidade, mas programadores com objetivos mais
diferenciados podem também recorrer ao uso do shell script, presente no Linux.
Figura 1.1: Diagrama de distribuição de tarefas no sistema master-slave (mestre-escravo) com
retroalimentação, onde o resultado processado pelos computadores escravos
irão ser reutilizados pelo mestre para outras finalidades ou não.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo I – Introdução
página 3
No workshop de Computação de Alto Desempenho do 13º Congresso
Internacional de Geofísica, ocorrido em 2013, foram bastante citadas duas
promissoras tecnologias: FPGAs e Co-processadores (através do Intel® Xeon
Phi™). Apesar de não se encontrarem dentro do escopo deste trabalho, vale
salientar que a primeira tecnologia é de difícil implementação devido a necessidade
de se lidar com um menor nível de abstração na programação, conforme mostrado
por Che et al. (2008), porém seus resultados iniciais são animadores, mostrando
uma eficiência maior que até mesmo as GPGPUs mais modernas. Já a segunda
tecnologia em questão trata de processadores tradicionais de alto desempenho e
que ficam latentes esperando ordens, onde também alcançam bons resultados. Um
diagrama de dificuldade de programação versus eficiência baseado no estudo
realizado por Che et al. (2008) para CPUs, GPUs e FPGAs pode ser visto abaixo.
Figura 1.2: Diagrama de dificuldade de implementação em determinada
arquitetura pela performance obtida. Gerado a partir de Che et al. (2008).
Saindo da computação e tratando de sísmica, o processo de migração é um dos
mais importantes dentre todo o fluxo de processamento, ao qual visa mover eventos
sísmicos para as suas supostas posições originais em subsuperfície e, desta forma,
gerar-se uma imagem das interfaces no tempo ou na profundidade. Este processo
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo I – Introdução
página 4
está inserido em um fluxo de processamento que visa corrigir diversos efeitos, tais
como o introduzido pela diferença de elevação entre receptores, da zona de baixa
velocidade, da perda de energia sofrida durante a propagação da onda, dentre
outros. Tais técnicas demandam um grande custo computacional, normalmente
atrelado ao aumento da precisão do algoritmo e a complexidade do meio geológico
em questão (exemplo: existência de falhas, gradiente irregular de velocidade) e tal
tarefa pode ser bastante demorada, levando dias, semanas ou até meses de
execução ininterrupta.
Companhias da área de processamento sísmico têm, cada vez mais, aderido aos
paradigmas computacionais acima discutidos de forma a tornar tais processos mais
rápidos, além de conjuntamente melhorar a precisão de seus algoritmos.
1.2 – Motivação e Objetivos
Este relatório surgiu como fruto de uma pesquisa de Iniciação Científica
realizada ao longo de oito meses na Universidade Federal do Rio Grande do Norte
(UFRN), de forma que o mesmo acaba por ter objetivos de cunho didático-científico.
Inicialmente em relação ao objetivo científico, este trabalho consistiu na
implementação e análise de um algoritmo de migração sísmica em profundidade que
foi testado em arquiteturas tradicionais de CPU (mais especificamente, x86_64) e de
GPUs (do inglês, Graphics Processing Unit), juntamente em diversos clusters, de
forma a comparar seus respectivos desempenhos.
Já no tocante ao objetivo didático, temos a atuação deste documento como
sendo um relatório de conclusão do Curso de Graduação de Bacharel em Geofísica
da Universidade Federal do Rio Grande do Norte através da disciplina obrigatória
GEF0161 – RELATÓRIO DE GRADUAÇÃO EM GEOFÍSICA, além de também servir
como relatório da bolsa de Iniciação Científica para o Centro Potiguar de
Geociências (CPGeo), financiador deste projeto.
1.3 – Estrutura do Trabalho de Conclusão de Curso
Este trabalho foi desenvolvido em oito capítulos aos quais os que incluem
fundamentações teóricas procuram ser o mais independente possível uns dos
outros, fugindo do tradicional desenvolvimento linear de conhecimentos. Leitores
com conhecimento prévios nos assuntos a serem tratados em cada capítulo podem
pular a leitura de cada capítulo referente ao mesmo.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo I – Introdução
página 5
O capítulo II trata de aspectos de aquisição e processamento sísmico
fundamentados na técnica CDP, construindo uma base qualitativa e dando uma
breve introdução em alguns dos métodos utilizados nos resultados apresentados
adiante.
O terceiro capítulo envolve diretamente a base teórica por trás do algoritmo de
Migração Reversa no Tempo, foco principal deste relatório, cuja eficiência é
analisada mais a frente. O desenvolvimento da análise da base teórica é fortemente
pautado tanto na física (princípio da reversão temporal de uma onda) quanto na
matemática.
Enquanto isso, os capítulos IV e V possuem um aspecto computacional e
abordam, respectivamente, arquiteturas de computadores, juntamente com um
pouco de história e estrutura dos mesmos, além de recursos de computação
paralela e distribuída através de CPUs e GPUs.
Por fim, os capítulos restantes tratam dos resultados obtidos no decorrer do
trabalho, juntamente com discussões dos resultados e seus possíveis desafios e
sugestões futuras para outras pesquisas que possam a ser de interesse do leitor.
1.4 – Direitos Autorais
Este é um trabalho acadêmico que não visa lucro e que respeita os direitos
autorais. Todas as imagens são de fonte própria (recriadas a partir de uma base ou
não) ou, caso contrário, a imagem terá a fonte explicitada e cairá em um dos
seguintes casos:
Houve permissão para reprodução por parte da fonte.
A imagem encontra-se em domínio público (licenças GPL, Creative
Commons, dentre outras) ou a permissão para uso acadêmico/sem fins
lucrativos não é necessária.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada a Prospecção de Óleo
Capítulo II – Sísmica Aplicada à Prospecção de Óleo
2.1 – Por que sísmica, afinal?
O método sísmico de reflexão – ou simplesmente a sísmica de reflexão – é o
método geofísico mais utilizado para problemas de exploração envolvendo a detecção
e o mapeamento de interfaces, identificando as propriedades físicas de cada unidade
abaixo da subsuperfície, as quais se incluem sequências sedimentares, o que fazem
com que os mesmos sejam bastante utilizados na prospecção de hidrocarbonetos.
Isso deriva do fato de que é possível ter boas resoluções lateral e horizontal, além de
excelente profundidade de investigação referente ao reservatório, o que induz a um
ótimo custo/benefício. Tal método também é particularmente eficaz no imageamento
de regiões com geologia complexa, principalmente em relação a outros métodos,
como o gravimétrico ou eletromagnético.
Segundo Kearey et al. (2011), o primeiro levantamento sísmico foi realizado no
início da década de 1920, já representando um desenvolvimento natural dos já
estabelecidos métodos de sismologia de terremotos, aos quais invertia-se os tempos
de percurso das ondas de forma a obter informações crustrais do planeta. Com o
advento da era digital, tal método sofreu uma incrível explosão tecnológica, visto que
existia uma maior possibilidade de armazenamento de dados e, desta forma, técnicas
de aquisição 3D se popularizam e que acabaram por culminar a um custo financeiro
maior para o processo de aquisição. Na Rússia, o custo de um levantamento 2D
costuma variar de 60.000 rublos (R$ 4.200 reais) por km² na região central a até
100.000 rublos (R$ 7.000 reais) por km² na região do oeste da Sibéria, enquanto que
um levantamento 3D na região da península de Iamal, também na Rússia, varia para
algo em torno de 600.000 rublos (42.000 reais). A rápida necessidade de uma
tecnologia mais eficiente faz com que a tecnologia dos dias atuais logo se barateie
por ficar obsoleta diante às mais recentes; porém, Garg et al. (2008) cita que é
possível diminuir em até 43% o custo por traço de uma aquisição somente através do
aumento da produtividade.
Teoricamente, a sísmica de reflexão fundamenta-se a partir da propagação de uma
onda gerada por uma fonte, podendo esta ser explosiva (dinamites) ou não-explosiva
(como o Vibroseis, desenvolvido pela Continental Oil Company durante os anos 1950,
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 7
ou o air gun, usado em levantamentos sísmicos marinhos). Tais ondas, ao encontrar
interfaces em que um contraste de impedância acústica seja existente, serão
refratadas e/ou refletidas e, assim, terão sua amplitude, além de seu tempo de
chegada, registradas por sensores, normalmente compostos por transdutores
associados a sismógrafos.
Apesar de uma fonte apropriada gerar majoritariamente ondas transversais e
longitudinais, parte da energia da fonte será convertida para a criação de ondas de
superfície, que serão detectadas pelo sensor em questão e, à essa energia
indesejável, damos o nome de ruído coerente. Também vale citar a diferença de
nivelamento (em terrenos irregulares) dos sensores, além das zonas de baixa
velocidade (comumente geradas pelo intemperismo), e a perda de energia da onda
ao se propagar. Sendo assim, o processamento sísmico visa atenuar tais problemas
da aquisição e aumentar a razão sinal/ruído.
Após toda a fase de aquisição e processamento, o resultado final da sísmica é
uma seção sísmica, onde esta permite ao intérprete tentar retirar o máximo de
informações existentes na região do levantamento, como a existência de falhas,
fraturas ou mesmo de um possível reservatório de hidrocarbonetos.
Os tópicos que se seguem ao longo deste capítulo tratam em detalhes de toda a
cadeia de processos dominada pelas fases de aquisição, processamento e
interpretação, sendo ambas relacionadas segundo o diagrama abaixo.
Figura 2.1: Diagrama de relação entre a cadeia de processos em uma sísmica,
é vital reparar que existe uma comunicação constante entre todos.
2.2 – Fundamentos da Técnica CDP
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 8
Antes de adentrar na parte de processamento, é necessário entender como é feita
a aquisição dos dados, uma vez que muitos dos processos realizados na sísmica se
baseiam na técnica de Ponto de Profundidade Comum – em inglês, Common Dip Point
(CDP). Tal técnica foi idealizada inicialmente por Harry Mayne no início dos anos 1950
e começou a ser aplicada em escala de produção a partir da década de 60 (Rosa,
2011).
Uma sísmica de reflexão tem um princípio simples, conforme indicado na figura
2.2: faz-se uma perturbação, através de uma fonte, no meio que desejamos investigar
e, graças à mesma, ondas começarão a se propagar na subsuperfície. À medida que
tais ondas encontram um contraste de impedância nas interfaces, parte delas sofre
refração, onde continuam a descer pela subsuperfície, ou reflexão, voltando para a
superfície onde sensores estão monitorando as amplitudes e as fases de onda, além
do tempo que elas levaram para ir e voltar. A figura 2.2 ilustra um cenário de aquisição
terrestre com quatro tiros e quatro receptores.
Figura 2.2: Exemplo esquemático de uma aquisição sísmica.
A multiplicidade inerente a esta técnica faz com que os traços sísmicos de um
agrupamento CMP (abreviação para Common Mid Point) possam ser empilhados (i.e.
sobrepostos) de forma a reforçar as reflexões. Para que tal fato possa ocorrer, é
necessário que cada amostra registrada em um tempo t seja deslocada para o tempo
t0 e acumulada em um novo traço, o qual se situa na posição do ponto médio entre a
fonte e o receptor. Entretanto, este princípio falha na presença de mergulho porque o
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 9
ponto comum em profundidade não mais se encontra diretamente sob o ponto médio
entre tiro e o receptor, e o ponto de reflexão difere para raios que chegam a diferentes
afastamentos, conforme se pode observar na figura 2.3.
Figura 2.3: (a) O ponto médio comum é igual ao ponto de profundidade comum.
(b) Devido a camadas mergulhantes, os dois pontos não são iguais.
Imagem baseada em Kearey et al., 2009
Desta forma, como será discutido mais adiante, é necessário corrigir este efeito
através de um processo chamado Correção Dip Move-out, para fluxos com uma
migração pós-empilhamento, ou a correção ficará a cargo de uma possível migração
pré-empilhamento.
2.3 – Análise de Dados Reais e Sintéticos; Softwares
É de importância ressaltar que a totalidade dos dados mostrados aqui será, para
fins didáticos, sintéticos. Isso ocorre porque tais tipos de dados são mais simples de
serem trabalhados além de também serem largamente empregados por
pesquisadores para a verificação da eficiência de técnicas como algoritmos de
migração ou deconvolução.
Dentre os dados mostrados na próxima seção, destaca-se o modelo Marmousi.
Segundo Tariq Alkhalifah, da Universidade de Stanford, tal composição virou sinônimo
da frase “informação complexa”, uma vez que a colossal quantidade de dobras e
falhas introduzidas no modelo criou uma interessante distribuição de anomalias de
velocidade laterais e horizontal, além de descontinuidades, servindo, assim, como
uma ferramenta de calibração para testar algoritmos de tempo de percurso e migração
por anos. Este modelo foi criado em 1988 pelo Instituto Francês de Petróleo (IFP,
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 10
Institut Français du Pétrole) e sua geometria é baseada em um perfil transversal da
bacia de Cuanza, em Angola.
Figura 2.4: Modelo de Velocidades do Marmousi, reconstruído pelo software Madagascar.
Uma vez que seu uso é relativamente mais simples, o processamento de dados
sísmicos é feito majoritariamente através de softwares interativos, como o SeisSpace,
da Landmark, ou do Echos, da Paradigm. Entretanto, tais softwares possuem preços
demasiadamente altos, normalmente compatíveis com o padrão da indústria do
petróleo, o que faz com que eles sejam inacessíveis para a maioria dos pesquisadores
localizados em Academias. Sendo assim, o Center for Wave Phenomena, da Colorado
School of Mines, desenvolveu o Seismic Unix (SU) como uma alternativa gratuita e de
código-fonte aberto para processamento de dados sísmicos. O SU faz 27 anos em
2013 e, apesar de não ter recursos de processamento mais avançados (como
processamento paralelo, foco deste trabalho, ou algoritmos de migração como RTM),
ele se tornou uma alternativa bastante viável para pesquisa e ensino. É de importância
ressaltar que muitos dados mostrados neste capítulo foram
processados/reconstruídos utilizando o Seismic Unix.
Outro pacote que vem se tornando popular na área de processamento de dados,
tanto por ser de código-fonte aberto quanto eficiente, é o Madagascar. Lançado em
2006 por Sergey Fomel, o software conta com um código ligeiramente mais moderno
e simplificado, graças ao fato de ter sido desenvolvido por uma equipe menor e mais
recentemente.
2.4 – Processamento Sísmico
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 11
2.4.1 – Uma tentativa de fluxograma
Existem inúmeras maneiras de se processar um dado sísmico, e tudo isso
depende tanto de quem o processa (assim como o conhecimento geofísico e
geológico desta pessoa) quanto de como o dado é: envolve geologia complexa? As
interfaces são plano-paralelas? O dado a ser processado é terrestre ou marítimo?
Esse tipo de questionamento acaba por se tornar importante porque no momento em
que, por exemplo, o dado que estivermos trabalhando for marítimo, é muito pouco
provável que precisemos fazer uma correção estática para anular o efeito de elevação
e de zonas de baixa velocidade, mas talvez tenhamos que lidar com as múltiplas de
reverberação. Tais tipos de dados, por serem adquiridos em alto mar, também
costumam possuir uma qualidade muito melhor, uma vez que o barco de aquisição,
em alto mar, pode se mover e adquirir o dado continuamente sem a necessidade de
skips (“pulos” de certos geofones), o que pode deixar inúmeras pessoas com um pé
atrás antes de aplicar qualquer tipo de filtragem nele. Tal hesitação dificilmente ocorre
com dados terrestres, uma vez que, neste, a existência de diversos problemas
relativos à aquisição é mais proeminente. O fluxograma abaixo consiste em uma
demonstração das etapas relativas ao dado sísmico durante a etapa de
processamento e que serão discutidas neste trabalho.
Figura 2.5: Fluxograma básico para dados terrestres e de geologia complexa, o que faz com
que a correção estática e a migração pré-empilhamento sejam necessárias.
Vale ressaltar que este trabalho aborda casos de alta complexidade, com a
presença de sais e falhas, além de variações de velocidade laterais e verticais, onde
nesses casos dá-se preferência a usar migração pré-empilhamento para aumentar a
qualidade final do dado sísmico.
2.4.2 – Setup
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 12
Um ponto crucial para o início do processamento de dados consiste na
conversão do dado bruto para o padrão do software a ser utilizado, seja o SeisSpace
ou o Seismic Unix, sendo este último utilizando um cabeçalho próprio no formato *.su.
Por convenção, o dado bruto de aquisição encontra-se no padrão da Society of
Exploration Geophysicists, SEG-Y, desenvolvido em 1973 (com as especificações
publicadas dois anos depois) para armazenar dados em fitas magnéticas. Tal formato
encontra-se com a seguinte estrutura:
Figura 2.6: Estrutura do SEG-Y. Adaptado de SEG Technical Standards Committee, 2002.
O formato contém um cabeçalho EBCDIC (Extended Binary Coded Decimal
Interchange Code), seguido por um cabeçalho de 400 bytes binário, que contém
dados gerais sobre o dado, como o número de amostras por traço. Segue-se, então,
mais um cabeçalho, desta vez de 240 bytes sobre o traço, ao qual contém informações
como a ordenação do mesmo e, por fim, o dado sobre o traço em si, ao qual costuma
ser armazenado no padrão de ponto flutuante da IBM.
Apesar de o arquivo convertido possuir bastante informação, ele por si só não
será de muita utilidade se não pudermos carregar a geometria: inserir informações
relativas à aquisição é de fundamental importância no processamento. Dentre as
geometrias mais utilizadas para aquisições 2D, estão a split-spread e a end-on. A
primeira consiste em geofones localizados nos dois lados da fonte, enquanto a
primeira trata de geofones somente em um dos lados da mesma. Após a inserção da
geometria, é importante ressaltar que normalmente, antes de se começar a processar,
também se costuma retirar artefatos de ruído que são mais visíveis e fáceis de
remover, processo comumente chamado de edição.
2.4.3 - Correções Estáticas
As Correções Estáticas consistem em compensar dois tipos de efeitos: o
referente à diferença de elevação de receptores (geofones ou hidrofones) e, o
segundo, para compensar a zona de baixa velocidade. Tais correções são feitas
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 13
majoritariamente em dados do tipo terrestre, visto que dados marinhos não costumam
possuir os problemas citados (há exceções, como as realizadas através de cabos de
fundo oceânico, mas a discussão sobre isso não é o foco deste trabalho).
O primeiro efeito em discussão ocorre quando não temos uma superfície plana
para todos os receptores, de forma que alguns ficam mais elevados que outros. Com
isso, ondas refletidas exatamente no mesmo ponto terão tempos de trânsito
diferentes. A correção para este efeito é normalmente a primeira a ser aplicada no
dado e é comumente realizada com o auxílio de um GPS Diferencial (DGPS), as quais
posições e altitudes podem ser determinadas com bastante precisão.
O segundo efeito ocorre devido à zona de baixa velocidade, normalmente
causada graças à ação do intemperismo físico-químico que acaba por gerar uma
camada anômala de algumas poucas dezenas de metros. Nesta zona, como o próprio
nome diz, a onda perde bastante velocidade em relação ao resto da subsuperfície e,
logo, a velocidade anomalamente baixa causa grandes atrasos no tempo das ondas
que a atravessam. Assim sendo, caso não seja corrigida, as variações em espessura
da camada intemperizada podem levar a um falso relevo estrutural nos refletores
subjacentes. De forma a corrigir tal efeito, é necessário o conhecimento das variações
de velocidade e espessura desta camada, sendo uma das alternativas utilizadas para
tal é o uso da sísmica de refração, a qual usa o princípio que as primeiras chegadas
de energia nos detectores em um lanço de reflexão são normalmente raios que foram
refratados pelo topo da camada de rocha não-intemperizada.
2.4.4 – Análise de Velocidade e Correção NMO
Um dos fundamentos da técnica CDP está no fato de que um mesmo tiro será
amostrado várias vezes por diferentes receptores. Entretanto, estes receptores
encontram-se espaçados a diferentes distâncias, de forma que comparar um mesmo
tiro da forma que o mesmo foi adquirido acaba por se tornar inviável. Conforme pode
ser visto na figura 2.7, o conjunto de traços sísmicos em uma mesma família CMP
tende por formar uma hipérbole. Para corrigir este sobretempo normal, realiza-se a
Análise de Velocidade, como pode ser visto na figura 2.8, na qual definimos o
gradiente de velocidade em determinados pontos de forma a equiparar todas as
CMPs. Assim, teremos as hipérboles sendo convertidas em retas, ficando possível
comparar os tempos de trânsito de cada traço sísmico.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 14
Figura 2.7: Dado sísmico no domínio da CMP antes e depois
da correção de sobretempo normal.
Em eventos mais rasos e/ou offsets mais distantes, a correção de sobretempo
normal acaba por causar uma modificação no sinal das reflexões: o tempo de trânsito
tende a se alongar, distorcendo-se, assim, em relação ao seu conteúdo de
frequências. Buscando minimizar este efeito de distorção, aplica-se a técnica de
silenciamento (do inglês, mute), que apaga as regiões em que os traços sísmicos
encontram-se demasiadamente distorcidos acima de um valor de estiramento
estabelecido anteriormente, evitando a degradação das amplitudes no dado
empilhado.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 15
Figura 2.8: Análise de Velocidade pelo método de
semblance no Seismic Unix.
Apesar de tal discussão estar fora do escopo deste trabalho, é de importância
citar que existem diversos métodos para se realizar uma Análise de Velocidade, entre
as quais é possível citar a análise (t²-x²), Painéis de Velocidade Constante (do inglês,
Constant velocity panels), empilhamento de velocidade constante (Constant velocity
stack) e pelo espectro de velocidade, este último sendo bastante utilizado por parte
de softwares interativos, como o Seismic Unix (através da função semblance, como
visto na figura 2.8) ou o ProMAX/SeisSpace, da Landmark.
2.4.5 – Filtro de Frequência
Segundo Kearey et al. (2011), qualquer ruído, seja este coerente ou incoerente,
que possua uma frequência dominante diferente daquela das chegadas refletidas,
pode ser suprimido pela filtragem de frequência. De uma forma geral, tal filtro é
aplicado através de uma Transformada de Fourier Direta (no domínio discreto,
comumente usa-se a técnica denominada Fast Fourier Transform), ao qual se
transforma o presente traço no domínio t-x para o domínio f-k, aplica-se uma janela
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 16
de filtragem e, então, é realizada uma Transformada de Fourier Inversa. A janela de
filtragem é comumente classificada em uma das três opções abaixo:
Janela passa-alta (high-pass): Somente as frequências acima de um
determinado valor “x” serão aceitas, enquanto o restante é rejeitado.
Janela passa-baixa (low-pass): Somente as frequências abaixo de um
valor “x” especificado serão aceitas, enquanto o restante é rejeitado.
Janela passa-banda (band-pass): Somente as frequências
compreendidas dentro de um intervalo [x;y] serão aceitas, enquanto o
resto é rejeitado.
Normalmente, tais filtros são aplicados em um estágio inicial do
processamento, apesar de poderem ser realizados em vários estágios da sequência
de processamento. O rolamento superficial (em inglês, ground roll), caracterizado por
baixas frequências e altas amplitudes, pode ser atenuado com o uso de uma janela
passa-alta, assim como os ruídos gerados pelo navio em levantamento sísmicos
marinhos. De modo similar, o efeito gerado pelo ruído do vento, composto
majoritariamente por altas frequências, pode ser reduzido com um filtro corta-alta.
2.4.6 – Deconvolução e o Modelo Convolucional
Duarte (2007) descreve a deconvolução como o ato de desfazer ou neutralizar
o efeito de uma convolução anterior, e isso tem como efeito o encurtamento do
comprimento do pulso sísmico (spiking) nas seções sísmicas, de forma que a
resolução vertical acaba por melhorar. Para que seja possível entender o processo de
deconvolução, é necessário entender o modelo convolucional do traço sísmico, ao
qual estabelece que um pulso sísmico pode ser representado pelas seguintes
componentes, ilustradas pela figura 2.9.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 17
Figura 2.9: Modelo Convolucional simplificado. Adaptado de Partryka, Gridley e Lopez, 1999.
Na realidade, Rosa (2011) define o pulso sísmico como sendo a convolução da
assinatura da fonte com o instrumento (sismógrafo) e seus filtros convolvidos com o
receptor, a combinação dos fantasmas da fonte e dos receptores, a combinação dos
arranjos de tiro e receptores além do filtro da terra. Sendo assim, a ideia básica da
deconvolução é uma convolução com o filtro inverso, em uma suposição de que isso
irá desfazer os efeitos de um filtro anterior, como a Terra ou o do sismômetro.
Entretanto, dificilmente sabemos as propriedades ou a forma do filtro que desejamos
remover, de forma que modelar um filtro inverso para esta finalidade acaba por se
tornar uma tarefa relativamente árdua. Um exemplo de deconvolução no traço sísmico
é mostrado na figura 2.10, onde o tipo utilizado foi o Wiener-Levinson (deconvolução
preditiva).
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 18
Figura 2.10: Deconvolução através de um filtro Wiener-Levinson.
A assinatura da fonte é normalmente conhecida em diversos casos,
principalmente na modelagem, e se encontra em formato de função gaussiana ou de
uma fonte Ricker (“sobrero” ou “chaupéu mexicano”), normalmente a 40 Hz, de forma
que o que nos resta é determinar a função refletividade, enquanto a maioria dos filtros
intrínsecos ao pulso costumam ser aleatórios.
Figura 2.11: Função Ricker. Fonte: Wikimedia Commons.
Sheriff (2004) afirma que a qualidade da sísmica moderna deve bastante ao
sucesso da deconvolução. Dentre os exemplos de efeitos específicos a qual a
deconvolução é utilizada, podemos citar os seguintes:
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 19
Derreverberação: Remove a ressonância, associada a reflexões múltiplas em
uma lâmina d’água.
Deghosting: Deconvolução para eliminar o efeito da reflexão fantasma.
Whitening: Equaliza a amplitude de todos os componentes de frequência dentro
da banda.
A deconvolução é comumente realizada sobre os traços sísmicos individuais antes
do empilhamento ou depois do empilhamento e é utilizada em quaisquer estágios do
processamento de dados.
2.4.7 – Correção dos Fatores de Propagação
Devido ao fato de nos encontramos em um meio anisotrópico, a onda não irá
se propagar de forma esférica. Entretanto, segundo o princípio de Huygens, é de
conhecimento geral que a energia em toda frente de onda mantém-se constante para
todos os pontos. Rosa (2011) enuncia três diferentes enfoques de se corrigir as perdas
de amplitude por transmissão através das interfaces: o primeiro consiste em desprezar
o fenômeno, o segundo consiste em incluir a perda por transmissão no processo de
migração e o terceiro trata de corrigir as perdas juntamente com o filtro estratigráfico.
Figura 2.12: Correção da Divergência Esférica.
Os demais enfoques, como múltiplas, absorção e filtro estratigráficos, tendem
a ser tratados de forma explícita, já que inclui-los na migração e acabar por errar a
parametrização pode levar a uma repetição de um processo que possui um alto custo
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 20
computacional, o que não é interessante para a indústria. A correção da divergência
esférica (geometrical spreading) é aplicada para eliminar a redução de amplitude
decorrente da expansão de onda, aplicando ganhos de acordo com o modelo de
velocidades preliminar gerado anteriormente; tais ganhos são ilustrados na figura
2.12.
2.4.8 – Migração
A migração relocaliza os eventos de reflexão para onde eles de fato ocorreram,
gerando uma imagem direta da subsuperfície e consistindo, desta forma, em um dos
processos mais importantes da sísmica.
Existem vários tipos de migração, e estas podem se classificar de diversas
formas. Yilmaz (2001) classifica os algoritmos de migração em três categorias: os que
são baseadas na solução integral da equação escalar de onda, aqueles que são
baseados na solução por diferenças finitas e aqueles que são baseados em
implementações de frequência-número de onda. Outras classificações incluem as
migrações 2D versus 3D, as migrações pré e pós-empilhamento, além das migrações
em tempo e em profundidade, podendo variar de migrações 2D pós-empilhamento
(computacionalmente mais simples) até migrações 3D pré-empilhamento.
Figura 2.13: Gráfico de indicação para tipos de migração. Adaptado de Liner, 2009.
De uma forma geral, as migrações em áreas mais complexas são realizadas
em profundidade, uma vez que estas também são as mais indicadas para lidar com
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 21
fortes variações laterais de velocidade, entretanto costumam ser computacionalmente
mais intensivas, já que se baseiam, em geral, na resolução da equação de onda por
meio de métodos como o de diferenças finitas. Já em regiões mais simples, é comum
usar algoritmos de migrações em tempo. Um esquema comparativo de algoritmos de
migrações pode ser visto na figura 2.13.
Alguns dos métodos de migração consistem em colapsar difrações (Kirchhoff),
resolver o problema de equação da onda através de mudança de domínio espacial
(PSPI) ou, como será abordado neste trabalho, pela resolução discreta da equação
de onda em um algoritmo de Migração Reversa no Tempo. Cada um tem suas
vantagens e desvantagens, além de regiões de aplicação recomendadas, porém tal
discussão não se encontra no escopo deste trabalho.
Figura 2.14: Modelo Marmousi (suavizado) com uma migração Kirchhoff em profundidade.
É importante ressaltar que, para migrações pré-empilhamento, a correção Dip
Moveout (DMO) costuma estar sempre intrínseca. Para casos pós-empilhamentos,
explicita-se tal processo de forma a corrigir os mergulhos das interfaces na
subsuperfície, conforme já foi ilustrado na figura 2.3.
2.4.9 – Empilhamento
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 22
Este processo pode ser feito antes ou depois da migração, e consiste de somar
(empilhar) vários traços sísmicos de uma mesma CRP (Common Reflection Point,
Pontos Comuns de Reflexão) de forma que os ruídos de fundo tendem a se atenuar
enquanto os pontos de reflexão têm suas amplitudes aumentadas, assim
incrementando a razão sinal/ruído. Tal processo costuma ser um dos últimos a serem
aplicados e, uma vez que vários dados estão sendo juntados em um só, normalmente
resulta em um arquivo computacional de tamanho menor, o que leva às etapas de
análise após o empilhamento serem computacionalmente mais rápidas. Assim como
os vários outros processos envolvidos dentro da cadeia de processamento, o
empilhamento possui diversas técnicas, sendo duas ilustradas na figura 2.14. A
terceira seção à direita ilustra traços empilhados com pesos iguais, enquanto, na
segunda, foram dados pesos maiores aos melhores traços, tendo resultado bem
superiores. A técnica CRS (do inglês, Common Reflection Surface) também costuma
se destacar bastante entre pesquisadores e na indústria em geral.
Figura 2.15: Diferentes tipos de empilhamento, com diferentes resultados.
2.5 – Controle de Qualidade
Conforme discutido por Olhoeft (2008), uma vez que estamos com todo o
processamento finalizado, é necessário verificar se tudo foi feito corretamente. Caso
sim, podemos enviar para a interpretação; caso contrário, é necessário refazer todo
ou parcialmente o processamento. É possível notar que nosso dado foi processado
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo II – Sísmica Aplicada à Prospecção de Óleo
página 23
de forma errônea no momento que o resultado final para de corresponder às
observações in-situ, muitas vezes através da correlação com a perfilagem de poços,
que existem no local do levantamento, e diversas vezes tais erros podem ser
atribuídos a uma má correção estática ou erro na configuração de parâmetros para a
geometria de aquisição, ou mesmo de migração. Além disso, é de importância
comentar que uma boa análise de velocidades é a base para o empilhamento,
migração e uma conversão apropriada do domínio do tempo para a profundidade,
então tal processo acaba por se tornar bastante crucial no processamento como um
todo.
2.6 – Interpretação
Com a seção sísmica processada e aprovada pelo controle de qualidade, o último
passo compreendido dentre a cadeia do método sísmico é a interpretação, conforme
citado por Kearey et al. (2002). Na verdade, a interpretação está diretamente ligada
com as abordagens de análise estrutural e a análise estratigráfica, sendo ambas
assistidas pela modelagem sísmica (a qual sismogramas sintéticos são criados para
se compreender melhor o significado físico dos eventos de reflexão contido nas
seções sísmicas). O primeiro tipo de análise é focado majoritariamente para a
investigação de trapas estruturais que possam conter hidrocarbonetos, enquanto que
a análise estratigráfica procura subdividir a seção sísmica de forma que a sequência
de reflexões seja interpretada como sendo a expressão sísmica de sequências
sedimentares geneticamente relacionadas.
Por fim, vale falar que atributos sísmicos – operações matemáticas realizadas
sobre o dado sísmico que procuram enfatizar determinadas propriedades - podem ser
especialmente úteis no diagnóstico na distinção entre efeitos na amplitude por
variação na matriz da rocha e aqueles resultantes da presença de fluidos nos poros
(neste caso, sendo a situação de interesse para a indústria do hidrocarboneto), sendo
estes uma ferramenta bastante utilizada.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
Capítulo III – Migração Reversa no Tempo
O processo de Migração Reversa no Tempo (em inglês, Reverse Time Migration,
comumente abreviada como RTM) foi inicialmente idealizada por Hemon (1973), que
teve a ideia de resolver a equação de onda usando diferenças finitas. Entretanto,
somente em 1983, nos trabalhos de Kosloff e Baysal (1983) e Baysal, Kosloff e
Sherwood (1983) foi que surgiu a aplicação para a exploração sísmica e que era,
originalmente, relacionados à migração pós-empilhamento.
De uma forma geral, a RTM consiste em uma técnica de migração sísmica que
utiliza o Método de Diferenças Finitas para fazer a extrapolação numérica do campo
de ondas no tempo através da discretização da equação de onda. tem como objetivo
realizar a extrapolação dos campos de ondas emitidos pelas fontes sísmicas e pelo
campo de ondas registrados nos geofones. Tal processo continua até que o mesmo
atinja as fontes refletoras de uma subsuperfície, onde este processo denomina-se de
príncipio da reversão temporal.
A ideia para a aplicação do princípio acima citada para a migração foi
inicialmente proposta por Claerbout (1971) fazendo uso da teoria de diferenças
finitas para a propagação dos campos de ondas. Após a extrapolação direta e
inversa e com uma condição de imagem imposta, como a correlação cruzada, é
possível gerar a imagem em cada ponto da malha, obtendo como resultado a seção
sísmica migrada. A figura 3.1 ilustra um fluxograma simplificado de como o algoritmo
roda para cada tiro.
Costa (2012) destaca que, dentre as vantagens da RTM, estão o fato da mesma
trabalhar com a equação de onda completa, conseguir lidar com campos de
velocidade com forte contraste e imagear bem eventos com mergulhos arbitrários. Já
entre as desvantagens, encontram-se o fato da mesma trabalhar com uma menor
banda espectral, possuir o ruído devido ao espalhamento e ao retro-espalhamento,
como será visto adiante, e, finalmente, seu alto custo computacional – o que a ainda
a torna um pouco impraticável para a indústria como um todo.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
página 25
Figura 3.1: Algoritmo RTM para vários tiros.
Adentrando na fundamentação teórica, Loewenthal et al. (1976) afirma que a
base para a migração de seções empilhadas em tempo é o “modelo de refletores
explosivos” ao qual assume que toda a energia em um presente tempo t no dado
empilhado provém de um tempo de reflexão em um tempo t/2 e então a amplitude
do coeficiente de reflexão pode ser determinado ao retropropagar essa energia de
volta à subsuperfície com metade do seu tempo de chegada.
Baseado no modelo dos refletores explosivos, o propósito da migração é
recuperar as amplitudes no tempo zero, que dá a localização e a força dos
refletores. Segundo Weglein, Stolt e Mayhan (2010), para calcular o campo de
ondas da fonte em questão, é necessário injetar no modelo uma fonte padrão (como
a fonte Ricker, ilustrada pela figura 2.11) na posição original do tiro sísmico.
Caso considerermos P(z, x, t) como sendo o campo de ondas e c(z, x), o campo
de velocidades, é possível chegar à equação de onda de Gazdag (1981) para
mergulhos de 90 graus:
𝜕2𝑃(𝑧, 𝑥, 𝑡)
𝜕𝑥2+
𝜕2𝑃(𝑧, 𝑥, 𝑡)
𝜕𝑧²−
1
𝑐2(𝑧, 𝑥)
𝜕2𝑃(𝑧, 𝑥, 𝑡)
𝜕𝑡2= 0
Equação 3.1: Equação Escalar da Onda.
Nunes do Rosário (2012) nota que, matematicamente, o tensor de Green – que
consiste em uma matriz cujos elementos correspondem a relação entre uma fonte
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
página 26
pontual e a força do campo de ondas resultante em uma região finita ou semi-infinita
- no problema em questão implicará na modelagem da equação 3.1 na seguinte
forma:
𝜕2𝑃(𝑧, 𝑥, 𝑡)
𝜕𝑥2+
𝜕2𝑃(𝑧, 𝑥, 𝑡)
𝜕𝑧²−
1
𝑐2(𝑧, 𝑥)
𝜕2𝑃(𝑧, 𝑥, 𝑡)
𝜕𝑡2= 𝑓(𝑡)𝛿(𝑥 − 𝑥𝑓)(𝑧 − 𝑧𝑓)
Equação 3.2: Equação Escalar da Onda com uma Fonte.
Na equação 3.2, 𝛿 é a função delta de Dirac, f é a fonte e xf e zf são suas
respectivas posições para um modelo 2D. Nunes do Rosário (2012) indica que, ao
observarmos que a wavelet fonte é a fonte do campo de pressão, é possível notar a
implicação que a resolução do problema da migração reversa no tempo é, na
realidade, a resolução de um problema de valor sobre o contorno, onde a resposta
ao impulso de um meio qualquer é uma função de Green que consegue identificar as
reflexões, difrações, ondas guiadas, dentre outros.
Assim, usando a equação acima, uma estimativa numérica pode ser feita da
derivada temporal de P no tempo T através de uma série de Taylor, discretizando-a
com a considerando uma expansão central de dois termos nas derivadas temporais
e uma expansão central de oito termos nas derivadas espaciais para a
implementação numérica por diferenças finitas, cujo resultado pode ser visto na
equação 3.3 e a demonstração pode ser vista com mais detalhes nos trabalhos de
Fornberg (1988), Liu et al. (2010) e de Nunes do Rosário (2012).
𝑃𝑖,𝑗𝑛+1 = (
Δ𝑡
ℎ𝑐𝑖,𝑗)
2
[(−1
560) {𝑃𝑖,𝑗−4
𝑛 + 𝑃𝑖,𝑗+4𝑛 + 𝑃𝑖−4,𝑗
𝑛 + 𝑃𝑖+4,𝑗𝑛 } + (−
8
375) {𝑃𝑖,𝑗−3
𝑛 + 𝑃𝑖,𝑗+3𝑛 + 𝑃𝑖−3,𝑗
𝑛 + 𝑃𝑖+3,𝑗𝑛 }
+ (−1
5) {𝑃𝑖,𝑗−2
𝑛 + 𝑃𝑖,𝑗+2𝑛 + 𝑃𝑖−2,𝑗
𝑛 + 𝑃𝑖+2,𝑗𝑛 } + (−
8
5) {𝑃𝑖,𝑗−1
𝑛 + 𝑃𝑖,𝑗+1𝑛 + 𝑃𝑖−1,𝑗
𝑛 + 𝑃𝑖+1,𝑗𝑛 }
+ (−205
72) {2𝑃𝑖,𝑗
𝑛 } − (Δ𝑑)2𝑓(𝑡)𝛿(𝑥 − 𝑥𝑓)𝛿(𝑧 − 𝑧𝑓) ] + [(−1) ∗ 𝑃𝑖,𝑗𝑛−1 + (2) ∗ 𝑃𝑖,𝑗
𝑛 ]
Equação 3.3: Discretização da Equação de Onda.
Com a equação acima, realiza-se a propagação da onda até um certo tempo de
registro nt. Assim, dado que Ps seja o campo de ondas da fonte e Pr trata do campo
de ondas do receptor, a correlação de imagem poderá ser dada pela equação 3.4,
onde I(z,x) é a imagem resultante e tmax é o tempo máximo de propagação dos
dados:
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
página 27
𝐼(𝑧, 𝑥) = ∫ 𝑃𝑠(𝑧, 𝑥, 𝑡) ∗ 𝑃𝑟(𝑧, 𝑥, 𝑡)𝑑𝑡𝑡max
0
Equação 3.4: Correlação contínua de Imagem receptor-fonte
No domínio discreto, temos que a integral da equação 3.4 se transforma em um
triplo somatório em z, x e t, conforme ilustrado pela equação 3.5.
𝐼(𝑧, 𝑥) = ∑ ∑ ∑ 𝑃𝑠(𝑧, 𝑥, 𝑡) ∗ 𝑃𝑟(𝑧, 𝑥, 𝑡)
𝑛𝑧
𝑧=0
𝑛𝑥
𝑖𝑥=0
𝑛𝑡
𝑡=0
Equação 3.5: Correlação discreta de Imagem receptor-fonte.
As implicações da equação 3.5 podem ser vistas na sua versão contínua, a
equação 3.4 e trata da relação entre campos, conforme pode ser visto pela figura
3.2, onde o último campo propagado deve ser correlacionado com o primeiro
retropropagado, o segundo com o antepenúltimo, etc. Desta forma, nos pontos em
que os campos diretos e inversos forem coincidentes, ter-se-á existência de um
ponto refletor em subsuperfície. Costa (2012) ressalta que existem vários outros
métodos para a condição de imagem, destacando-se a correlação cruzada por
suavização e por meio do vetor de Poynting, esta última usada principalmente para a
mitigação do ruído de retro-espalhamento.
Figura 3.2: Correlação de Imagem.
Adaptado de Costa, 2012.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
página 28
Um ponto importante a ser destacado advém das condições de estabilidade para
o método das diferenças finitas, advindos do fato de que tal método requer que os
campos de espaçamento mínimos possuam um espaçamento mínimo h entre pontos
consecutivos da malha, onde a razão entre a velocidade mínima do campo de
velocidades pelo produto da frequência de corte da fonte com uma constante de
pontos da malha deve ser sempre maior que este valor h, e um intervalo de tempo
mínimo Δ𝑡 para a propagação de um campo de ondas no tempo, onde a razão entre
o espaçamento espacial e o produto da velocidade máxima por uma constante de
tempo deve ser sempre maior. Liu et al. (2010) ilustra que quanto maior a ordem do
método de diferenças finitas e quanto maior a dimensão do dado, menor será o
coeficiente de condição de estabilidade e, juntamente a isso, o passo temporal é
menor, o que leva a um custo computacional e demanda de memória maiores.
Clapp (2009) destaca que, idealmente, gostaríamos de emular um domínio
computacional infinito quando propagamos nosso campo de ondas – entretanto, isso
é computacionalmente impossível, já que iria requerer também recursos infinitos, de
forma que a abordagem utilizada é a tentativa de se minimizar artefatos causados
por nosso domínio computacional limitado. Reynolds (1978) aponta que uma
possível solução é ampliar a malha numérica, o que atrasaria as reflexões ocorridas
no tempo posterior ao da simulação, mas isso pode também consumir demasiados
recursos computacionais, o que não é interessante para a indústria. Já da
comunidade eletromagnética, surgiu o método Perfectly Matched Boundary, que
acabou por se tornar o método mais eficaz para a solução desse problema
(Berenger, 1994), além de ser de fácil implementação numérica. Tal método foi
introduzido na sísmica através dos trabalhos de Collino e Tsogka (2001) e seu
princípio consiste em mapear o sistema coordenado no domínio complexo e, assim,
mudar o campo de ondas propagante para um campo de ondas decainte segundo a
seguinte expressão:
𝑦(𝑥) = {𝜋𝑓𝑝𝑖𝑐𝑜Δ (𝑋
𝐿)
2
, 𝑛𝑎𝑠 𝑏𝑜𝑟𝑑𝑎𝑠
0, 𝑑𝑜𝑚í𝑛𝑖𝑜 𝑑𝑒 𝑖𝑛𝑡𝑒𝑟𝑒𝑠𝑠𝑒
Equação 3.6: Perfect Matched Boundary.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
página 29
Dentre outras técnicas efetivas, encontram-se a introdução de uma região de
amortecimento nas bordas do domínio computacional (e muitas vezes combinada
com o anulamento de ondas que se propagam perpendicularmente à fronteira
computacional) ou, mais recentemente, a introdução de fronteiras aleatórias,
proposta por Clapp (2009).
Por fim, o dado final é gravado no disco do computador. Conforme Costa (2012)
destaca, a propagação e a retropropagação, ao serem realizadas, acabam por
introduzir problemas relativos ao grande volume de dados armazenados na
memória, de forma que acaba por ser necessário a introdução de checkups para a
escrita dos dados no disco ao longo do processo; outro problema que pode
acontecer se o dado for processado por um cluster, ao qual o grande volume de
arquivos podem congestionar uma determinada rede.
De forma a resumir este capítulo, um fluxograma do algoritmo utilizado neste
trabalho é ilustrado na figura 3.3, juntamente com a tabela 3.1 que registra as
descrições referentes a cada passo.
Figura 3.3: Fluxograma operacional da Migração Reversa no Tempo.
Função Descrição
Leitura de Dados Lê o arquivo com os dados de entrada (valores relativos à malha do dado,
fonte utilizada, absorção por parte das camadas) e o modelo de velocidade.
Cálculo de
Parâmetros da Malha
e da Fonte
Aloca memória para os principais vetores a serem utilizados e calcula
determinadas variáveis que serão utilizadas durante o processamento (e.x.:
tamanho total da malha).
Contenção da
Dispersão Numérica
Busca satisfazer a restrição temporal para que não exista o efeito de
dispersão numérica.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo III – Migração Reversa no Tempo
página 30
Estender Malha Estende a malha de propagação do campo no domínio computacional.
Injetar Fonte Insere-se a fonte na malha para que de fato se comece a propagação do
campo de ondas relacionado ao tiro.
Cálculo do
Laplaciano do
Campo de Ondas
Convolve-se o dado nas três direções (x, y, z), de forma que o campo de
onda se propague na malha.
Amortecimento Fazer com que a energia do campo de ondas decaia ao entrar em
determinada zona.
Coleta de Dados Coletar dados dos receptores para todo x, y e z.
Guardar o dado na
memória
O dado em questão não será escrito no disco enquanto todos os traços não
forem processados, de forma que os traços anteriores ficam na memória.
Checkpoint São registrados todos os dados armazenados até o momento no disco.
Ler Campos Insere na memória as informações relativas aos
campos de ondas direto e inverso.
Multiplicação É feita a correlação entre os dois campos de onda.
Transpor Matriz A matriz existente dos dados é transposta.
Escrita em Disco O dado final é escrito em disco e terminou de ser migrado.
Tabela 3.1: Descrição dos processos existentes na imagem 3.3.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
Capítulo IV – Arquitetura de Computadores
Este capítulo tem o objetivo de fazer uma revisão bibliográfica referente às
arquiteturas computacionais de forma a delinear características de estruturas
referentes às CPUs e GPUs.
4.1 – O modelo de um computador
De modo geral, define-se o computador como sendo uma máquina capaz de
realizar variados tipos de tratamento de informações ou processamento de dados e
os mesmos vêm sendo inventados e desenvolvidos ao longo de toda a história da
humanidade, conforme se pode ver na tabela 4.1 abaixo.
data inventor: máquina capacidade inovações
1642 Pascal: Calculadora adição, subtração Transferência automática de
vai-um
1671 Leibnitz: Calculadora adição, subtração,
multiplicação e divisão
mecanismo de multiplicação e
divisão
1827 Babbage: Difference Engine avaliação polinomial por
diferenças finitas
operação automática com
diversos passos
1834 Babbage: Analytical Engine computador de
propósitos gerais
mecanismo automático de
controle de sequência
1941 Zuse: Z3 computador de
propósitos gerais
primeiros computadores de
propósitos gerais operacionais
1944 Aiken: Harward Mark I computador de
propósitos gerais
primeiros computadores de
propósitos gerais operacionais
Tabela 4.1: História da computação, baseada na originada de Weber (2012).
Apesar de tentativas anteriores para a construção de computadores eletrônicos,
declara-se que o ENIAC (acrônimo para Eletronic Numerical Integrator and
Calculator), desenvolvido entre 1943 e 1946, como sendo o primeiro computador
para propósitos gerais, sendo sua motivação a necessidade de construir tabelas de
forma automática por interesse do sistema militar estadunidense durante a segunda
guerra mundial (Webber, 2012).
Ao longo do tempo, o avanço tecnológico dos computadores pôde ser dividido
em cinco gerações, onde as respectivas tecnologias presentes em cada uma
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 32
consistiu em válvulas e memórias de tubos catódicos (primeira geração), de
transistores e discos magnéticos (segunda geração), de circuitos integrados (SSI e
MSI), de circuitos LSI (Large Scale Integration) e memórias semi-condutoras (quarta
geração) e a quinta geração consiste em circuitos do tipo VLSI (Very Large Scale
Integration), tecnologia ainda usada nos dias de hoje.
Antes de discutir a arquitetura computacional de CPUs (como as fabricadas pela
Intel e AMD) e GPUs (referente às da NVIDIA), é necessário compreender alguns
conceitos advindos a partir da “arquitetura de von Neumann”, a qual foi desenvolvida
por John von Neumann durante a construção do ENIAC, em meados dos anos 40. A
ideia central era modelar a arquitetura do computador segundo o sistema nervoso
central humano, de forma a transformar as “calculadoras eletrônicas” em “cérebros
eletrônicos”. Para que tal feito fosse alcançado, seriam necessárias três
características: codificar as instruções de forma possível a ser armazenada no
computador (neste caso, foi usado o sistema binário), armazenar as instruções na
memória, assim como toda e qualquer informação necessária para a execução de
determinada tarefa e, por fim, ao processar o programa, buscar as instruções
diretamente na própria memória. Juntas, estas características acabaram por definir o
chamado “computador programável”.
Para que fosse possível atingir estas três características, com a dissolução do
projeto ENIAC, von Neumann e sua equipe iniciaram em 1946 um projeto no
Instituto de Estudos Avançados de Princeton: o computador IAS. Este computador
consistia em quatro seções: uma unidade de processamento central para a
execução de operações lógico-aritméticas, uma unidade de controle de programa,
uma unidade de memória principal e uma unidade de entrada e saída. A figura 4.1
ilustra melhor a inter-relação entre cada seção.
Figura 4.1: Arquitetura de von Neumann e a relação entre os componentes.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 33
A Unidade Lógico-Aritmética (ULA) é, como seu próprio nome diz, responsável
pelas operações aritméticas e lógicas (verdadeiro, falso) entre dois números,
possuindo também um terceiro parâmetro (resultado), um comando da unidade de
controle e o estado do comando após a operação. O conjunto de operações
aritméticas na ULA pode ser limitado à adição e a subtração, podendo também
incluir multiplicação, divisão, funções trigonométricas e raízes quadradas, assim
como o conjunto de números as quais as mesmas podem operar (inteiros, racionais,
reais, etc) ou o nível de precisão envolvido. Presente na ULA também se encontra o
acumulador, que é um registrador (ou um conjunto deles, em computadores mais
complexos) com a função de armazenar um operando e/ou um resultado fornecido
pela ULA.
Já a Unidade de Controle (UC) fornece sinais, conhecidos como sinais de
controle, aos quais gerenciam o fluxo interno de dados e o instante preciso ao qual
ocorrem as transferências entre uma unidade e outra. Indo mais adentro, cada sinal
de controle comanda uma micro-operação, responsável pela realização de carga em
um registrador, uma seleção de um dado para entrada em um determinado
componente, dentre outras funções.
Em relação à memória, esta é a responsável por armazenar elementos de
informação, sendo divididas em palavras que são univocamente identificadas por
endereços. O conteúdo armazenado em tais palavras pode tanto representar dados
como instruções.
A unidade de controle de programa juntamente com a unidade lógico-aritmética
formam a chamada Unidade Central de Processamento, ou, pela sua sigla
consagrada, CPU (do inglês, Central Processing Unit) ou, ainda, processador. Estes,
até meados da década de 1970, eram constituídos de diversos componentes
separados, mas, com o advento da miniaturização do transistor, eles começaram a
ser fabricados em circuitos integrados, sendo posteriormente denominados de
microprocessadores.
Com as configurações acima, a única linguagem que um processador é capaz de
entender é a chamada linguagem de máquina, a qual é uma imagem numérica
(binária) e representa a codificação do conjunto de instruções de um computador.
Entretanto, o uso de tal linguagem é particularmente difícil para a criação, alteração
e validação. Desta forma, o uso de mnemônicos foram associados aos códigos das
instruções, nomes aos operandos e labels às posições ocupadas pelo programa e,
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 34
assim, não é mais necessário trabalhar com códigos numéricos, linguagem de baixo
nível denominada assembly. Um programa escrito com a ajuda destes símbolos
precisa ser traduzido para binário de forma a ser executado, processo denominado
montagem e, quando automatizado, o programa que a realiza é denominado
assembler (montador).
Por fim, uma vez que a quantidade de processadores disponíveis para uso é
enorme e não necessariamente existe uma equivalência entre os endereços de
memórias e outras instruções entre eles, foram criados os compiladores, aos quais
geram rotinas em linguagem de máquina para cada instrução da linguagem de alto
nível, otimizando posteriormente código e alocação de variáveis. O desempenho de
códigos rodados através de um compilador (ex.: feitos em C ou FORTRAN) acaba
por ter um desempenho menor que em relação aos escritos diretamente em
assembly (cuja tradução para código de máquina acaba por ser “um para um”).
4.2 – Arquiteturas x86 e x86_64
A arquitetura x86 é o nome dado à arquitetura de processadores baseados no
Intel 8086, da Intel Corporation, que foi desenvolvido em 1978. Apesar de ser
baseada em processadores antigos, diversos incrementos foram feitos a esta
arquitetura, quase sempre com compatibilidade retroativa. A x86 foi substituída em
detrimento à arquitetura x86_64 (ou x64) criada pela AMD, mas ainda possui suporte
nos processadores modernos.
O modelo 8086 original possui 8 registradores de uso geral (sendo 4 referente a
dados e 4 referentes ao endereço), 4 registradores de segmento, um apontador de
instruções e um registrador de flags, cada um com 16 bits de tamanho. Além disso,
existe o barramento externo de endereço de 20 bits, a memória endereçada a bytes
e organizada em segmentos de 64 kbytes (que estão em MOD16).
Figura 4.2: Processador Intel 8086, visivelmente maior que os processadores atuais.
Foto: Konstantin Lanzet / Wikimedia Commons.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 35
À medida que se foi crescendo a necessidade de tratar com mais informações e
maiores números, os registradores de 16 e 32-bits da arquitetura x86 acabaram por
se tornar insuficientes. Sendo assim, a arquitetura x86_64 acabou por surgir de
forma a suportar maiores valores de memória virtual e real. Entretanto, a
incompatibilidade dentre softwares gerados na arquitetura x86 e x64 fez com que
fosse adotada uma retrocompatibilidade para a arquitetura anterior.
Especificamente falando, a arquitetura x86_64 tem como característica primária a
disponibilidade de uso de registradores de uso geral com 64-bits (como endereços
virtuais de 64-bits ou aritmética de inteiros), além de instruções SSE (Streaming
SIMD Extensions).
Empresas como a Sony e a Microsoft utilizam a arquitetura x86_64 para o
desenvolvimento de hardware de ponta, como o Playstation 4 e o Xbox One, a
serem lançados no final de novembro deste ano.
4.3 – Unidade de Processamento Gráfico
A indústria do entretenimento – principalmente voltada a jogos e animações – se
utiliza de bastantes cálculos matemáticos para a renderização de texturas,
iluminação, tesselation e shading, por exemplo. Da forma que um processador
convencional é projetado, não é possível se ter a realização de uma grande gama de
cálculos simultâneos, visto que normalmente eles possuem apenas um valor limitado
de núcleos de processamento, comumente variando de um a dezesseis, e
normalmente operam em instruções lineares.
Sendo assim, as GPUs – termo para “Unidade de Processamento Gráfico”
popularizado pela Nvidia em 1999 – surgiram de forma a serem dedicadas para
problemas gráficos. A primeira GPU foi inclusa no computador Commodore®
Amiga™, a qual era capaz de desenhar retas, preencher áreas e incluía um
processador de fluxo capaz de acelerar o movimento, manipulação e combinação de
bitmaps. Já em 1999, a Nvidia lançou a GeForce 256, que já possuía transformadas
integradas, iluminação, renderização de triângulos e engines de renderização
capazes de processar um mínimo de 10 milhões de polígonos por segundo. Zahran
(2012) descreve a história dos recursos adicionados nas GPUs da seguinte forma:
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 36
Figura 4.3: Relação de recursos de GPUs ao longo dos anos.
Para as siglas, verificar lista de abreviações e símbolos.
Adaptado de Zahran, 2012.
Entretanto, a utilização de GPUs por parte de cientistas para a resolução de
problemas físicos acabou por ser demasiadamente complicado e somente no ano de
2006 foi que as mesmas acabaram por se tornar um dispositivo mais genérico,
conhecidos como GPGPU (do inglês, General Purpose Graphics Processing Unit) e
começaram a ter ferramentas das fabricantes das mesmas, entre as quais se
destacam o CUDA, modelo de programação mais adotado nos dias de hoje, e o
OpenCL, gerenciado pelo consórcio Khronos Group.
O modelo de funcionamento de uma GPGPU é relativamente simples de se
entender. Basicamente, existe o host, consistindo do componente de CPU ao qual é
possível configurar kernels (leia-se funções) para o device, que é a unidade de
processamento gráfico propriamente dita. Conforme pode ser visto na figura 4.4, a
ideia consiste em alocar espaço de memória previamente determinado pela CPU na
GPU, transferir a informação, executar o kernel, retransferir a informação da GPU
para a CPU e, por fim, desalocar o espaço de memória reservado.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 37
Figura 4.4: Arquitetura de uma GPU.
Dentro do device, são executadas as funções previamente estabelecidas pela
CPU – os kernels – as quais determinam os cálculos a serem realizados. A estrutura
de GPUs é dividida em processos (threads), blocos e grids, onde cada grid comporta
vários blocos e cada bloco possui suas próprias threads. Não existe comunicação
entre threads de blocos diferentes, apesar de ser possível sincronizá-las (ou seja,
dado que o modelo utilizado seja assíncrono, é possível aguardar que todos os
processos sejam finalizados de forma a continuar para a próxima ação), sendo
somente possível através do barramento L2 (ou memória compartilhada) a qual se
configura de alguns poucos kilobytes a depender do hardware utilizado.
Figura 4.5: Relação de grids, blocos e threads em uma GPU.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 38
Conforme poderá ser visto no capítulo seguinte, o nível de paralelismo de uma
GPU está ligado ao número de threads e blocos as quais o programador deseja, e
nem sempre é óbvio determinar como paralelizar um determinado problema.
Outro problema comum se refere à alocação manual de memória por parte do
programador, o que faz com que os erros de overflow sejam comumente incidentes.
Além disso, até recentemente, existia o problema de que o device só executava um
kernel por vez, e a transferência de dados host-device e device-host acabava por se
tornar incômoda para experimentos complexos; tal problema foi recentemente
solucionado com a introdução da versão 5.0 do CUDA através do recurso de
Paralelismo Dinâmico (Dynamic Parallelism).
Em questão de adoção pela indústria/academia, a utilização de GPUs é de alta
adoção, onde são empregadas em um clusters heterogêneos, primariamente de
CPUs e GPUs. A título de curiosidade, o Instituto Internacional de Física, da UFRN,
conta com 4 placas NVIDIA Tesla combinadas com 64 CPUs do modelo Intel Xeon,
enquanto um dos clusters da Petrobrás, denominado Grifo04, conta com 1088 GPUs
do modelo NVIDIA M2050 e 544 CPUs, sendo que a quantidade de núcleos de
processamento somados acaba por ser um valor aproximado de 487 mil.
4.4 – Outras Arquiteturas
Apesar de serem bastante utilizadas em sistemas desktop ou mesmo em
mainframes, as arquiteturas acima discutidas começaram a entrar em declínio diante
a outras em questão de popularidade ou de eficiência. Mesmo não estando no foco
deste trabalho, duas arquiteturas relativamente modernas merecem ser citadas.
Em questão de popularidade, as arquiteturas tradicionais de CPUs (x86 e
x86_64) começaram a ser superadas pela arquitetura ARM, desenhada e fabricada
pela empresa homônima, inicialmente na década de 1980. Tal arquitetura usa o
conjunto de instruções computacionais reduzidas (RISC), o que faz com que elas
usem menos transistores que os processadores modernos (CISC), e isso leva ao
fato de uma maior eficiência energética, além de custos mais baixos de fabricação e
menor dissipação energética, o que praticamente induz ao fato que a mesma seja
bastante utilizada em dispositivos embarcáveis, como tablets e celulares. Segundo a
própria ARM, os modelos mais recentes, como o ARMv6 ou o Cortex-A8, fogem do
modelo de computador de von Neumann e seguem em direção à arquitetura
computacional Harvard.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo IV – Arquitetura de Computadores
página 39
Outra tecnologia em ascensão para o uso em computação de alta performance
são as FPGAs (Field-Programmable Gate Array). Segundo a Gidel, empresa de
desenvolvimento de ferramentas para FPGAs, a implementação de um algoritmo
RTM em uma FPGA pode ser até cerca de 2 vezes mais eficiente em relação a uma
GPGPU, o que faz com que as FPGAs acabem por se tornar bastante pesquisadas
na indústria. Ainda assim, Singh (2011) destaca que programadores tem dificuldades
de utilizá-las como dispositivos multinúcleos para acelerar aplicações paralelas,
onde FPGAs rodam em torno de linguagens de programação RTL (VHDL / Verilog)
que podem ser tão complexas quanto código de máquina.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
Capítulo V – Paralelismo Aplicado
5.1 – A Geofísica e a Computação de Alto Desempenho
Boa parte dos supercomputadores hoje em dia, aqueles realmente incríveis, são
usados para a geofísica – tanto para a pura quanto a aplicada. No tocante à
geofísica pura, temos a meteorologia, a qual tenta prever o tempo a partir de
modelos extremamente complexos e bastante fundamentados em cálculos
matemáticos, sendo um exemplo o supercomputador Tupã, localizado no Instituto
Nacional de Pesquisas Espaciais (INPE). Já quanto à geofísica aplicada, temos os
clusters utilizados por empresas de processamento sísmico, onde os mais diversos
algoritmos são rodados em pesados dados obtidos com técnicas de aquisição 3D.
Tais supercomputadores são formados a partir da união de diversos elementos de
computadores – como processadores, memórias e discos rígidos.
Segundo Grama et al (2003), o papel da concorrência em acelerar elementos
computacionais foi reconhecido ao longo de décadas, sendo a importância da
mesma ficando atrelada à Lei de Moore com o passar do tempo. Esta lei, que na
realidade deve ser considerada mais uma conjectura do que uma lei, foi concebida
em 1965 por Gordon Moore (co-fundador da Intel) e trata sobre o número de
transistores em um chip, que deveria duplicar a cada aproximadamente dois anos.
Entretanto, Borkar e Chien (2011) citam que a quantidade exponencial de
transistores presentes em um chip nem sempre se traduz em um ganho prático de
desempenho de CPU – na verdade, em um sistema mononuclear, se dobrarmos a
densidade de transistores, o circuito ficará 40% mais rápido enquanto o consumo
energético manter-se-á constante.
Sutter (2005) comenta que, nos últimos 30 anos, as fabricantes de CPUs
conseguiam aumentar a performance da CPU através da frequência de ciclos
(clock), da otimização de execuções e do cache, de forma que códigos
mononucleares acabavam por se tornar nativamente mais rápidos sem nenhuma
alteração. Entretanto, existe um limite para o qual um clock pode ser aumentado – e
quanto maior o valor deste clock, normalmente dado em gigahertz, mais eficiente
deve ser o sistema de resfriamento – de forma que para gerenciar melhor o
problema da dissipação térmica, as fabricantes começaram a favorecer o modelo
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 40
multinuclear. Sendo assim, softwares devem ser escritos para tirar proveito disso,
uma vez que o uso de multinúcleos não é intrínseco às instruções contidas no
processador e/ou compilador nativamente.
Este capítulo visa fazer uma revisão bibliográfica sobre os principais conceitos de
paralelismo em processadores convencionais e gráficos, citando também as
diversas ferramentas que são utilizadas por desenvolvedores.
5.2 – Fundamentos de Computação Paralela
5.2.1 – Tasks e Threads
Uma vez que os processadores começaram a ter diversos núcleos de
processamento, foi possível começar a criar concorrência de forma que cada
processador seja capaz de executar atividades (id est, cálculos) diferentes. A
paralelização de um algoritmo está intrinsicamente ligada à decomposição do
mesmo em diversas tarefas (do inglês, tasks). Em um exemplo básico, podemos
ilustrar a distribuição de tarefas relacionadas a uma soma de uma matriz segundo o
algoritmo abaixo.
Figura 5.1: Algoritmo de matriz.
Existem diversas técnicas de decomposição de dados para tarefas, dentre
estas se encontram as recursivas, decomposição de dados, decomposição
exploratória e especulativa. Segundo Grama et al. (2003), a primeira técnica é
utilizada em problemas que podem ser resolvidos através da estratégia de dividir-e-
conquistar, dividindo um problema maior em subproblemas independentes,
redividindo novamente até que se tenha um resultado, ao qual resolverá os
problemas maiores através de recursividade. A técnica de decomposição de dados
consiste em dois passos: no primeiro, o dado é particionado e, na segunda, a
partição do dado é usada para induzir a partição de computação em tarefas, que
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 41
costumam ser similares (um exemplo básico desta técnica é a usada no algoritmo
demonstrado acima). Já a decomposição exploratória é usada para decompor
problemas computacionais que correspondam a uma busca em um espaço de
soluções, enquanto a decomposição especulativa fundamenta-se em criar
paralelismo quando um programa escolhe usar um dos ramos processados
dependendo do cálculo precedente a esta escolha.
Threads consistem em instâncias geradas por cada cálculo, como, por
exemplo, no código abaixo:
Algoritmo 5.1: Calculador de Produto Escalar entre duas matrizes.
Neste caso, o loop deste código terá n² instruções, onde cada sequência é
executada independente e idealmente ao mesmo tempo, sendo denominada thread,
onde cada thread gerada poderá ser responsável pelo código executado em i=0 e
j=0, outra por i=0 e j=1, até o final da rotina em questão.
5.2.2 – Condições de Corrida
O manual do sistema operacional FreeBSD (2013) define a condição de
corrida (do inglês, race condition) como sendo o “comportamento anômalo causado
por uma dependência inesperada dos timings relativos dos eventos”, e pode ocorrer
em circuitos lógicos, sistemas eletrônicos e em sistemas distribuídos ou paralelos.
Em processamento paralelo, ele ocorre quando diferentes threads em
execução dependem de um estado compartilhado, e o resultado final depende do
escalonamento dos processos.
Panetta (2012) estabelece o seguinte exemplo para descrever uma condição
de corrida em processadores múltinucleos:
“Duas pessoas retiram, simultaneamente, R$ 100 da mesma conta em dois
terminais bancários (M1 e M2) conectadas ao mesmo tempo no computador central.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 42
O saldo da conta era R$ 1000 antes dos saques, e cada um obtém R$ 100 e o novo
saldo fica como sendo R$ 900!”
Tal problema ocorre pelo fato que ao ter um pedido de saque, o computador
central passa simultaneamente a informação de que a conta tem 1000 reais, e
atualiza o novo valor para 900 (1000 – 100) duas vezes. Desta forma, foi gerada
uma condição de corrida, já que o valor correto (R$ 800) não foi alcançado.
Estes tipos de situação podem ser evitados facilmente através de boas
práticas de programação e o entendimento necessário de técnicas de programação
concorrente.
5.2.3 – Métricas
Existem várias métricas para se verificar o quão efetiva foi a paralelização de um
determinado algoritmo. Aqui, vamos denotar o tempo de execução serial como
sendo Ts e o tempo de execução paralelo como sendo Tp. A primeira métrica mais
recorrente é o Speedup, denotada por S, que basicamente trata do ganho de
performance ao paralelizarmos determinada aplicação em detrimento à sua
execução serial. Matematicamente, é definida como sendo a razão do tempo gasto
em um processador pelo tempo gasto em N processadores.
𝑆 =𝑇𝑠𝑇𝑝
Equação 5.1: Formulação matemática do Speedup.
Um speedup ideal, ou linear, ocorre somente quando S = N; ou seja, dobrar o
número de processadores implica em dobrar a velocidade de execução. Entretanto,
a Lei de Amdahl, apresentada em 1967 por Gene Amdahl, estabelece que o
speedup de um programa com N processadores é limitado pelo tempo necessário
pela fração sequencial do programa a ser executada, de forma que acaba por ser
impossível ter um speedup ideal. Sendo assim, a fórmula acima seria transformada
em:
𝑆 =1
𝐵 +1𝑛 (1 − 𝐵)
Equação 5.2: Formulação matemática da Lei de Amdahl.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 43
No caso da paralelização, a Lei de Amdahl declara que se P é a proporção
paralela e (1 – P) a proporção que não pode ser paralelizada (serial), então o
máximo speedup que pode ser atingido é dado por:
𝑆 =1
(1 − 𝑃) +𝑃𝑁
Equação 5.3: Cálculo do speedup máximo.
Em um gráfico, como visto abaixo, teremos que à medida que N tende a infinito,
o máximo speedup tende a 1/(1-P), onde o interesse acaba por fazer com que a
parte serial seja o menor valor possível, mas que o mesmo tende a ficar constante
independente do número de processadores utilizados.
Figura 5.2: Gráfico da Lei de Amdahl.
Modificado de Wikimedia Commons.
Outras métricas de paralelismo são a eficiência e o custo. A primeira mede a
fração do tempo para qual um elemento de processamento é empregado de forma
útil, sendo matematicamente definido como a razão entre o speedup e a quantidade
p de processadores.
𝐸 =𝑆
𝑝
Equação 5.4: Eficiência computacional.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 44
A eficiência é um valor que varia entre 0 e 1, sendo o valor ideal ocorrendo
quando S = p = 1.
Por fim, existe o custo de resolver um problema em um sistema paralelo como
sendo o produto do tempo de execução paralela pelo número de elementos
processados usados. Tal produto reflete a soma do tempo que cada processador
usou para resolver o problema.
5.3 – Bibliotecas Paralelas
5.3.1 – OpenMP / OpenACC
O OpenMP (Open Multi-Processing), desenvolvido por um consórcio
composto de empresas como AMD, IBM, Intel e Cray, consiste em uma
implementação de multithreading para CPU no método fork-join (“dividir e
conquistar”) e acabou se tornando um padrão de-facto. Existem diversas
implementações, sendo as mais populares estando em C e FORTRAN, mas não é
raro encontrar integrações com linguagens como Python. A versão 3.1 é suportada
pelos mais diversos compiladores, entre os quais é possível citar o GCC 4.3.1, os
compiladores da Intel® (icc e ifort) além do Visual Studio™, da Microsoft.
No modelo de execução determinado pelo OpenMP, ilustrado na figura 5.3,
temos a divisão do programa dividido em partes sequenciais e partes paralelas. Na
porção paralela do código, normalmente determinado pela diretiva
, temos o mesmo código executado simultaneamente por diversas
instâncias, cujo número é previamente definido pelo programador, e que serão
diferentes basicamente a partir de determinadas variáveis que dependem do número
da instância no processador. Após isso, os resultados são juntados na parte serial
onde pode ou não ter mais regiões paralelas.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 45
Figura 5.3: Modelo de execução do OpenMP, onde cada triângulo representa
um núcleo (ou processador) de uma CPU qualquer.
Mais recentemente, o padrão OpenACC, desenvolvido pela Cray, CAPS,
Nvidia e PGI veio a tentar simplificar a programação paralela em sistemas
heterogêneos, como GPUs, através de uma fácil implementação aos moldes do
OpenMP, e atualmente é planejado a fusão do OpenACC com o OpenMP.
5.3.2 – MPI
Assim como o OpenMP, o MPI (Message Passing Interface) teve sua versão
1.0 apresentada em 1993 e acabou por se tornar um padrão de-facto, sendo
basicamente um protocolo de comunicações usado para computação distribuída.
Sua versão mais estável, em dezembro de 2013, é a 1.6.5.
O MPI consiste em rotinas para computação distribuída, estando disponível
nativamente em um grande número de linguagens de programação, tais como
Python, Java, C e FORTRAN (através, respectivamente, das implementações
mpi4py, Open MPI Java, MPICH e Open MPI FORTRAN).
Seu modelo de implementação está ilustrado na figura 5.4, onde cada
máquina associada (ou núcleo de processamento) é definida por um “rank” (i.e.
número de identificação) e, entre a comunicação de cada uma existirá um “Sender”,
responsável pelo envio de determinada informação (buffer), e um “Receiver”, que é a
máquina responsável pelo recebimento da mesma; elas se comunicam entre si
alternando seus papeis.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 46
Figura 5.4: Modelo de execução do MPI.
Adaptado de Thomadakis, 2010.
Uma vez que o protocolo MPI trata de computação distribuída, onde
normalmente muitas máquinas estão juntas em uma única rede, existe o problema
de possíveis gargalos na mesma durante uma troca massiva de informações entre
diversos computadores. Como solução, é comum associar o uso de MPI a sistemas
de rede no padrão InfiniBand ou Ethernet de altas velocidades (10 gbps, por
exemplo), o que faz com que o custo operacional do cluster em questão seja alto.
Sur, Koop e Panda (2007) citam o MPI como sendo o modelo mais dominante
usado na computação de alto desempenho nos dias de hoje. É também de
importância ressaltar que é bastante comum associar o MPI a outros modelos de
programação paralela, como o OpenMP.
Em determinados softwares mais independentes, e dependendo do sistema
operacional, o MPI pode ser substituído por alternativas mais simples e rápidas de
implementação, como o shell script (bash) do Linux, ao qual o gerenciamento das
tarefas fica a cargo do próprio cerne do sistema operacional, e não do software
desenvolvido; tal gerenciamento costuma ser muito mais propenso a falhas por não
ter, por exemplo, um mecanismo eficiente de sincronização, mas, mesmo assim,
possui um ótimo custo/benefício em relação ao tempo levado para programar.
5.3.3 – CUDA
Esta linguagem foi criada primariamente pela NVIDIA para GPUs de forma a
facilitar o uso de processamento paralelo tanto por parte da comunidade científica
quanto pela indústria do entretenimento. Sua linguagem de programação se baseia
fortemente no ANSI C, com algumas ligeiras modificações em relação ao C puro,
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo V – Paralelismo Aplicado
página 47
sendo compilado através do nvcc (NVIDIA C Compiler), mas também existem
implementações para outras linguagens como FORTRAN, Java, Ruby e MATLAB,
sendo a primeira oferecida pelo compilador PGI e as outras, respectivamente,
possuindo interfaces que são denominadas jcuda, sgc-ruby-cuda e a última
integrada ao próprio MATLAB.
O princípio básico do CUDA trata de transferir as informações existentes em
um dado host para o device (neste caso, a GPU em si) e, em seguida, fazer as
operações nestas, denominadas kernels, e, por fim, transferir a informação desejada
fazendo a operação inversa, do device para o host.
As threads encontram dentro de blocos que, por sua vez, encontram se
dentro de um grid. A paralelização está ligada a quantos blocos ou threads devem
ser iniciados e como eles devem se comportar – cada thread e cada bloco é
identificado por um próprio número de identificação, conforme será mostrado
adiante. Apesar de pouco abstrair em questão de gerenciamento direto de recursos,
o CUDA deixa o programador relativamente livre para escolher como deseja
gerenciar o seu software.
Existem alguns fatores limitantes em termos de hardware e software com o
CUDA. O primeiro trata que as instâncias geradas pelo kernel – as threads – não se
comunicam entre si caso estejam em diferentes blocos, somente através de um
recurso denominado memória compartilhada, que normalmente é um valor bastante
diminuto a depender da placa; tal volume de dados é relativamente pequeno se
comparado à necessidade de quando lidando com matrizes voltadas para o
processamento sísmico. Ainda sobre threads e blocos, segundo a Documentação do
CUDA (NVIDIA, 2013), existe um limite imposto pelo próprio hardware na quantidade
existente de cada um, o que pode dificultar a vida do programador quando lidando
com laços que requeiram uma paralelização mais complexa. Além disso, alocação
de memória também é bastante sujeita a overflows, caso se não tenha o devido
cuidado ao se transferir dados do host para o device.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
Capítulo VI - Performance de um Algoritmo de RTM a
partir de Computação Distribuída e Paralela
6.1 – Medindo Tempos
O algoritmo RTM utilizado para este trabalho foi fornecido pelo Centro
Potiguar de Geociências, através de projeto de iniciação científica, e o mesmo é
composto de três etapas básicas:
1. Extrapolação do campo da fonte
2. Extrapolação do campo do receptor
3. Correlação
Cada uma das etapas encontra-se totalmente independente uma da outra –
ou seja, é executada uma de cada vez - para fins de checkpoints, já que, sem eles, é
possível existir gargalos na memória ou no HD, além da susceptibilidade dos
arquivos a erros de escrita/leitura (o que nos levaria a procurar algum método de
verificação de redundância cíclica).
A figura 6.1 ilustra a partir de que ponto cada tempo é medido em seus
respectivos programas.
Figura 6.1: Fluxograma de medida dos tempos do algoritmo RTM
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 48
O tempo total de execução do algoritmo RTM utilizado é dado pelo intervalo
transcorrido na medida 1 somado com o intervalo transcorrido nas medidas 2 e 3. A
unidade de medida utilizada foi segundos e dada pelo seguinte código em C:
Algoritmo 6.1: Uso da biblioteca time.h para medir tempos.
Como a ideia é estudar os diferentes tipos de arquiteturas computacionais,
optou-se por deixar de fora o tempo utilizado nos processos de leitura/escrita pelo
simples fato de que estes estão normalmente condicionados à velocidade do disco
rígido, que normalmente é limitada – o que não é interessante para este trabalho.
6.2 – Modelo e Parametrização
De forma a testar o algoritmo em questão, foi utilizado o que é conhecido
informalmente como “modelo do sal”. Trata-se de um dado 2D sintético com ampla
variação de velocidade e marcado principalmente pela existência de um domo de
sal. A visualização do modelo pode ser visto na imagem 6.2.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 49
Figura 6.2: Modelo utilizado para o processamento dos algoritmos.
A fonte utilizada para a simulação foi uma Ricker, cujo desenho pode ser visto
na imagem 2.11, com frequência máxima de 30 Hertz. A simulação do tiro para as
implementações single-core, OpenMP e GPU encontra-se localizada centralmente
de forma a tentar captar a maior quantidade de informações relativas ao sal.
6.3 – Condições de Processamento
Para os dados processados em plataformas x86_64, deu-se preferência a
utilizar o supercomputador do Instituto Internacional de Física, da Universidade
Federal do Rio Grande do Norte, por se tratar de uma combinação de processadores
ao invés de diferentes computadores. A especificação dessa máquina pode ser visto
na tabela 6.1:
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 50
CPU 128x Intel® Xeon™ E7
8837 @ 2.67 GHz
Memória RAM 1.96 terabytes
HD 17.5 terabytes
GPU NVIDIA Tesla S2050
SO SUSE Linux ES11
Tabela 6.1: Configurações da máquina do IIF.
Para testes de computação distribuída, optou-se pelo cluster do Programa de
Pós-Graduação em Ciências Climáticas, conhecido popularmente como laboratório
do CoRoT, composto por 20 máquinas de nível workstation, todas devidamente
conectadas com um switch de 1 gbps de forma a evitar gargalos na rede. As
configurações destas máquinas podem ser vistas na tabela 6.2:
CPU Intel® Xeon™ E3-1270
V2 @ 3.50 GHz
Memória RAM 16 gigabytes
HD 1 terabyte
GPU NVIDIA Quadro 600
SO Ubuntu 12.04 LTS
Tabela 6.2: Configurações das máquinas do laboratório CoRoT.
6.4 – Registros de Desempenho
Para fins de simplificação, estaremos usando a nomenclatura “Direto” como
referência ao processamento da propagação direta da onda no algoritmo RTM;
“Inverso” para tempo de processamento da propagação inversa da onda no RTM e
“Correlação” como o tempo de correlação cruzada levado pelo algoritmo em
questão. Além disso, para o OpenMP e para a GPU, cada medida foi repetida 5
vezes, sendo registradas conforme o algoritmo 6.1, de forma a aumentar sua
confiabilidade média.
6.4.1 – x86_64 single-core
O tempo single-core é o básico para comparação de ganho (speedup) em
relação ao processamento paralelo em múltiplos núcleos de CPU ou GPU. O tiro foi
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 51
executado nas posições x = 6.25, y = 0.00 e z = 0.02, o que condiz com parâmetros
de aquisição reais. A tabela 6.3 ilustra os tempos obtidos, juntamente com o desvio
padrão médio de cada um dos processos.
Processo Tempo Médio Desvio Padrão
Direto 189 segundos 4.41 segundos
Inverso 172 segundos 1.94 segundos
Correlação 8 segundos 6.05 segundos
Total 369 segundos
Tabela 6.3: Tempo de processamento utilizando um único núcleo
O resultado final pode ser visto abaixo:
Figura 6.3: Imageamento do algoritmo RTM em single-core.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 52
O proporcionalmente enorme desvio padrão para a medida de correlação
pode ser observado devido à latência presente no servidor de processamento
naquele momento, sendo posteriormente compensado por medidas posteriores.
6.4.2 – x86_64 paralelizado em OpenMP
Para os arquivos compilados em OpenMP, utilizou-se os compiladores da
GNU Compiler Colection (gcc) versão 4.7.3, com suporte ao OpenMP 3.1 onde todo
o código realizado no mesmo está de acordo com o padrão. Os objetos foram
compilados usando a flag , e a linkagem dos objetos ao programa
principal também foi realizada usando tal flag.
A paralelização foi feita majoritariamente nas funções que refletem a
propagação e retropropagação dos dados, tendo pouca expressão em funções
menores e mais rápidas mesmo em modo serial, o que refletiria pouco em resultados
expressivos no runtime. Entretanto, o compilador disponível na máquina em questão
encontrava-se na versão legada 4.3.2, que ainda não possuia algumas
implementações do padrão, de forma que foi necessário remover o código existente
em algumas regiões.
As tabelas 6.4, 6.5 e 6.6 ilustram os tempos de execução do algoritmo em
seus processos diretos, inversos, correlação e total, associados a determinados
núcleos de processamento (1 núcleo de processamento = 1 thread), assim como o
seu ganho de performance em relação ao processamento em single-core.
Nº de Núcleos Tempo Médio Desvio Padrão Speedup
2 núcleos 175 segundos 22.1 segundos 1,08x
4 núcleos 438 segundos 24.7 segundos 0,43x
8 núcleos 1066 segundos 44.2 segundos 0,17x
16 núcleos 322 segundos 50.1 segundos 0,58x
32 núcleos 315 segundos 33.2 segundos 0,6x
64 núcleos 345 segundos 28.6 segundos 0,54x
Tabela 6.4: Tempos de processamento de propagação direta utilizando múltiplos núcleos.
Nº de Núcleos Tempo Médio Desvio Padrão Speedup
2 núcleos 177 segundos 31.5 segundos 0,97x
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 53
4 núcleos 474 segundos 38.2 segundos 0,36x
8 núcleos 846 segundos 27.1 segundos 0,20x
16 núcleos 451 segundos 4.4 segundos 0,38x
32 núcleos 287 segundos 3.9 segundos 0,59x
64 núcleos 372 segundos 9.8 segundos 0,46x
Tabela 6.5: Tempos de processamento de propagação inversa da onda utilizando múltiplos núcleos.
Nº de Núcleos Tempo Médio Desvio Padrão Speedup
2 núcleos 8 segundos 1 segundo 1x
4 núcleos 7 segundos 1 segundo 1,14x
8 núcleos 7 segundos 1 segundo 1,14x
16 núcleos 10 segundos 2 segundos 0,8x
32 núcleos 8 segundos 0 segundo 1x
64 núcleos 10 segundos 2 segundos 0,8x
Tabela 6.6: Tempos de processamento de correlação utilizando múltiplos núcleos.
Excetuando o algoritmo de correlação entre campos, ao qual é imperceptível
o ganho de velocidade para o dado em questão a medida que o número de threads
aumenta, os resultados contra-intuitivos para a escalabilidade, juntamente com
aspectos técnicos da implementação realizada em OpenMP, são discutidos no
capítulo 7 deste trabalho.
O resultado da migração pode ser visto pela figura 6.4, que é claramente
consistente com a do algoritmo original em processamento serial. Trata-se de uma
imagem genérica para 4 núcleos de processamento, mas que se estende para
quaisquer outros valores.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 54
Figura 6.4: Imageamento do algoritmo RTM utilizando 4 threads.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 55
6.4.3 – Tarefas Distribuídas
Para os arquivos compilados no padrão MPI, usou primariamente as libraries
fornecidas pelo repositório do Ubuntu: libcr-dev e mpich2, e todo o código está de
conformidade com a versão 1.6.5 do padrão. O código-fonte utilizado foi compilado
utilizando as mesmas flags do sistema single-core, que inicialmente foi invocado o
mpicc, para a compilação de objetos em C, e o mpic++ para a linkagem dos objetos
em C++. Tais programas invocados servem apenas para inserir parâmetros nos
compiladores originais gcc e g++ (na máquina utilizada, ambos se encontram na
versão 4.5.2). A seguir, usava-se o programa mpirun para rodar os arquivos
desejados, assim como o número de processos executado pelo mesmo.
A ideia básica nesta sessão era de simular um ambiente computacional com
máquinas independentes onde cada uma recebia uma tarefa – neste caso, um tiro –
para processar independentemente uma da outra. A grande questão é que a
implementação por protocolo TCP (ou mesmo por uma rede) é relativamente
complexa, de forma que foram usados núcleos latentes de uma máquina de oito
núcleos para simular máquinas independentes (neste caso, single-core). Tais testes
não possuem nenhuma relação com o OpenMP acima desenvolvido e se rodou 56
tiros ao todo, que foram distribuídos a um determinado número de processos
previamente especificados e, então, foi registrado o tempo de execução de cada um,
conforme especificado na figura 6.1. Os tiros tinham início na posição de fonte x = 0,
y = 0 e z = 0.02 e cada tiro possuía um incremento de 0.25 no eixo x em relação ao
anterior, sendo os valores em y e em z mantidos constantes.
As tabelas 6.7 e 6.8 ilustram, respectivamente, o tempo levado para se
processar o tempo de propagação da onda direta, o tempo de propagação de onda
inversa e seus speedups em relação ao tempo em um único núcleo.
Nº de Processos Tempo de Execução Speedup
1 processo 3604 segundos 1x
2 processos 1847 segundos 1,95x
3 processos 1232 segundos 2,92x
4 processos 1044 segundos 3,45x
5 processos 954 segundos 3,77x
6 processos 828 segundos 4,35x
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 56
7 processos 744 segundos 4,84x
Tabela 6.7: Tempo total levado por um determinado número de processos na
implementação de computação distribuída para o algoritmo de propagação direta do
campo de onda.
Nº de Processos Tempo de Execução Speedup
1 processo 3881 segundos 1x
2 processos 2024 segundos 1,91x
3 processos 1451 segundos 2,67x
4 processos 1171 segundos 3,31x
5 processos 1032 segundos 3,76x
6 processos 931 segundos 4,16x
7 processos 796 segundos 4,87x
Tabela 6.8: Tempo total levado por um determinado número de processos na
implementação de computação distribuída para o algoritmo de propagação inversa
do campo de onda.
Não foi gerada uma tabela de tempos para o processo de correlação entre
campos, uma vez que o mesmo não possui um grande peso computacional e, por
isso, seu speedup acaba crescendo em uma forma quase linear com o número de
processadores envolvidos.
Os resultados individuais para alguns tiros diretos da migração estão
mostrados na figura 6.5. É interessante notar que, idealmente, as migrações
individuais geradas devem ser somadas de forma a gerar a melhor imagem sísmica
possível (com as melhores amplitudes), mas tal processo não foi feito porque não
está dentro do interesse deste trabalho.
Por fim, é de relevância salientar que a discussão detalhada sobre os
resultados obtidos individualmente por cada processo, sobre a técnica de
implementação do código em MPI, juntamente a fatores que possam afetar o
desempenho do mesmo, são discutidos ao longo do sétimo capítulo deste trabalho.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 57
Figura 6.5: Alguns tiros diretos gerados pelo algoritmo RTM em MPI,
usando a opção para visualização.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 58
6.4.4 – GPU
Os códigos relativos ao código para uma GPU (device) encontram-se sempre
em arquivos no formato .cu, por exigência própria do compilador – o NVIDIA C
Compiler (nvcc) – para a geração de objetos. Após isso, os objetos são todos
linkados usando o compilador g++ e as flags e .
A implementação do código CUDA foi totalmente realizada segundo a versão
5.0, mas buscando sempre a retrocompatibilidade com a 4.0, que é a versão do SDK
(Software Development Kit) presente na máquina utilizada. As especificações
técnicas do device seguem na tabela 6.9.
Capacidade CUDA 2.1
Memória Global 1024 megabytes
Número de Núcleos 288 núcleos CUDA
Tamanho do
barramento L2
520 kilobytes
Número máximo de threads
por blocos
1024 threads
Dimensão máxima de cada
dimensão por bloco
1024 x 1024 x 64
Tamanho máximo de cada
dimensão de um grid
65535 x 65535 x 65535
Tabela 6.9: Configurações do sistema do device.
Não houve qualquer controle do número de threads ou blocos gerados pela
GPU, como realizado nas implementações anteriores, dando preferência a usá-la no
seu limite de capacidade para fins de discussões no capítulo seguinte. Foram
transformadas em kernels as funções mais recorrentes (e/ou mais
computacionalmente intensivas), enquanto as que são rapidamente calculadas por
uma própria CPU foram deixadas da forma que existem. O recurso de Paralelismo
Dinâmico – que consiste em um kernel poder chamar outro kernel no próprio device
– não foi utilizado pelo fato da máquina em questão não estar utilizando a versão 5.0
do CUDA, ao qual esta capacidade foi implementada.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 59
A tabela 6.10 ilustra o tempo do processamento levado para se propagar
diretamente, inversamente e correlacionar o campo de ondas, juntamente com o
speedup em relação ao sistema single-core. Foi simulado um tiro no centro do
modelo (posição x = 6.25, y = 0, z = 0.02) e os tempos foram medidos de acordo
com o algoritmo expresso pela figura 6.1. De forma a calcular o desvio padrão,
foram realizadas 5 medidas.
Processo Tempo Médio Desvio Padrão Speedup
Direto 13 segundos 2.69 segundos 14,53x
Inverso 15 segundos 4.11 segundos 11,46x
Correlação 3 segundos 2.07 segundos 2,67x
Total 21 segundos
Tabela 6.10: Tempos relativos à execução do algoritmo RTM em uma GPU.
A figura 6.6 ilustra o resultado final da migração realizada através de GPU e é
facilmente visível que o resultado é facilmente comparável ao da versão single-core,
o que nos leva a induzir o fato de que a paralelização não prejudicou o algoritmo. A
discussão sobre a implementação, análise dos resultados obtidos e uma
comparação com outras metodologias pode ser vista no próximo capítulo.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VI – Performance de um Algoritmo de RTM
a partir de Computação Distribuída e Paralela
página 60
Figura 6.6: Resultado do modelo migrado pelo algoritmo RTM paralelizado em CUDA.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
Capítulo VII – Análise dos Resultados Obtidos
Este capítulo tem por objetivo a discussão dos resultados obtidos e mostrados
ao longo deste trabalho.
Foram testados implementações de computação paralela em processadores
convencionais, computação distribuída e, por fim, o uso de GPUs para o algoritmo
de migração. Os benchmarks provam facilmente que a última alternativa dá um
retorno muito maior, apesar de ter uma complexidade para implementação muito
maior graças a um alto grau de abstração envolvida por parte do CUDA e até da
biblioteca para arquiteturas heterogêneas, a OpenCL. É natural imaginar que quanto
mais complexo o modelo, tanto geologicamente quanto computacionalmente, mais
expressivo será o tempo de processamento, ainda mais se tratando de um sistema
de um único núcleo de processamento.
A maior surpresa, no entanto, resume-se à implementação através do
OpenMP ao qual se obteve o resultado totalmente oposto ao desejado, um
decréscimo no Speedup, ao invés de aumento, como ilustrado pela figura 7.1.
Figura 7.1: Gráfico de Speedup por Threads (até 64 threads) para a implementação
do OpenMP para o algoritmo de propagação direta da onda.
Pelo gráfico, é fácil observar que o speedup cai a partir de 4 threads e, a partir
de 16 threads, mantém-se quase constante em um valor próximo a 0,6. Existem uma
gama de possíveis motivos para se ilustrar esse fato; entre os quais, vamos citar o
compilador utilizado e a própria especificação da biblioteca de paralelização.
0
0,2
0,4
0,6
0,8
1
1,2
0 10 20 30 40 50 60 70
Threads x Speedup
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 62
Inicialmente, o compilador utilizado (gcc versão 4.3.x) sequer tem a
especificação da versão do OpenMP 3.0 implementadas. Segundo o changelog, tal
fato foi realizado apenas na versão 4.4, o que deixa implícito que a compilação não
foi totalmente otimizada para o código em questão, que foi projetado na
especificação 3.0, deixando-o mais lento – inclusive, a priori da execução na
máquina, parte do código paralelizado teve que ser removido por não ser compatível
com o OMP 2.5 existente no compilador em questão. Entretanto, mesmo usando
compiladores em versão mais recente, o ganho de speedup é notável, mas o padrão
do gráfico acaba por se repetir, o que leva ao segundo motivo em questão: o
algoritmo, da forma que é estruturado, não possui escalabilidade, esbarrando nas
limitações do OpenMP.
A princípio, o fenômeno de speedup de um determinado número de threads
maior ter menor speedup que um número menor de threads não é incomum mesmo
em códigos que são perfeitamente paralelizáveis e escaláveis, como ilustrado por
Dalke (2012) quando tentou comparar implementações através de POSIX, que são
comumente mais utilizadas a nível de programação de sistemas, e de OpenMP de
forma a verificar a eficiência de cada uma, notando que, para o algoritmo de busca
de Tanimoto, o uso de 5 threads possui um runtime consideravelmente mais rápido
que com o uso de 8 threads.
Outro problema advém da própria limitação da especificação. Grama et al
(2003) e o Manual do OpenMP 3.1 (2011) ilustram diversas situações em que se
possui problemas com o paralelismo: mais especificamente, no loop nesting (em
tradução livre, encadeamento de loops) – uma situação em que lidamos com
sistemas de mais de uma dimensão (em que percorremos linhas e colunas de uma
matriz, por exemplo) e tal situação é extremamente recorrente no algoritmo em
questão, muitas vezes em escala pior.
Para fins de implementação, todas as variáveis foram declaradas
manualmente como (onde cada thread possui uma cópia própria da
variável) ou (variável compartilhada) e o número de threads era definido no
próprio código de paralelismo através de uma única variável inteira; desta forma, a
única diferença entre o código feito para rodar em 8 threads para o de 16 threads é o
valor desta variável.
Sendo assim, tomemos como exemplo a função de convolução de pixels
tridimensional, ilustrada pelo algoritmo 7.1 e que é crítica para o desempenho do
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 63
processo de migração. Tal função é composta por 3 laços que variam de 0 até o
tamanho da malha em seu respectivo eixo (x, y, z), o que é algo relativamente
considerável mesmo para um dado sísmico 2D e, logo a seguir, são realizadas
convoluções em cada direção, onde os resultados são somados e insertos em uma
matriz r. Após isso, o loop se repete até que toda a malha do dado tenha sido
percorrida.
Algoritmo 7.1: Convolução tridimensional.
A primeira abordagem para a solução deste algoritmo foi dividir cada
convolução, que também se tratam de laços, em seções independentes (através da
construct) que seriam inicialmente distribuídas para as threads em um
formato de tarefas (tasks) e, após a execução das tarefas, seriam posteriormente
sincronizadas através da construct para ser realizada a soma de forma a
atualizar a matriz em questão. Entretanto, existiram dois problemas intrínsecos a
esta tentativa de implementação: o primeiro quanto ao fato de que não é possível
sincronizar as threads na região desejada – neste caso, dentro de uma -
por limitação da própria biblioteca e nem quanto ao uso de regiões de operação
ou . O segundo problema encontrado decorre ao fato de que
cada thread é independente e não compartilha memória: neste caso, como fazer a
soma de valores em cada convolução individual? À medida que cada laço de
convolução ocorre, um variável soma é atualizada dentro do mesmo; se cada thread
independe uma da outra em um único laço, vamos ter inúmeras variáveis desse tipo
alocada na memória, de diferentes valores, mas sem nenhuma relação entre si. Para
contornar esse problema, lidamos com a cláusula , a qual permite
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 64
armazenar valores em uma variável e, ao fim, fazer uma determinada operação com
todas as existentes. Infelizmente, o OpenMP não permite usar esta cláusula em
cada seção, e sim no conjunto total, o que acaba por se tornar inviável.
A segunda abordagem foi o uso da cláusula , recomendado por
programadores para diversas situações no popular website de perguntas e
respostas StackOverflow. Entretanto, o algoritmo em questão trata de situações em
que os loops não estão associados, sendo impossível o uso deste recurso.
Outra alternativa utilizada foi a paralelização de cada laço existente, o que se
tornou totalmente inviável devido ao grande número de threads gerados, o que
sobrecarregaria bastante cada processador e deixaria o processo mais lento como
um todo. No CUDA, tal problema se torna relativamente mais simples graças à
própria estrutura do grid de paralelização, que é tridimensional; tal fato será discutido
adiante. Juntamente ao problema acima, paralelizar os laços mais internos são
técnicas não recomendadas por programadores mais experientes devido a
comportamento anômalos do OpenMP; além disso, nenhum resultado satisfatório foi
encontrado usando tal abordagem.
A “solução” encontrada – que acabou por não se tornar muito efetiva - foi a
paralelização do loop mais externo usando a cláusula , que
permite o uso ótimo de todos os processadores simultaneamente, reduzindo o efeito
borda (do inglês, edge effect). O uso da função para dar display no número
das threads ativas em diversas fases do algoritmo mostra que a tarefa é bem
distribuída entre os processadores, mas, por algum motivo, o gerenciamento
existente pela biblioteca não é bom, o que acaba por gerar o problema ilustrado pela
figura 7.1.
O problema das threads serem independentes se torna ainda maior quando
lidamos com funções causais ou em que os loops não estejam perfeitamente
alinhados – ou seja, existe algum comando relacionado a uma variável entre um laço
e outro, o que torna a paralelização ainda mais difícil. Tal situação existe em várias
outras regiões do código, e uma abordagem similar à descrita acima foi utilizada,
novamente sem os resultados desejados.
Um pequeno ganho pode ser atribuído ao paralelismo de funções
relativamente mais simples que incluem um laço, mas, infelizmente, tais funções não
são de importância no tempo de execução do algoritmo.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 65
Em suma, a falta de controle sob as threads do OpenMP exigiria o uso de
outra biblioteca de menor nível de abstração, como a OpenCL ou o uso de threads
POSIX, ou que o código, da forma que se encontra, fosse parcialmente, ou até
totalmente, reescrito conforme Nunes do Rosário (2012) detalha em sua dissertação
de mestrado.
No tocante à implementação usando o MPI – que o faz através do paradigma
SPMD (single program, multiple data) - a ideia era simular o uso de máquinas
diferentes através da designação de tarefas (neste caso, tiros) a núcleos de
processamentos latentes, além de também servir para verificar a eficiência deste tipo
de paralelização em comparação a granularidade fina exigida pelo OpenMP. A
implementação realizada, de certa forma, obteve mais êxito que um possível uso do
protocolo de TCP para transmissão de dados na rede do cluster ao qual o dado foi
processado; isso se dá primariamente graças ao fato de que a rede provavelmente
em questão não aguentaria o volume de dados sendo transmitidos de um local ao
outro, o que não é interessante para este trabalho (ao qual o acesso a um único HD
e uma única memória acaba por ser mais útil).
Foi inicialmente criada uma nova função main que é responsável por
inicialmente verificar o rank da máquina que a executou e, com isso, atribuir uma
das atribuições aos processos em questão, podendo estas ser de “supervisor” ou de
“escravo”. O algoritmo 7.2 ilustra através de um fluxograma como o sistema
funciona.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 66
Algoritmo 7.2: Distribuição de tarefas do MPI.
Em uma explicação mais detalhada, só existe um processo que terá a
atribuição de supervisor: o de rank 0, que nada mais é do que o próprio processo
que deu início ao programa em questão. Esse programa é iniciado através da
interface mpirun, ao qual o parâmetro (number of processes) indica quantos
processos desejamos que sejam iniciados paralelamente (e cada um terá um rank
diferente, obviamente). Ao restante dos processos iniciados será atribuída a função
de escravo, a qual os mesmos ficarão esperando uma mensagem proveniente do
supervisor para começar a fazer o que esteja designado para si.
Falando agora sobre o cerne do sistema, é através da função que
o supervisor envia um tiro, neste caso ilustrado pela posição da fonte no eixo x, y e
z, para cada escravo que foi iniciado junto a ele. Nesse meio tempo, os processos
escravo, que inicialmente encontravam-se latentes, recebem um buffer do
coordenador – através da função – e, em seguida, iniciam seus trabalhos
de processar a função do campo de propagação direta ou inversa do campo de
ondas. Ao terminar, tal fato é comunicado ao supervisor que designa outro tiro, com
uma posição de fonte distinta, ao processo comunicante e tal ciclo se repete até que
o número estipulado de tiros seja alcançado. Ao fim, todos os processos são mortos
e o programa, enfim, se encerra.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 67
Foram rodados de 2 até 8 processos simultaneamente, ambos simulando os
56 tiros. Dessa forma, como 1 processo é sempre designado para coordenar tudo,
temos de 1 ( ) até 7 processos ( ) rodando concomitantemente para
processar o tiro propriamente dito. O speedup médio obtido ao se executar o
algoritmo de propagação direta e inversa segue ilustrado pelo gráfico da figura 7.2.
Figura 7.2: Gráfico de speedups obtidos.
Ao fim de cada tiro, o tempo levado por cada processo foi medido e
armazenado; plotando tais 56 valores de cada ciclo, gerou-se os gráficos ilustrados
pelas figuras 7.3 e 7.4.
Figura 7.3: Tempo por processo da propagação direta (em segundos) do campo de ondas.
0
1
2
3
4
5
6
0 2 4 6 8
Speedup x Processos
Propagação direta
Propagaçãoinversa
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 68
Figura 7.4: Tempo por processo da propagação inversa (em segundos) do campo de ondas.
É interessante analisar o padrão existente e que se repete nos quatro
gráficos. A partir de quatros processos, o tempo médio (e, consequentemente, o
speedup) para a execução de um tiro começa a crescer de forma notável, indo de
uma média de 65 segundos, ao usarmos 3 processos escravos, para algo em torno
de 92 segundos quando em vista do tempo de execução com a parametrização
np=8. Graficamente, o padrão do speedup para de se comportar linearmente e
começa a rumar à estabilização.
Existem diversas possíveis explicações para o fenômeno acima ocorrido,
conforme apontadas por Kauer et al (2013), citando problemas relativos à leitura de
memória e do gargalo de comunicação, como o realizado pelo HD em comum, que
possa ser compartilhado entre os vários processadores.
Já Garcia (2013) aponta que um possível problema ocorre devido ao
escalonamento de processos por parte do cerne do sistema operacional, neste caso,
o Linux, que não é capaz de fazê-lo de forma totalmente eficiente.
Outra possível explicação é o uso da tecnologia hyper-threading usado pelos
processadores Intel em questão. Tal tecnologia permite criar, a partir de um núcleo
físico, dois núcleos virtuais (ou lógicos) para o sistema operacional e dividir o
trabalho entre eles. Tais núcleos virtuais são independentes, da forma que se um
falhar, o outro não necessariamente seguirá o mesmo destino. Em curiosidade, a
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 69
edição 01 do volume 06 do Intel Technology Journal (2002) afirma que a primeira
implementação dessa tecnologia usou apenas 5% a mais de área no processador,
enquanto a performance aumentou em torno de 10 a 30% e Casey (2011) sugere
novas métricas para a avaliação de desempenho em sistemas com hyper-threading,
dentre as quais se destacando a Hyper-threading Effectiveness, que é uma revisão
da Lei de Amdahl, discutida previamente em outros capítulos.
Antes de continuar, é necessário observar que o processador em questão tem
4 núcleos reais e, graças a isso, o fato acima citado pode ser facilmente comprovado
através de uma análise simples do número de processos atuantes: quando temos
até três processos escravos (ou seja, quatro ao todo, já que existe um supervisor
atuante), o tempo mantém-se aproximadamente constante para todos eles – e isso é
esperado, já que cada núcleo de processamento está correspondendo a um núcleo
físico. Do quarto em diante, começa-se a usar os núcleos lógicos, que são mais
lentos que os reais – e quanto mais processos, mais núcleos desse tipo serão
usados, até o ponto em que . A partir de então, o tempo de processamento
por tiro deve começar a subir de uma forma mais rápida, já que um mesmo núcleo
estará realizando mais de uma tarefa simultaneamente.
Finalizando o ciclo de implementações, foi realizada a conversão de parte do
código das funções do algoritmo em questão – mais precisamente as que
necessitavam uma grande gama de cálculos matemáticos - para CUDA C enquanto
outra parte ficava em modo serial.
Diferentemente do OpenMP, esta tecnologia para arquiteturas heterogêneas
confere maior poder ao programador, podendo o próprio ter controle das threads a
uma granularidade bastante fina, ao mesmo tempo que aumenta a dificuldade de
programação; porém, tal dificuldade pode facilitar a abordagem de paralelização de
determinados problemas, mais precisamente aqueles que são bi ou tridimensionais.
Inicialmente, temos que a estrutura de um grid CUDA é ilustrado pela figura
7.5:
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 70
Figura 7.5: Modelo esquemático de um grid CUDA.
Imagem: Anvar Karimson.
Existem duas principais abordagens para a resolução de problemas de
paralelização em CUDA: a primeira consiste em linearizar todos elementos
existentes em uma dada matriz, enquanto o segundo trata de usar a própria função
x, y, z referente à posição do bloco e da thread, que tem posição única, como pivô
para determinadas operações. É importante ressaltar que foi somente a partir de
dispositivos com Capacidade CUDA 2.0 em diante foi que existiu a possibilidade de
se usar um grid tridimensional; os anteriores a esta versão eram bidimensionais e,
em problemas tridimensionais, era necessário recorrer a alternativas de
programação.
Em um caráter mais técnico, o CUDA C se traduz como sendo um
superconjunto do C convencional (ANSI C/ISO C98), aceitando toda (ou a maioria)
da sintaxe envolvida e, ao mesmo tempo, estendendo as funções intrínsecas à
linguagem. Isso se traduz em uma facilidade de programação para pessoas que já
estão acostumadas a um baixo nível de abstração em termos de hardware, já que
também será necessário a alocação de memória por parte do host no device e
copiar dados para lá e vice-versa que quando mal realizadas podem induzir a um
overflow de memória.
Assim como todos os outros paradigmas analisados, as threads invocadas
pelo kernel em questão são independentes e assíncronas umas das outras, de
forma que a paralelização de sistemas causais ou que dependam de valores de
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 71
outras threads pode ser problemática. De forma a contornar esses inconvenientes,
existe a função de sincronização ( ) e o conceito de memória
compartilhada; entretanto, o volume disponível para tal é relativamente pequeno, o
que não pode ser interessante para aplicações que lidem com uma grande
quantidade de informações.
Para o algoritmo deste trabalho, a implementação CUDA nas funções
desejadas consistiu nas ideias já previamente abordadas, sem nenhum problema
maior, ficando todo o código contido em um único arquivo *.cu que era devidamente
prototipado e os kernels contendo o prefixo de acesso Em poucas
situações foram necessário usar recursos de linearização de matriz para identificar
threads que estejam acima de valores máximos suportados pela GPU, mas foi
bastante comum o uso do fato de threads e blocos estarem em dimensões
diferentes, além de poderem estar localizados, cada um, em duas dimensões,
quando era necessário paralelizar um loop que se encontrava em mais de uma
dimensão.
Os resultados obtidos através da implementação de GPU foram, em sua
totalidade, excelentes, alcançando ótimas métricas de speedup em todas as etapas
do algoritmo. Isso se dá primariamente a grande quantidade de threads que podem
ser executadas simultaneamente, uma vez que o algoritmo realiza operações em um
grid de tamanho do produto das dimensões das malhas nos eixos x, y e z – ou seja,
mesmo que um ótimo sistema computacional serial processasse-o, ele teria que
executar um valor nx*ny*nz de operações que, mesmo que cada uma
individualmente seja rápida, ainda levará um oneroso tempo, enquanto que a
estrutura da GPU permite que esses cálculos sejam divididos por um grande
número, já que muitos cálculos são realizados paralelamente.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VII – Análise dos Resultados Obtidos
página 72
Figura 7.6: Gráfico comparativo de speedups obtidos em cada tipo de paralelização.
É simples notar que as GPUs obtiveram o melhor desempenho, mas a
pergunta que fica é: qual o custo/benefício, em termos computacionais, desse tipo
de implementação?
Em uma resposta prática: muito alto. Tal performance em GPUs foi obtida em
apenas uma placa de vídeo e que sequer é considerada high-end nos dias de hoje,
e o código sequer está superotimizado para tirar vantagens de recursos mais novos
das mesmas. Na indústria do petróleo, onde se existe muito mais recursos que na
Academia, um cluster de GPUs pode ser facilmente montado e programado a um
custo menor do que a mesma quantidade de processadores convencionais para a
montagem de um sistema através de MPI ou OpenMP, já que estes são limitados
pelo número de núcleos (que comumente é baixo) existente e tendem a rumar para
a estabilidade no valor de speedup rapidamente.
Uma boa sugestão é a utilização dos três paradigmas conjuntamente, onde o
OpenMP ficaria responsável pela distribuição de tarefas em loops seriais, o MPI se
encontraria como distribuidor de tarefas a diversos processadores em uma rede e o
CUDA estaria realizando, juntamente a esses dois, cálculos computacionais mais
intensos.
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VIII – Desafios
Capítulo VIII – Desafios
Apesar de todas as conclusões obtidas no capítulo anterior, chegamos a uma
pergunta básica: devemos parar por aqui?
Quando confrontados com esta pergunta, diversos especialistas – pertencentes
tanto a empresas de óleo e gás quanto de computação – no 13º Congresso
Internacional da Sociedade Brasileira de Geofísica, foram unânimes em responder a
pergunta acima com um sonoro não. Ainda se existe uma dificuldade enorme para
se imagear regiões de alta complexidade estrutural e/ou estratigráfica, e o algoritmo
RTM por si só, apesar de ser um ótimo algoritmo, não é o suficiente para a tarefa em
questão. A imagem abaixo ilustra o poder computacional de acordo com cada
algoritmo.
Figura 8.1: Nível computacional exigido por diferentes algoritmos de migração e
seu respectivo ano ao qual tal nível foi atingido.
Adaptado de Ty McKercher, NVIDIA; Fonte: TOTAL.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET– Relatório de Graduação em Geofísica Capítulo VIII – Desafios
página 74
Algoritmos como o FWI (do inglês, Full Waveform Inversion) possuem uma
resolução de imageamento superior à da RTM, mas é fácil observar que a carga
computacional segue, a partir de 2010, quase que uma reta – e precisamos de
maneiras para lidar com ela além de, ao mesmo tempo, mantermos o runtime sob
controle, ou ao menos em um valor relativamente viável (em termos práticos: não
adianta deixar um dado rodando por dois anos, a chance de ocorrerem problemas
por força maior se torna enorme). O FWI já começa a aparecer em diversos
trabalhos e aos poucos está substituindo o RTM como o padrão-ouro da indústria,
mas isso não importa muito, já que ele será substituído novamente em breve, e tal
ciclo acabará sendo interminável. Para o futuro, têm-se poucas informações do que
está sendo feito por parte das indústrias, mas é interessante ressaltar que
companhias como a Petrobrás testam rotineiramente novas tecnologias, como o
processador Cell, usado no Playstation 3, da Sony, o IBM PowerPC ou o IBM
BlueGene ou até mesmo técnicas de resfriamento por imersão em óleo (neste caso,
usado pela CGG). Universidades e Centros de Pesquisas no mundo inteiro também
desempenham um papel fundamental na formação de mão-de-obra qualificada e
geração de ideias para este ramo. O que é visto atualmente é a tendência de rumo
para uma integração entre CPUs convencionais com GPUs em um único chip,
criando, desta forma, arquiteturas heterogêneas, como o que já é feito com as APUs
(do inglês, Accelerated Processing Unit) da AMD. A pesquisa de materiais que
possam substituir o silício (com um destaque para o grafeno) em termos de
desempenho também é bastante recorrente e isso é bom porque, por exemplo, um
processador de um material que tenha calor específico maior que o silício pode
aguentar uma frequência de processamento também maior, o que induz quase
sempre a uma crescente velocidade. A introdução de um número cada vez mais
superior de núcleos de processamento em GPUs, juntamente com um maior
acoplamento de unidades computacionais para a utilização de computação
distribuída, consistem também dentre o grupo de alternativas usadas para diminuir o
tempo de processamento. Provavelmente, a longo prazo, devemos lidar com todas
essas alternativas acima citadas, com a sobressaliência de uma ou outra. Qual? Só
o tempo dirá.
E de qualquer forma, a jornada é longa, mas as recompensas, definitivamente,
valem a pena.
UFRN/CCET – Relatório de Graduação em Geofísica Referências Bibliográficas
Referências Bibliográficas
BAYSAL, E.; KOSLOFF, D.D.; SHERWOOD, J.W.C. Reverse time
migration. Geophysics, v. 48, n. 11, p. 1514-1524. Society of Exploration
Geophysicists, 1983.
BERENGER, J. A perfectly matched layer for the absorption of
electromagnetic waves. Journal of Computational Physics, v. 114, p. 185-200.
1994.
BORKAR, S.; CHIEN, A.A. The Future of Microprocessors. Disponível em:
http://cacm.acm.org/magazines/2011/5/107702-the-future-of-microprocessors/fulltext
2011.
CLAERBOUT, J. F. Toward a Unified Theory of Reflector Mapping.
Geophysics, v. 36, p. 467-481, 1971.
CHE, S.; LI, J.; SHEAFFER, J.W.; SKADRON, K.; LACH, J. Accelerating
Compute-Intensive Applications with GPUs and FPGAs. Simpósio: Application
Specific Processors. 2008.
CLAPP, R.G. Reverse time migration with random boundaries. SEG
Houston 2009 International Exposition and Annual Meeting. Society of Exploration
Geophysicists, 2009.
COHEN, J.K.; STOCKWELL, J.W.J. The New SU User’s Manual. Colorado
School of Mines, 2008.
COLLINO, F.; TSOGKA, C. Application of the PML absorbing layer model
to the linear elastodynamic problem in anisotropic heterogeneous media.
Institut National de Recherche en Informatique et en Automatique, França. 1998.
COSTA, J.C. Aspectos da Modelagem e Imageamento usando a Equação
de Onda. Apresentação. III Semana de Inverno da UNICAMP. Campinas, 2012.
DALKE, A. OpenMP vs POSIX Threads. Disponível em:
http://www.dalkescientific.com/writings/diary/archive/2012/01/13/openmp_vs_posix_t
hreads.html, acesso em 4 de novembro de 2013.
DUARTE, O.O.D. Dicionário Enciclopédico Inglês-Português – Geologia e
Geofísica. Rio de Janeiro: Sociedade Brasileira de Geofísica, 2007.
FORNBERG, B. Generation of finite difference formulas on arbitrarily
spaced grids. Mathematics of Computation, v. 51, p. 699-706. 1998.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
UFRN/CCET – Relatório de Graduação em Geofísica Referências Bibliográficas
página 76
FREE SOFTWARE FOUNDATION. GCC 4.4 Release Series. Changes, New
Features, and Fixes. Disponível em: http://gcc.gnu.org/gcc-4.4/changes.html,
acesso em 4 de novembro de 2013.
GARCIA, I.C. Sistemas Operacionais: História e Escalonamento de
Processos. UNICAMP: Campinas, 2013.
GARG, H.N.; SINGH, A.; RAMAMURTHY, G.B.; MARKANDEYULU, C. Cost
Effective Land Seismic Data Acquisition by Geophysical Services of WON
Basin, Gujarat, India. HYDERABAD, 2008. Índia.
GAZDAG, J. Wave equation migration with the phase-shift method.
Geophysics, v. 43, p. 1342-1351. 1978.
GRAMA, A.; GUPTA, A.; KARYPIS, G.; KUMAR, V. Introduction to Parallel
Computing. UK: Pearson Education Ltd, 2003.
HEMON, C. Equations d’onde et modeles. Geophysical Prospecting, 1976,
v. 26, p. 790-821.
KAUER, A.U.; SIQUEIRA, M.L. Escalonamento em Arquiteturas
Heterogêneas – APUs. 13ª Escola de Alto Desempenho do Rio Grande do Sul, p.
135-138. 2013.
KEAREY, P; BROOKS, M.; HILL, I. An introduction to Geophysical
Exploration. UK: Blackwell Science Ltd, 2002.
KOSLOFF, D.D.; BAYSAL, E. Migration with the full acoustic wave
equation. Geophysics, v. 48, p. 677-687.
LIU, H.; LI, B.; LIU, H.; TONG, X.; LIU, Q. The Algorithm of High Order
Finite Differences Pre-Stack Reverse Time Migration and GPU Implementation.
Chinese Journal of Geophysics, v. 53, n. 4, p: 600-610. 2010.
LOEWENTHAL, D. Reversed time migration in spatial frequency domain.
Geophysics, v. 48, p. 627-635.
MCKERCHER, T. How GPU Accelerated Computing Improves
Visualization in E&P Workflow. Apresentação, NVIDIA.
NVIDIA. CUDA TOOLKIT DOCUMENTATION. Disponível em:
http://docs.nvidia.com/cuda/index.html. 2013.
OLHOEFT,G.R. Quality Control in Geophysics. Federal Highway
Administration, U.S. Department of Transportation. Estados Unidos: 2008.
OPENMP ARCHITECTURE REVIEW BOARD. OpenMP Application
Program Interface. Versão 3.1. 2011.
MEDEIROS, D.A. Relatório No. 37 dezembro/2013
página 77
PANETTA, J. Excursionando por OpenMP. III Semana de Inverno de
Geofísica da UNICAMP. Campinas, 2012.
ROSA, A.L.R. Análise do sinal sísmico. Rio de Janeiro, RJ: Sociedade
Brasileira de Geofísica, 2010.
NUNES DO ROSÁRIO, D.A. Escalabilidade Paralela de um Algoritmo de
Migração Reversa no Tempo (RTM) Pré-Empilhamento. Dissertação de Mestrado.
Universidade Federal do Rio Grande do Norte: Natal, 2012.
SEG TECHNICAL STANDARDS COMMITEE. SEG-Y rev 1 Data Exchange
format. Tulsa: Society of Exploration Geophysicists, 2002.
SINGH, D. Higher Level Programming Abstractions for FPGAs using
OpenCL. ALTERA. Apresentação, 2011.
SUR, S; KOOP, M.J; PANDA, D.K. Zero-Copy Protocol for MPI using
InfiniBand Unreliable Datagram. Ohio State University, 2007.
The FreeBSD Documentation Project. FreeBSD Developers’ Handbook.
Disponível em: http://www.freebsd.org/doc/en/books/developers-handbook/. 2013.
THOMADAKIZ, M.E. A High-Performance IBM Power5+ p5-575 Cluster
1600 and DDN S2A9550 Storage for Texas A&M University. Disponível em:
http://sc.tamu.edu/systems/hydra/. 2010.
WEBER, R.F. Fundamentos de Arquitetura de Computadores. Porto
Alegre, RS: Bookman Companhia Editora Ltda, 2012.
YILMAZ, O. Seismic data analysis: processing, inversion and interpretation
of seismic data. Tulsa: Society of Exploration Geophysicists, 2001.
ZAHRAN, M. History of GPU Computing. Notas de aula, New York
University.