Escolar Documentos
Profissional Documentos
Cultura Documentos
DEPARTAMENTO DE COMPUTAO
CINCIA DA COMPUTAO
GOINIA
2012
Trabalho de Concluso de Curso apresentado por Lauro Cssio Martins de Paula Pontifcia Universidade Catlica de Gois, como parte dos requisitos para obteno do ttulo de
Bacharel em Cincia da Computao.
BANCA EXAMINADORA:
AGRADECIMENTOS
Ao Professor Dr. Clarimar Jos Coelho e ao M.Sc. Arlindo Rodrigues Galvo Filho,
orientador e co-orientador acadmicos, pelo apoio e confiana depositada. Aos professores
Dr. Leonardo Barra Santana de Souza e M.Sc. Leandro Barra Santana de Souza por me
incentivarem a tornar um pesquisador e pela inestimvel colaborao. todos os professores
do Departamento de Computao da PUC Gois, especialmente ao professor M.Sc. Alexandre
Ribeiro, por terem ajudado minha formao acadmica. Aos meus colegas de graduao pelas
discusses tcnicas e sugestes.
Eletrobras Furnas, em especial ao Eng. M.Sc. Flvio Mamede, por terem me proporcionado o melhor estgio que j tive.
viii
RESUMO
A epidemiologia computacional consiste no desenvolvimento e uso de modelos
computacionais com o objetivo de compreender a proliferao de doenas do ponto
de vista dinmico. Os modelos computacionais so capazes de simular o comportamento de uma determinada epidemia e seus efeitos na populao de uma regio e
desenvolvem estratgias de controle e preveno de enfermidades. A epidemiologia
computacional prope modelos que classificam indivduos como suscetveis, infectados e recuperados (SIR) e baseados no indivduo (IBM). O modelo SIR considera
a distribuio homognea de indivduos no espao e no tempo e no capaz de
explicar a persistncia ou erradicao de doenas infecciosas. O IBM reproduz as
premissas do modelo SIR para a anlise do indivduo. O custo computacional de
um modelo para simular o comportamento de uma epidemia cresce em funo do
tamanho da populao considerada. Este trabalho implementa o IBM empregando
programao paralela em unidade de processamento grfico (GPU) e arquitetura
de dispositivo unificado de computao (CUDA) visando ganhar desempenho em
relao a implementao tradicional. Os resultados mostram que em algumas
situaes a reduo do tempo computacional fica em torno de 170% e que a taxa
de crescimento com o aumento do tamanho da populao duas vezes menor na
implementao paralela quando comparada com uma implementao sequencial.
ix
ABSTRACT
The computational epidemiology is the development and use of computational
models that aims to understand the proliferation of diseases of the dynamic point
of view. The computational models are capable to simulate the behavior of an
epidemic and its effects on the population of a region and develop strategies of
control and prevention of diseases. The computational epidemiology proposes
models that classify individuals as susceptible, infected and recovered (SIR) and
based on individual (IBM). The SIR model considers the homogeneous distribution
of individuals in space and time and it is not capable to tell the persistence or eradication of infectious diseases. The IBM reproduces the premises of the SIR model
to the individual analyse. The model computational cost to simulate the behavior
of an epidemic grows up with the size of the population considered. This work
implements a IBM using parallel programming through the use of GPUs (Graphics
Processor Unit) compatible with CUDA (Compute Unified Device Architecture).
The goal is to gain performance compared to the traditional implementation. The
results show that in some cases the reduction of computational time is around
170% and the growth rate with the increase of the population size is, in some
cases, two times lower in a parallel implementation when compared to a sequencial
implementation.
Lista de Figuras
1
12
16
17
18
22
25
26
10
38
Variao dos resultados para as curvas das implementaes IBM-C e IBMCUDA com uma populao de 1.000 indivduos. . . . . . . . . . . . . . . . .
39
40
41
42
43
43
17
44
18
46
11
12
13
14
15
16
xi
Lista de Algoritmos
1
21
21
22
22
23
23
23
24
27
10
28
11
28
12
29
13
30
14
34
xii
xiii
Lista de Smbolos
N
S
I
R
Pin f ec
Prec
Pmor
S(0)
I(0)
R(0)
t0
tf
t
t
Taxa de natalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Taxa de mortalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Taxa de recuperacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Coeficiente de transmisso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Tamanho da populao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Indivduos suscetveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Indivduos infectados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Indivduos recuperados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Probabilidade de infeco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Probabilidade de recuperao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Probabilidade de morte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Indivduos inicialmente suscetveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Indivduos inicialmente infectados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Indivduos inicialmente recuperados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Tempo inicial da simulao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Tempo final da simulao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Incremento de tempo entre as iteraes da simulao . . . . . . . . . . . . . . . . . . 7
Derivada em relao ao tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
xiv
Sumrio
1
INTRODUO
2.1
Suscetvel-Infectado-Recuperado . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1
Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2
Equaes do modelo . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1
Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2
2.2.3
2.2
11
3.1
Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.2
Computao paralela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.3
13
3.3.1
Prs e contras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.4
14
3.5
15
3.6
Programao heterognea . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
IBM-C E IBM-CUDA
20
4.1
20
4.2
24
4.2.1
Cdigo do host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
4.2.2
Cdigo do device . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
31
4.3.1
Prs e contras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.3.2
Detalhes de implementao . . . . . . . . . . . . . . . . . . . . . . .
32
4.3
xv
Sumrio
4.3.3
5
34
RESULTADOS
37
5.1
37
5.2
43
CONCLUSES
48
6.1
Consideraes finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
6.2
49
INTRODUO
1 INTRODUO
N S I R
=
+ + , t > 0.
t
t t t
(1.1)
Com base no modelo, a nica maneira de uma pessoa deixar o grupo dos suscetveis
tornar-se infectada e a nica maneira de uma pessoa deixar o grupo dos infectados se recuperar
ou morrer. Assume-se ainda que os recuperados ou os que morrem com a doena so sempre
mais imunes. claro que estas suposies so mais realistas para certas doenas (por exemplo,
catapora) do que para outras (como resfriado comum). Supe-se tambm que todos que no
tiveram a doena so igualmente suscetveis e que a probabilidade de contrair a doena no
tempo t proporcional ao produto de I(t) por S(t). Isto pode ser realista se a populao sendo
considerada consiste de um grupo de aproximadamente mesma idade e do mesmo nvel de
sade geral, se no houver imunidade herdada e se os membros do grupo estiverem misturados
homogeneamente [18].
Os conceitos fundamentais utilizados para formular o modelo SIR so usados para elaborar
o modelo IBM. A estratgia IBM usa fundamentos estocsticos para modelar alteraes nas
caractersticas dos indivduos [17].
O modelo IBM implementado neste trabalho usa a linguagem computacional C++ e suas
extenses para a arquitetura GPU-CUDA [4, 19, 20, 21, 22, 23]. So feitas duas implementaes
para o modelo IBM denominadas, respectivamente, de IBM-C e IBM-CUDA. A implementao
IBM-C uma verso sequencial do modelo IBM. O propsito dessa implementao gerar
resultados para comparar com a verso paralela do modelo IBM. A implementao IBMCUDA feita com o objetivo de reduzir o tempo computacional em relao implementaes
sequenciais.
1 INTRODUO
2.1
Suscetvel-Infectado-Recuperado
2.1.1
Introduo
2.1 Suscetvel-Infectado-Recuperado
SI
Suscetveis
Infectados
Recuperados
Mortos
Figura 1: Representao esquemtica do modelo SIR, conforme mostrado em [1], [2] e [3].
Os indivduos no estado Suscetveis passam para o estado Infectados de acordo com a taxa
de infeco definida para a enfermidade sob anlise.
J a transio entre os estados Infectados e Recuperados ocorre segundo a taxa de recuperao . As variveis e , por sua vez, definem com que frequncia ocorrem nascimentos e
mortes, respectivamente.
Na ocorrncia de um nascimento, h um aumento no nmero de indivduos suscetveis
doena, j que se admite que no h indivduos nascidos nos estados Infectados ou Recuperados.
Em outras palavras, admite-se que cada indivduo que nasce, automaticamente, o mesmo passa
a pertencer classe dos Suscetveis.
2.1.2
Equaes do modelo
IS
dS
= N S
,
dt
N
(2.1)
dI IS
=
I I,
dt
N
(2.2)
dR
= I R,
dt
(2.3)
Tais equaes so diferenciais no-lineares a tempo contnuo. Devido isso, o SIR possui a
caracterstica de ser um modelo determinstico, pois a partir destas equaes pode-se determinar
a quantidade de indivduos, pertencentes uma determinada classe, em algum tempo t.
As equaes 2.1, 2.2 e 2.3 so obtidas a partir de algumas consideraes. A taxa de
infeco, dada pela letra grega , representa o percentual de contatos entre indivduos que se
infectaram durante o contato com indivduos j infectados.
A letra grega representa a taxa de natalidade de novos indivduos por unidade de tempo.
Considera-se que os recm-nascidos so todos suscetveis, no havendo transmisso vertical da
doena ou da imunidade por parte dos pais [3].
A taxa de recuperao e o tamanho da populao so representados pelas letras e N,
respectivamente.
Considerar que o tamanho da populao mantido constante, equivale a afirmar que = ,
isto , taxa de natalidade igual a taxa de mortalidade.
A equao 2.1 representa a quantidade de indivduos pertencentes classe Suscetveis em
um determinado tempo t. A multiplicao dada por N fornece o nmero de indivduos recmnascidos mais os indivduos suscetveis. A multiplicao S indica o nmero de mortes de
indivduos, sendo que isso possvel devido a taxa de natalidade ser considerada igual a taxa
de mortalidade. O termo IS
N fornece o nmero de indivduos que se infectaram.
J a equao 2.2 representa a quantidade de indivduos pertencentes classe Infectados
em um determinado tempo t. O termo IS
N indica o nmero de indivduos que se encontram
infectados. A multiplicao I fornece o nmero de indivduos que se recuperaram, segundo
uma taxa de recuperao . A multiplicao I fornece o nmero de indivduos que morreram.
Utilizando a equao 2.3 possvel representar a quantidade de indivduos pertencentes
classe Recuperados em um determinado tempo t. A multiplicao I fornece o nmero de
indivduos que esto recuperados, e a multiplicao R, assim como nas equaes 2.1 e 2.2,
indica o nmero de indivduos que vieram a falecer.
2.2
2.2.1
Conceitos
P(t) =
2.2.2
.
.
.
T
[CN1 (t) CN2 (t) ... CNn (t)]
A figura 2 mostra o fluxograma para simulao do IBM empregado neste trabalho. Os blocos destacados em cinza na figura so referentes s partes que foram implementadas aplicandose processamento paralelo (utilizado para o IBM-CUDA).
Incio
Gera Populaes
S, I e R
Gerao de
Nmeros
Aleatrios
Teste de
infeco entre
os indivduos
suscetveis
Teste de
recuperao entre
os indivduos
infectados
Teste de
mortalidade para
os indivduos da
populao
t t +t
Sim
t < tf
No
Fim
2.2.3
De modo a obter resultados equivalentes, em mdia, aos do modelo SIR, possvel escolher
valores para os parmetros Pin f ec , Prec e Pmor do modelo IBM [3]. Como o IBM utiliza as
mesmas premissas do modelo SIR, acredita-se que haja uma certa equivalncia entre esses
modelos [17].
A probabilidade de infeco pode ser dada por:
Pin f ec = (I / N)t,
(2.4)
(2.5)
10
J a probabilidade de morte pode ser dada pela multiplicao entre a taxa de mortalidade e
t:
Pmor = t.
(2.6)
Alm disso, o tamanho da populao (N) deve ser o mesmo nos dois modelos.
Por motivos de simplicidade, neste trabalho no explicado o motivo pela escolha dos
valores dos parmetros Pin f ec , Prec e Pmor . Maiores detalhes sobre a equivalncia entre o SIR e
o IBM podem ser obtidos nos trabalhos de Pereira [1] e Nepomuceno [17].
11
PROCESSAMENTO PARALELO NA
PLATAFORMA CUDA
3.1
Motivao
3.1 Motivao
12
GPUs so melhores adaptadas para enderear problemas que podem ser expressos atravs
de clculos realizados de forma paralela [2]. Como o mesmo programa executado para cada
elemento de dado, h menos requisitos referentes controles de fluxo. E, exatamente por ser
executado em muitos elementos de dados, a latncia de acesso memria pode ser ocultada
pela realizao de clculos, ao invs de grandes quantidade de dados armazenados em memria
cache (tipo de memria que serve para armazenar os dados mais frequentemente usados pelo
processador).
Alm disso, pode-se citar vrios tipos de aplicao onde o uso de processamento paralelo
contribui bastante, como por exemplo:
a) Meteorologia (previso de tempo e clima);
b) processamento de imagens (satlites, mdicas etc.);
c) anlise aerodinmica e estrutural;
d) mecnica de fluidos.
Portanto, percebe-se que, atravs da utilizao do poder computacional proporcionado pelas
GPUs, pode-se tentar obter um maior desempenho de processamento dos IBMs em relao aos
mesmos IBMs implementados usando processamento sequencial.
3.2
13
Computao paralela
Como toda tecnologia, a computao paralela possui vantagens e desvantagens. Uma das
vantagens a possibilidade de usar todo o poder de processamento de CPUs e GPUs, de forma
a acelerar clculos [24]. Uma outra vantagem a capacidade de cada processador (ou ncleo
de processamento) ficar responsvel pela execuo de uma tarefa, ou seja, cada um realiza sua
tarefa concorrentemente com o outro.
Outras vantagens relacionam-se com a capacidade de processamento, principalmente quando
se trata da execuo de mais de um programa (ou funo) ao mesmo tempo. Nos processadores
e GPUs atuais, existe tambm uma melhora no acesso memria e na troca de dados entre os
ncleos de processamento.
A principal desvantagem que nem todos os algoritmos so totalmente paralelos e pode ser
complexo reescrever algoritmos para execuo em paralelo. Patterson e Hennessy [25] fazem a
seguinte pergunta: Por que difcil desenvolver programas paralelos que sejam rpidos?
Patterson e Hennessy [25] afirmam que possvel fazer uma analogia entre o overhead
(processamento em excesso) de comunicao para uma tarefa realizada por uma pessoa comparado com o overhead para uma tarefa realizada por um comit, especialmente enquanto o
tamanho do comit aumenta. Embora n pessoas possam ter o potencial para concluir qualquer
tarefa n vezes mais rpido, o overhead de comunicao para o grupo pode impedir isso. A
multiplicao da velocidade por n se torna especialmente improvvel conforme n aumenta.
Como exemplo, imagine a mudana no overhead de comunicao se um comit crescer de 10
para 1.000 pessoas e, depois, para 1.000.000 [25].
Outra razo por que difcil escrever programas paralelos que o programador precisa
saber muito sobre o hardware [25]. Em uma mquina com um nico processador, o programador pode desenvolver o programa com uma linguagem de alto nvel e ignorar grande
parte da organizao bsica da mquina porque, geralmente, o compilador fica responsvel por
isso. J para uma mquina com multiprocessadores ou uma placa de vdeo com vrias GPUs,
infelizmente, isso no to simples.
3.3
3.3.1
Prs e contras
A Compute Unified Device Architecture, tambm chamada CUDA, uma extenso para a
linguagem de programao C, desenvolvida pela NVIDIA, que possibilita o uso de computao
paralela. A NVIDIA uma empresa multinacional que fabrica componentes de computador
(como, por exemplo, chipsets para placas de vdeo, componentes grficos para videogames
etc.). A ideia por trs disso tudo que programadores possam usar os poderes da unidade de
processamento grfico (GPU) para realizar algumas operaes mais rapidamente [26].
14
Atravs da arquitetura CUDA, possvel utilizar as funes de uma placa grfica usando
funes em C (C para CUDA), o que a torna uma ferramenta relativamente simples para
desenvolvedores familiarizados com a linguagem [27]. Uma outra vantagem que, alm de
oferecer uma boa flexibilidade, permite gerar aplicativos bastante otimizados.
Existe, tambm, uma arquitetura chamada OpenCL (Open Computing Language) desenvolvida pela Khronos Group, uma associao de fabricantes destinada a desenvolver padres
abertos [28]. Atravs da utilizao do OpenCL, possvel desenvolver programas que funcionam em plataformas heterogneas, consistindo em CPUs, GPUs e outros processadores. Essa
arquitetura partilha uma srie de interfaces computacionais, incluindo CUDA, o que a torna
uma opo mais ou menos universal [29].
primeira vista, a escolha do OpenCL parece ser mais bvia, devido ao fato de que
seria possvel desenvolver aplicativos que poderiam ser usados em qualquer GPU, em vez de
desenvolver uma verso (utilizando CUDA) para placas da NVIDIA e outra para placas da
AMD, por exemplo. Porm, na prtica essa escolha um pouco mais complicada, j que o
OpenCL oferece funes e extenses que so especficas para cada famlia [27].
Nesse contexto, possvel concluir que h uma necessidade de escolha sobre qual arquitetura utilizar. Com o OpenCL possvel desenvolver aplicativos genricos, isto , aplicativos que
podem ser executados independente do hardware utilizado. Entretanto, isso implica em nivelar
por baixo, utilizando apenas as funes mais comuns, o que resulta em um desempenho longe
do ideal [27]. Por outro lado, na arquitetura CUDA o hardware grfico famoso pelo alto poder
computacional ao processar streams (fluxos) de dados [30]. Porm, a CUDA uma tecnologia
da NVIDIA e, portanto, ela s funciona com placas de vdeo fabricadas por essa empresa.
3.4
Geralmente, uma GPU deve processar apenas dados que so independentes entre si. Portanto, possvel processar vrios dados em paralelo. Neste sentido, GPUs podem ser consideradas como sendo stream processors - processadores que podem operar em paralelo, executando
uma nica instruo em muitos registros em um fluxo de uma vez.
Um stream um conjunto de registros que requerem computao similar, fornecendo
possibilidade de paralelismo de dados.
Kernels so funes que so aplicadas para cada elemento no stream e, em CUDA, podem
ser definidos utilizando o especificador de declarao __global__ [4]. Atravs da utilizao da
tecnologia CUDA, o programador pode definir kernels utilizando a mesma sintaxe da linguagem
C que, quando invocados, so executados n vezes em paralelo por n threads diferentes.
Thread (ou linha de execuo) uma forma de um processo dividir a si mesmo em duas
ou mais tarefas que podem ser executadas concorrentemente. Em CUDA, para cada uma das
threads que executam um kernel dado um nico identificador (local ID) que est acessvel,
dentro do kernel, atravs da varivel threadIdx.
Na chamada de uma funo kernel, deve-se especificar o nmero total de threads da
seguinte maneira:
15
3.5
16
17
3.6
Programao heterognea
Um programa em CUDA consiste de uma ou mais fases que so executadas pelo host (CPU)
ou pelo device (GPU) [22]. As fases que no dispe de paralelismo de dados so implementadas
18
19
O modelo de programao CUDA tambm assume que ambos o host e o device mantm
seus prprios espaos de memria separados, identificados como host memory e device memory,
respectivamente.
Portanto, um programa deve gerenciar o espao global de memria visvel aos kernels
atravs de chamadas funes CUDA, em tempo de execuo. Alm disso, deve tratar de
aes tais como alocao e desalocao de memria do device, e transferncia de dados entre o
host e o device.
20
IBM-C E IBM-CUDA
Neste trabalho, o algoritmo para simulao do IBM homogneo (descrito na Seo 2.2)
foi codificado na linguagem computacional C++ empregando uma implementao inteiramente
sequencial, bem como uma implementao paralelizada empregando a arquitetura CUDA. Tais
implementaes foram denominadas IBM-C e IBM-CUDA, respectivamente.
As sees 4.1 e 4.2 mostram, respectivamente, os detalhes da implementao utilizada para
o IBM-C e para o IBM-CUDA.
J a seo 4.3 mostra os conceitos e detalhes sobre um algoritmo, chamado Mersenne
Twister, que gera nmeros aleatrios atravs da utilizao dos cores de processamento de uma
GPU.
4.1
21
fim
22
GeraPopulacao()
TesteInfeccao()
GeraNumAleatorios()
TesteMorte()
TesteRecuperacao()
Como detalhado na subseo 2.2.2 deste trabalho, os algoritmos 3 e 4 mostram, respectivamente, a implementao das funes GeraPopulao e GeraNumAleatorios:
Algoritmo 3: Gerao dos indivduos da populao para o IBM-C.
incio
para i 1 at TAM_POP faa
se i < N_S_CPU ento
h_pop_CPU(i) S (a letra S indica que o indivduo na posio i do vetor
ir pertencer classe Suscetveis)
seno
se i < (N_S_CPU + N_I_CPU) ento
h_pop_CPU(i) I (a letra I indica que o indivduo na posio i do
vetor ir pertencer classe Infectados)
seno
h_pop_CPU(i) R (a letra R indica que o indivduo na posio i do
vetor ir pertencer classe Recuperados)
fim se
fim se
fim para
fim
23
A funo rand retorna um nmero inteiro pseudo-aleatrio (pseudo-random integral number) no intervalo entre 0 e RAND_MAX [31]. Ento, esse nmero dividido por RAND_MAX
e retornado pela funo random. Desta forma, todos os nmeros retornados esto no intervalo
[0, 1].
RAND_MAX uma constante (definida na biblioteca <cstdlib>) e seu valor padro pode
variar dependendo da implementao, mas concedido a ser de, pelo menos, 32.767 [31].
O algoritmo 5 mostra a implementao da funo random:
Algoritmo 5: Implementao da funo random.
incio
return rand() / RAND_MAX
fim
J os algoritmos 6, 7 e 8 mostram, respectivamente, a implementao das funes TesteInfeccao, TesteRecuperacao e TesteMorte:
Algoritmo 6: Realizao do teste de infeco.
incio
(Teste de infeco entre os indivduos atualmente suscetveis)
para i 1 at TAM_POP faa
se h_pop_CPU(i) = S ento
se h_prob_in f ec(i) < prob_in f ec_CPU ento
h_pop_CPU(i) I
fim se
fim se
fim para
fim
24
4.2
4.2.1
Cdigo do host
De acordo com a seo 3.6 deste trabalho, um programa em CUDA pode ser composto por
um nico cdigo fonte contendo ambos os cdigos do host e do device. Portanto, o cdigo
utilizado para a lgica do IBM-CUDA foi implementado no mesmo arquivo que contm o
cdigo para o IBM-C.
25
Alguns parmetros do algoritmo so comuns tanto para o IBM-C quanto para o IBMCUDA, tais como: TAM_POP, beta, mi, gama, deltaIBM, n_iteracoes, recuperacao e mortalidade (mostrados no algoritmo 1).
J a probabilidade de infeco no comum para ambos os modelos. Isso se deve ao fato de
a probabilidade de infeco estar diretamente relacionada com o nmero de indivduos infectados, como mostrado na subseo 2.2.3 deste trabalho. O algoritmo 1 (na seo anterior) mostra a
declarao de dois parmetros distintos: prob_in f ec_CPU para o IBM-C; e prob_in f ec_GPU
para o IBM-CUDA.
Primeiramente, realizado o processo de alocao de espao na memria do device para
o armazenamento das informaes que sero utilizadas durante o processamento paralelo.
Esse processo realizado atravs de chamadas uma funo padro (definida na biblioteca
<cuda_runtime.h>) chamada cudaMalloc. Assim como mostrado no algoritmo 2, so utilizados
quatro vetores distintos (d_pop, d_prob_infec, d_recuperados e d_mortos) para armazenar os
indivduos da populao e os nmeros aleatrios necessrios nos teste de infeco, recuperao
e morte.
Aps ser concludo o processo de alocao de espao na memria do device, dado incio
ao processo de simulao do IBM-CUDA. A figura 8 representa a sequncia de chamada s
funes kernel:
GeraPopulacao_GPU()
TesteInfeccao_GPU()
RandomGPU()
TesteMorte_GPU()
TesteRecuperacao_GPU()
Conforme detalhado na seo 3.4, na chamada de uma funo kernel necessrio especificar o nmero de blocks e threads por block.
Esse nmero pode ser calculado de acordo com a
raiz quadrada do tamanho da populao ( N). Dessa forma, h uma melhor distribuio entre
o nmero de blocks e threads por block, garantindo-se um melhor aproveitamento dos cores de
processamento da GPU e, consequentemente, um melhor desempenho de processamento.
Para uma populao com N = 1.000 indivduos, por exemplo, 1.000 threads
podero ser
utilizadas para cada uma das funes kernel que so executadas. Como 1.000
= 31,62,
este valor poder ser arredondado para cima, ou seja, para cada uma das funes kernel
podero ser gerados 32 blocks sendo cada block com 32 threads, obtendo-se um total de 1.024
threads. Nesse caso, 24 threads sero inutilizadas, porm isso no afetar no desempenho de
processamento devido ao fato de as threads serem executadas independente uma das outras.
Para garantir isso, necessrio utilizar uma condio de que apenas as threads que contm o
seu global ID (identificador global) menor do que 1.000 executam a funo. Esse procedimento
pode ser visualizado atravs dos algoritmos mostrados na prxima subseo (subseo 4.2.2).
A figura 9 mostra como fica a distribuio das threads entre os blocks, de acordo com o
exemplo citado acima:
26
Thread 0
Thread 1
...
Thread 31
Bloco 0
Thread 0
Thread 1
Bloco 1
...
Thread 31
...
Thread 0
Thread 1
...
Thread 31
Bloco 31
De acordo com a seo 3.4 deste trabalho, cada thread possui seu prprio identificador
(thread ID). Tal identificador chamado local ID (identificador local) e nico para cada thread
pertencente um mesmo block. Para diferenciar as threads entre os blocks, necessrio utilizar
um identificador global. Esse identificador global obtido, em CUDA, da seguinte maneira:
(blockIdx.x blockDim.x + threadIdx.x), onde a varivel blockIdx.x retorna o identificador do
block, e a varivel blockDim.x sempre retorna a quantidade de threads que cada block possui.
J a varivel threadIdx.x retorna o local ID da thread [23].
Aps a chamada de uma funo kernel, o fluxo de execuo para a funo chamada passa
a ser controlado pelo device, que distribuir a execuo nos mltiplos cores de processamento
das GPUs.
Imediatamente aps a chamada de uma funo kernel, a CPU volta a executar normalmente
mesmo se ainda existirem threads sendo executadas. A utilizao da funo padro cudaDeviceSynchronize (definida na biblioteca <cuda_runtime_api.h>) faz com que o fluxo de execuo
na CPU bloqueie at que todas as threads no device tenham sido executadas. Isto necessrio
para que haja um sincronismo entre as threads. Assim, fica garantido a consistncia dos dados
que so executados paralelamente.
Por exemplo, o teste de recuperao somente poder ser realizado aps o teste de infeco
ter sido concludo. Portanto, antes de realizar uma chamada funo TesteRecuperacao_GPU,
deve-se chamar a funo padro cudaDeviceSynchronize para garantir que todas as threads da
funo TesteIn f eccao_GPU tenham sido executadas.
4.2.2
Cdigo do device
27
28
29
30
4.3
31
4.3.1
Prs e contras
O MT fornece uma rpida gerao de nmeros pseudo-aleatrios e foi projetado especificamente para corrigir muitas das falhas encontradas em algoritmos mais antigos. A verso mais
recente e mais usada, MT19937, gera uma sequncia de nmeros inteiros de 32 bits e possui
um perodo de 219937 - 1.
Um perodo, na rea da fsica, o tempo necessrio para que um movimento realizado por
um corpo volte a se repetir. Nesse contexto, o MT garante que um nmero aleatrio gerado
no ir se repetir antes de serem gerados 219937 - 1 nmeros. Alm disso, possui propriedades
importantes, tais como: uso eficiente de memria, boas propriedades de distribuio e alto
desempenho.
Atualmente, alm de ser considerado um gerador de nmeros aleatrios bastante conhecido,
o MT considerado o melhor algoritmo entre todos os geradores j implementados [32].
tambm considerado adequado para simulaes Monte Carlo. Alm disso, j foi aprovado em
vrios testes para aleatoriedade estatstica, incluindo os Diehard tests (uma bateria de testes
estatsticos para medio da qualidade de um gerador de nmeros aleatrios).
No entanto, o MT tem recebido algumas crticas no campo da cincia da computao. George Marsaglia, matemtico e cientista da computao americano, afirmou que da mesma forma
que o MT um timo gerador de nmeros aleatrios, ele deselegante e desnecessariamente
complexo para se trabalhar. Alm do mais, ele no considerado criptograficamente seguro.
Victor Podlozhnyuk [34] afirma que o MT no pretendido para aplicaes criptogrficas,
uma vez que n sadas do gerador suficiente para predizer todos os valores futuros.
32
4.3.2
Detalhes de implementao
O MT (verso MT19937) gera vetores de bits com tamanho fixo de 32-word (palavra de 32
bits) atravs da recorrncia:
upper
lower
|xk+1
)A,
(4.1)
(xk
Aww ;
0
1
0 0 ...
0
0
1 0 ...
0
0
0 1 ...
.
1
.
.
.
.
...
...
1
aw1 aw2 ...
a1 a0
33
Por outro lado, na chamada de uma funo kernel, deve-se especificar uma quantidade
considervel de threads, a fim de fazer com que os cores de processamento da GPU sejam totalmente utilizados [34]. Dessa forma, existe a possibilidade de se obter uma melhor qualidade
nas propriedades de distribuio.
4.3.3
34
35
36
vetor d_Random, apenas 1.000 nmeros sero utilizados, devido ao fato de ser atribudo um
nico nmero para cada indivduo da populao a cada chamada da funo RandomGPU.
Em CUDA, existem algumas recomendaes de prioridade que devem ser levadas em
considerao. Para evitar a elevao de latncia entre as dependncias dos registradores, devese manter, pelo menos, 25% da utilizao total dos cores de processamento da GPU [19, 20].
Sendo assim, maximizando a utilizao dos cores de processamento possvel obter um melhor
desempenho em relao ao tempo computacional.
Alm disso, o nmero de threads por block deve ser um mltiplo de 32, porque isso
fornece uma melhor eficincia de computao e facilita a coalescncia (combinao de parties
adjacentes de memria). No vivel ter 5 blocks de 512 threads cada ou 1.000 blocks de 10
threads cada, por exemplo [19].
Ainda, o comentrio em ingls no incio do algoritmo 14 enfatiza que, para uma coalescncia de escritas em memria, a constante MT_RNG_COUNT deve ser um nmero mltiplo de
tamanho de um warp. Um warp uma unidade de escalonamento de thread em um core de
processamento (streaming multiprocessor) [23].
Portanto, percebe-se que a escolha do valor para NPerRng e MT_RNG_COUNT deve
estar relacionado com o nmero total de threads para se obter uma melhor qualidade nas
propriedades de distribuio da gerao dos nmeros aleatrios.
37
RESULTADOS
5.1
38
900
800
S: SIR
I: SIR
R: SIR
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
Nmero de indivduos
700
R
600
500
400
I
300
200
100
0
0
20
40
60
Nmero de iteraes
80
100
Figura 10: Quadro FX 5800 - Resultados de simulao realizada com uma populao de 1.000
indivduos e um incremento de tempo entre as iteraes igual a 3.
39
800
Nmero de indivduos
700
600
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
500
400
300
200
100
0
4
6
Nmero de simulaes
10
Figura 11: Variao dos resultados para as curvas das implementaes IBM-C e IBM-CUDA
com uma populao de 1.000 indivduos.
40
4500
4000
Nmero de indivduos
3500
R
3000
2500
2000
I
1500
S: SIR
I: SIR
R: SIR
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
1000
500
0
0
20
40
60
Nmero de iteraes
80
100
Figura 12: Quadro FX 5800 - Resultados de simulao realizada com uma populao de 5.000
indivduos e um incremento de tempo entre as iteraes igual a 1,5.
No ltimo caso, para N = 15.000 e t = 0,3, mostrado pela figura 13, nota-se uma
aproximao ainda maior entre as curvas, sendo que os resultados para o IBM-C e IBM-CUDA
se tornam to prximos do modelo SIR de tal forma que as curvas para o SIR quase no podem
ser visualizadas.
41
14000
Nmero de indivduos
12000
10000
8000
6000
I
4000
S: SIR
I: SIR
R: SIR
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
2000
0
0
20
40
60
Nmero de iteraes
80
100
Figura 13: Quadro FX 5800 - Resultados de simulao realizada com uma populao de 15.000
indivduos e um incremento de tempo entre as iteraes igual a 0,3.
Como pode ser observado atravs dos grficos, os resultados obtidos com o IBM-C e IBMCUDA tendem a se aproximar daqueles gerados pelo modelo SIR medida que N aumenta
e t diminui. Isso ocorre devido ao fato de que quanto menor o valor para t, maior ser o
nmero de iteraes. Portanto, existe uma maior probabilidade de os resultados gerados pelo
IBM se aproximarem dos resultados gerados pelo SIR, desde que os valores definidos para os
parmetros do algoritmo estejam de acordo com a subseo 2.2.3 deste trabalho.
A segunda mquina utilizada foi denominada GeForce GT 240. As configuraes desta
mquina so:
a) Processador core i7 860 @ 2.80 GHz;
b) 4,0 GB de memria RAM instalada;
c) 100 GB de HD;
d) Windows 7 Professional, 64 Bits;
e) Placa de vdeo NVIDIA GeForce GT 240, 96 CUDA cores, 1 GB Standard
memory config, 54.4 GB/sec Memory Bandwidth.
As figuras 14, 15 e 16 apresentam, respectivamente, os resultados de simulao realizada
com os mesmos valores de parmetros utilizados nas figuras 10, 12 e 13. Nota-se que os testes
executados em ambas as mquinas forneceram resultados muito similares.
42
900
800
S: SIR
I: SIR
R: SIR
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
Nmero de indivduos
700
R
600
500
400
I
300
200
100
0
0
20
40
60
Nmero de iteraes
80
100
Figura 14: GeForce GT 240 - Resultados de simulao realizada com uma populao de 1.000
indivduos e um incremento de tempo entre as iteraes igual a 3.
4500
4000
Nmero de indivduos
3500
R
3000
2500
2000
I
1500
S: SIR
I: SIR
R: SIR
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
1000
500
0
0
20
40
60
Nmero de iteraes
80
100
43
Figura 15: GeForce GT 240 - Resultados de simulao realizada com uma populao de 5.000
indivduos e um incremento de tempo entre as iteraes igual a 1,5.
14000
Nmero de indivduos
12000
10000
8000
6000
I
4000
S: SIR
I: SIR
R: SIR
S: IBMC
I: IBMC
R: IBMC
S: IBMCUDA
I: IBMCUDA
R: IBMCUDA
2000
0
0
20
40
60
Nmero de iteraes
80
100
Figura 16: GeForce GT 240 - Resultados de simulao realizada com uma populao de 15.000
indivduos e um incremento de tempo entre as iteraes igual a 0,3.
5.2
44
9 x 10
8
7
6
5
4
3
2
1
0
0
4
6
Nmero de indivduos
10
4
x 10
Figura 17: Tempo mdio por iterao para um comparativo entre IBM-C e IBM-CUDA.
Analisando a figura 17 possvel verificar que o IBM-C requer um esforo computacional
que aumenta de forma aproximadamente linear com o tamanho da populao. E, analisando a
curva que representa o tempo gasto pelo IBM-CUDA, observa-se que o tempo tambm aumenta
nesse caso, mas com taxa de crescimento menos expressiva.
Deve-se levar em considerao que, na mquina Quadro FX 5800, para populaes menores
que aproximadamente 20.000 indivduos o IBM-C apresenta um desempenho melhor que o
IBM-CUDA. J na mquina GeForce GT 240, o IBM-C se mostra mais rpido que o IBMCUDA para populaes menores que aproximadamente 25.000 indivduos. Isso ocorre devido
existncia de um overhead (processamento em excesso) de aproximadamente 1103 segundos
associado paralelizao das tarefas na placa de vdeo [3]. Portanto, dependendo da quantidade
de dados a serem processados em paralelo pelos cores de processamento de uma GPU, o
desempenho da CPU poder ser melhor processando os mesmos dados.
A tabela 1 apresenta os comparativos de velocidade com o intuito de se quantificar as
velocidades relativas de execuo entre as implementaes realizadas nas mquinas Quadro
FX 5800 e GeForce GT 240:
45
N indivduos
1.000
5.000
10.000
20.000
40.000
60.000
80.000
100.000
IBM-C Quadro FX
5800 (ms)
0,07227
0,34894
0,70443
1,41854
2,83053
4,25735
5,72074
7,01359
IBM-C GeForce GT
240 (ms)
0,08513
0,39025
0,76944
1,35474
3,01965
4,99490
7,75829
8,85114
Tabela 1: Tempo (em milissegundos) mdio por iterao para cada uma das implementaes.
Atravs da prxima tabela, possvel verificar que a implementao IBM-CUDA, em
ambas as mquinas, apresenta um ganho de desempenho maior ao se comparar com a implementao IBM-C. Alm disso, o IBM-CUDA, na mquina Quadro FX 5800, apresenta um
desempenho computacional mais elevado.
Anlise
Base
Ganho mximo
Quadro FX 5800:
IBM-CUDA
Quadro FX 5800:
IBM-C
165,58%
GeForce GT 240:
IBM-CUDA
GeForce GT 240:
IBM-C
142,35%
Quadro FX 5800:
IBM-CUDA
GeForce GT 240:
IBM-CUDA
142,00%
46
Incio
Sorteia pares da
populao
No
um par S-I?
Sim
Teste de
infeco
X < Xi
Sim
No
Sorteio de
indivduos para
recuperao
Gera nascimentos
e mortes
t t +t
No
t < tf
Sim
Fim
47
48
6.1
CONCLUSES
Consideraes finais
6.2
49
50
Referncias Bibliogrficas
[1] PEREIRA, E. B. Modelos baseados em indivduos para anlise e controle de epidemias
em populaes heterogneas e metapopulaes. Dissertao de Mestrado Instituto
Tecnolgico de Aeronutica, So Jos dos Campos, SP, 2008.
[2] ARRUDA, F. D. B. Simulao de modelos baseados em indivduos para epidemiologia.
Trabalho de graduao Instituto Tecnolgico de Aeronutica, So Jos dos Campos,
SP, 2009.
[3] FILHO, A. R. G.; ARRUDA, F. D. B.; GALVAO, R. K. H.; YONEYAMA, T. Programao
paralela cuda para simulao de modelos epidemiolgicos baseados em indivduos.
Simpsio Brasileiro de Automao Inteligente (SBAI), 2011.
[4] CUDAT M , N. Nvidia cuda c programming guide. 4.0. ed. 2701 San Tomas Expressway
Santa Clara, CA 95050: NVIDIA Corporation, 2011.
[5] LAST, J. M. Dictionary of epidemiology. 1995.
[6] BARABASI, A. L.; OLTVAI, Z. N. Network biology: understanding the cells functional
organization. Nature Rev. Genetics, v. 5, p. 101113, feb 2004.
[7] ANDERSON, R. M.; MAY, R. M. Infectious diseases of humans: Dynamics and control.
Oxford University Press, 1992.
[8] HETHCOTE, H. W. The mathematics of infectious diseases. Society for Industrial and
Applied Mathematics, v. 42, p. 599653, 2000.
[9] CORLEY, C. D.; MIKLER, A. R. A computational framework to study public health
epidemiology. In: . c2009. p. 360363.
[10] APOLLONI, A.; KUMAR, A. V. S.; MARATHE, M. V.; SWARUP, S. Computational
epidemiology in a connected world. Computer, v. 42, p. 8386, 2009.
[11] FERREIRA, A. B. H. Novo dicionrio da lngua portuguesa. 2a . ed. Rio de Janeiro: Nova
Fronteira, 1986.
[12] GRIMM, V.; RAILSBACK, S. F. Individual-based modeling and ecology: (princeton
series in theoretical and computational biology). Princeton University Press, 2005.
[13] VIEIRA, A. L.; TAKAHASHI, L. T.
Biomatemtica, v. 19, p. 109124, 2009.
51
Referncias Bibliogrficas
[15] GRIMM, V.; BERGER, U.; BASTIANSEN, F.; ELIASSEN, S.; GINOT, V. A standard
protocol for describing individual-based and agent-based models. Ecological Modelling,
v. 198, p. 115126, september 2006.
[16] YANG, H. M. Epidemiologia matemtica - estudo dos efeitos da vacinao em doenas
de transmisso direta. Editora da Unicamp, 2001.
[17] NEPOMUCENO, E. G. Dinmica, modelagem e controle de epidemias. 2005. Thesis
(PhD) - Universidade Federal de Minas Gerais, Belo Horizonte, MG, 2005.
[18] TUNG, K. K. Topics in mathematical modelling. Princeton University Press, 2007.
[19] CUDAT M , N. Nvidia cuda c programming best practices guide.
Expressway Santa Clara, CA 95050: NVIDIA Corporation, 2009.
[20] CUDAT M , N. Nvidia cuda curand library. 2701 San Tomas Expressway Santa Clara, CA
95050: NVIDIA Corporation, 2010.
[21] KIRK, D.; MEI HWU, W. Chapter 1: Introdution. David Kirk/NVIDIA and Wen-mei
Hwu, 2008. This is a draft chapter from an upcoming CUDA textbook by David Kirk from
NVIDIA and Prof. Wen-mei Hwu from UIUC.
[22] KIRK, D.; MEI HWU, W. Chapter 2: Cuda programming model. David Kirk/NVIDIA
and Wen-mei Hwu, 2008. This is a draft chapter from an upcoming CUDA textbook by
David Kirk from NVIDIA and Prof. Wen-mei Hwu from UIUC.
[23] KIRK, D.; MEI HWU, W. Chapter 3: Cuda threads. David Kirk/NVIDIA and Wen-mei
Hwu, 2008. This is a draft chapter from an upcoming CUDA textbook by David Kirk from
NVIDIA and Prof. Wen-mei Hwu from UIUC.
[24] KIRK, D. B. Nvidia cuda software and gpu parallel computing architecture. NVIDIA
Corporation, 2006-2008.
[25] PATTERSON, D. A.; HENNESSY, J. L. Organizao e projeto de computadores. 3. ed.
CAMPUS, 2005.
[26] ARRUDA, F.
O que a tecnologia de processamento grfico cuda.
http://www.tecmundo.com.br/10507-o-que-e-a-tecnologia-de-processamento-graficocuda.htm, jun 2011.
[27] MORIMOTO, C. E.
Opencl, cuda, brook: processamento usando a gpu.
http://www.hardware.com.br/dicas/opencl.html, aug 2009.
[28] TSUCHIYAMA, R.; NAKAMURA, T.; IIZUKA, T.; ASAHARA, A.
programming book. Fixstars Corporation, 2010.
The opencl
[29] KARIMI, K.; DICKSON, N. G.; HAMZE, F. A performance comparison of cuda and
opencl. D-Wave Systems Inc., 2010.
[30] PAMPLONA, V. Cuda. http://vitorpamplona.com/wiki/Cuda, Dec. 2008.
[31] CPLUSPLUS.COM COMPANY. rand function. http://www.cplusplus.com/reference
/clibrary/cstdlib/rand, Dec. 2011.
Referncias Bibliogrficas
52