FI 2 – 24 février 2009 – page 7
Les GPU ne sont pas uniquement faits pour les consoles de jeux
#include "cuda.h"
#include "mex.h"
/* Kernel to square elements of the array on the GPU */
__global__ void square_elements(oat* in, oat* out, int N)
{
int idx = blockIdx.x*blockDim.x+threadIdx.x;
if (idx < N) out[idx]=in[idx]*in[idx];
}
/* Gateway function */
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/* Call function on GPU */
square_elements<<<dimGrid,dimBlock>>>(data1f_gpu, data2f_gpu, n*m);
}
code 2
L’a L g o r i t h m e d e Sm i t h -Wa t e r m a n
L’algorithme de Smith-Waterman évalue une ressem-
blance locale entre deux séquences A et B de taille m et n
respectivement. Les éléments de A et B sont notés a1, … am
et b1, … bn. La matrice de similitude entre éléments W(ai,
bj) et les pénalités d’ouverture et d’extension de gap Ginit et
Gext sont également données.
On calcule les n x m matrices suivantes:
Hi,j=max {0
Ei,j
Fi,j
Hi–1,j–1 – W(ai,bj)}
Ei,j=max
Fi,j=max
{
{
Ei,j–1 – Gext
Hi,j–1 – Ginit
Fi–1,j – Gext
Hi–1,j – Ginit
}
}
La procédure qui permet de trouver l’alignement à partir
de la matrice est la suivante: à partir de la cellule d’arrivée,
remonter vers la(les) cellule(s) voisine(s) de score maximal;
itérer pour arriver à la cellule initiale.
Pour illustrer le propos, la figure 10 donne un exemple
concret de la procédure de recherche locale entre deux sé-
quences ADN avec une expression simplifiée de la matrice:
H(i,j) = max{0, H(i,j-1)-a, H(i-1,j)-a, H(i-1,j-1) +
W(S1i ,S2j ) }, avec a=1, W(S1i ,S2j ) =+2 si les résidus i et j
sont identiques et W(S1i ,S2j )=-1 dans le cas contraire.
fig. 10 - Example of the Smith-
Waterman algorithm to compute
the local alignment between two
DNA sequences ATCTCGTATGAT
and GTCTATCAC. The matrix
H(i,j) is shown for the linear gap
cost a= 1, and a substitution
cost of +2 if the characters are
identical and –1 otherwise. From
the highest score (+10 in the
example), a traceback proce-
dure delivers the corresponding
alignment, the two subsequences
TCGTATGA and TCTATCA
Vous trouverez le pseudo-code d’implémentation à al
référence [2]. Une des particularités de ce code est de char-
ger dans la mémoire de texture une matrice acides aminés
-requête dite Query-profile.
En partant du travail de ces deux auteurs, cet algorithme
a été porté sur une machine de bureau (Intel 3.0 Ghz, cache
6MB, express Chipset. 4 GB DDR3, 2x Nvidia GTX 280,
system Linux kernel 2.6.27).
Vous pouvez faire des tests en-ligne depuis la page gpu.
epfl.ch/sw.html. Pour lancer la requête cliquer Query, car cette
page contient par défaut un jeu de paramètres de test. La règle
d’attribution du service est des plus simples premier arrivé,
premier servi. La base de données (Swiss-Prot) compte un peu
plus de 400 mille séquences et environ 145 millions de résidus.
La réponse doit parvenir au bout de quelques secondes.
fig. 11
À la lumière des résultats présentés à la figure 11, évitez
le mode CPU pour des requêtes plus grandes qu’une dizaine
de résidus, car n’oubliez pas que vous multipliez le temps par
un facteur d’environ 50.
matLab
Les figures 12.a et 12.b donnent une idée du facteur
d’accélération que l’on peut obtenir avec l’extension CUDA
pour MATLAB que l’on peut obtenir depuis le site Nvidia
[9]. Vous trouverez dans cette extension un script nvmex à
l’image du script mex pour compiler l’application (code 2.0)