Em (TRUONG,2014) foram propostas quatro implementações distintas para
GPU do algoritmo Needleman-Wunsch para o múltiplo alinhamento de pares de
sequências de DNA. As implementações estão disponíveis para download em:
http://nps.missouri.edu/nps_wiki/index.php/Code. Em todas elas foi feita a opção
pelo uso do gap linear.
As soluções adotadas nestas propostas são comparadas ao Rodinia-NW, uma implementação open-source "baixada" a partir do Rodinia Benchmark Suite (RODINIA,2015) que disponibiliza o kernel de diversos algoritmos para aplicações
HPC em plataformas GPUs e multi-core CPUs.
Os kernels das implementações propostas pelo artigo foram integrados à uma estrutura MPI para o desenvolvimento de um Cluster CPU-GPU. Esta solução distribuída focou Clusters homogêneos e heterogêneos, este último, composto por
nós com diferentes configurações de hardware e capacidades de processamento.
Na descrição do cluster, bem como, na apresentação dos resultados com ele obtidos, não foi definido qual das quatro implementações foi, de fato, a escohida para as GPUs, uma vez que, segundo o artigo, poderia ser qualquer uma delas.
Assim, será apresentada a descrição detalhada de uma destas quatro possíveis abordagens de implementação do algoritmo NW, no caso, a TiledDScan-mW.
TiledDScan-mNW
Esta implementação segue a mesma abordagem usada no Rodinia-NW. Como o cálculo de cada elemento da matriz PD utiliza três outros adjacentes, para melhorar o desempenho, a idéia foi concentrar a utilização da memória compartilhada (shared). Assim, a matriz PD é particionada em blocos (denominados
tiles) e cada tile ocupa o espaço disponibilizado pela memória compartilhada.
Operando em modo diagonal, múltiplas invocações do kernel ocorrem durante o processo de alinhamento. Para cada uma delas, múltiplas matrizes PD são processadas, concorrentemente, utilizando diferentes blocos de threads em diferentes streaming multiprocessors (SMs). A figura 3.1 apresenta esta estrutura num processo com três alinhamentos simultâneos.
Na primeira iteração, os tiles do canto superior-esquerdo das três matrizes são processados, em paralelo, por três blocos-threads que são mapeados em três
SMs. Na segunda iteração, os tiles da segunda diagonal das matrizes são,
simultaneamente, processados em seis blocos-threads mapeados do SM1 até o
SM6 e, assim, sucessivamente. Dessa forma, ocorre a exploração do paralelismo
em dois níveis: (i) através da threads dentro dos tiles e (ii) diferentes tiles na mesma diagonal são processados, concorrentemente, por blocos distintos. Threads pertencentes ao mesmo bloco utilizam, temporariamente, os dados armazenados na
figura 3.1 - Configuração TiledDScan-mNW
memória compartilhada. Ao final do processamento de um tile, os dados são enviados, em modo coalescido, à memória global.
As duas principais otimizações da implementação TiledDScan-mNW em relação à Rodinia-NW, foram:
1) Considerando m alinhamentos, o número de invocações do kernel foi reduzido de um fator m e, para cada um deles, o número de blocos-threads é acrescido de um fator m. Desta forma, ocorrem duas vantagens: (i) a redução no número de invocações do kernel, reduzindo a participação do seu overhead no tempo total de execução e (ii) um maior número de threads simultâneas implica numa maior utilização dos recursos da GPU.
2) Na implementação Rodinia-NW, a matriz PD é inicializa na CPU e, em seguida, transferida para a GPU. O que, dependendo da quantidade de sequências e de seus tamanhos, pode consumir bastante tempo. A otimização, neste caso, é inicializar a matriz na GPU.
Uma outra otimização implementada pelas quatro abordagens propostas foi a utilização da pinned memory nos processos de transferência de dados entre a
CPU (host) e a GPU.
Análise de desempenho
Para avaliar o desempenho obtido com uma única GPU, foram utilizados
diversos dispositivos classificados em dois grupos (High-end e Low-end GPUs),
conforme apresenta a Tabela 3.1.
Tabela 3.1 - High-end e Low-end GPUs
Nos experimentos, inclusive, no Cluster foi utilizado um conjunto de dados com cerca de 25.000 sequências do gene bacteriano 16S rDNA, gerados a partir do
Ribosomal Database Project (COLE,2009). Este gene, com cerca de 1.536 bps, é
bastante usado nos estudos da filogenia e taxonomia de bactérias pelo fato de estar presente em quase todas as sequências genéticas das mesmas (JANDA,2007).
A figura 3.2 apresenta os resultados referentes ao tempo de execução para 64 alinhamentos com os diferentes dispositivos da Tabela 3.1 e comparando-os com
a implementação original (Rodinia-NW).
Estrutura do Cluster
A figura 3.3 apresenta a estrutura do Cluster MPI CPU-GPU composta por um Cluster-Level Dispatcher(CLD) e um conjunto de Node-Level Dispatchers(NLDs).
Figura 3.3 - Arquitetura do Cluster
Fonte: TRUONG,2014
figura 3.2 - Gráfico comparativo de tempo de execução em relação ao Rodinia-NW
O CLD atua no cluster-level, promovendo a distribuição dos dados (work-list) para os NLDs em cada um dos nós e, no final, agrega os resultados gerados. Por sua vez, no node-level, cada NLD distribui as tarefas entre os nós das CPUs e
GPUs. Em cada nó, as CPU-workers e as GPU-workers executam o algoritmo NW.
Resultados obtidos no Cluster
Os testes foram realizados em duas diferentes estruturas de Cluster (High-
end e Low-end Cluster) cujas configurações estão resumidos na tabela 3.2. No High- end Cluster são utilizadas 4 workstations e diversas GPUs/nó; enquanto que, no Low-end Cluster são 6 desktops e uma única GPU/nó. As work-lists enviadas pelo CLD aos NLDs foram ajustadas para 5.000 pares de alinhamento para a máxima
utilização das CPUs e GPUs.
Foi instalado o CUDA 5.0 em todas as máquinas. O S.O. instalado no high-
end Cluster foi CentOS5.5/6 com g++4.1.2 e no low-end Cluster foi usado o S.O.
Ubuntu 12.04 with g++ 4.6.3. Para o MPI foi utilizado o MPICH2 (versão 1.4.1p1).
A figura 3.4 apresenta os resultados referentes ao desempenho, em número de pares alinhados/s, para as duas configurações do Cluster. Este gráfico apresenta a escalabilidade da arquitetura e o desempenho em 3 situações: (i)uso, apenas, das
CPUs, (ii) uso isolado das GPUs e (iii) uso do conjunto híbrido CPU+GPU. Tabela 3.2 - Configurações dos Clusters
3.2 G-DNA - a highly efficient multi-GPU/MPI tool for aligning nucleotide