You are on page 1of 8

Calculo Acelerado por GPU

Calculo de la subsecuencia comn ms larga.


a

Ramirez Yamila; bSabo Carlos; cSosa Peters German;dTirantino Facundo


a

UTN FRRE, ISI B, yamilasabrinaramirez@gmail.com


b
UTN FRRE, ISI B, ing.leox@gmail.com
c
UTN FRRE, ISI B, german.sp91@gmail.com
d UTN FRRE, ISI B, facutir@gmail.com

Resumen
El trabajo comienza introduciendo al lector con los conceptos bsicos de la programacin sobre GPU. Para
ello, se explica la diferencia entre programacin secuencial y paralela. Luego, se describen las diferencias
entre el modelo CPU y el modelo GPU, brindando algunos detalles sobre las arquitecturas de los mismos.
Por ltimo, se analizara el clculo de la subsecuentica comn ms larga de una manera ms rpida
optimizando el algoritmo de Hirschberg de CPU mediante el bit paralelo de Crochemore pero en vez de
realizarlo en CPU, el clculo, se realiza en la GPU, todos los clculos se realizan en forma paralela.

1.

Introduccin
Usaremos el clculo basado en GPU para
mejorar el rendimiento de algoritmos que
demandan mucho poder de cmputo paralelo.
Qu es el clculo basado en GPU?
El clculo acelerado en la GPU puede definirse
como el uso de una unidad de procesamiento
grfico (GPU) en combinacin con una CPU
para acelerar aplicaciones de empresa,
consumo, ingeniera, anlisis y clculo
cientfico.
Las GPU aceleradoras han pasado a instalarse
en centros de datos energticamente eficientes
de
laboratorios
gubernamentales,
universidades, grandes compaas y PYMEs de
todo el mundo.
Las GPUs aceleran las aplicaciones de
plataformas diversas, desde automviles hasta
telfonos mviles y tablets, drones y robots.

2.

Desarrollo

2.1 Conceptos Bsicos


a. Programacin Secuencial:
Se entiende por programacin secuencial aquella en
la que el cdigo se desarrolla para ser ejecutado de
manera secuencial (una instruccin tras otra,
manejando uno o dos datos a la vez) en un sistema
CPU. Este tipo de programacin se basa en la
creacin de programas a partir de un conjunto de
sentencias
escritas
de
forma
secuencial y cuya ejecucin sigue dicha secuencia.

El software se ha orientado tradicionalmente hacia


la Programacin secuencial. Para resolver un
problema, se construye un algoritmo y se
implementa en un flujo de instrucciones en serie.
Estas instrucciones se ejecutan en la unidad central
de procesamiento de un ordenador (CPU). En el
momento en el que una instruccin se termina, se
ejecuta la siguiente. Se incluye el caso en que se
ejecutan en un sistema multi-CPU ya que en estos
cdigos el programador no define ni controla los
parmetros de ejecucin sino que lo hace de manera
transparente el Sistema Operativo.
b. Programacin Paralela:
La Programacin paralela es una tcnica de
programacin en la que muchas instrucciones se
ejecutan simultneamente. Se basa en el principio
de que los problemas grandes se pueden dividir en
partes ms pequeas que pueden resolverse de
forma
concurrente
("en
paralelo").
Existen varios tipos de computacin paralela:
paralelismo a nivel de bit, paralelismo a nivel de
instruccin, paralelismo de datos y paralelismo de
tareas. Durante muchos aos, la programacin
paralela se ha aplicado en la computacin de altas
prestaciones, pero su inters ha aumentado en los
ltimos aos debido a las restricciones fsicas que
impiden el escalado en frecuencia, o velocidad de
los microprocesadores. La programacin paralela se
ha convertido en el paradigma dominante en la
arquitectura de computadores, principalmente en
los procesadores multincleo. Sin embargo,
recientemente, el consumo de energa de los
ordenadores paralelos se ha convertido en una
preocupacin.
La Programacin paralela emplea elementos de
procesamiento mltiple simultneamente para

resolver un problema. Esto se logra dividiendo el


problema en partes independientes de tal manera
que cada elemento de procesamiento pueda ejecutar
su parte del algoritmo a la misma vez que los
dems. Los elementos de procesamiento pueden ser
diversos e incluir recursos tales como un nico
ordenador con muchos procesadores, varios
ordenadores en red, hardware especializado o una
combinacin
de
los
anteriores.
Los ordenadores paralelos se pueden clasificar
segn el nivel de paralelismo que admite su
hardware: los ordenadores multincleo y
multiproceso tienen varios elementos de
procesamiento en una sola mquina, mientras que
los clusters, los MPP y los grids emplean varios
ordenadores para trabajar en la misma tarea.
Los programas de ordenador paralelos son ms
difciles de escribir que los secuenciales porque la
concurrencia introduce nuevos tipos de errores de
software, siendo las condiciones de carrera los ms
comunes. La comunicacin y la sincronizacin
entre las diferentes subtareas son tpicamente las
grandes barreras para conseguir un buen
rendimiento de los programas paralelos. El
incremento de velocidad que se logra en un
programa de este tipo obedece a la ley de Amdahl:

Donde P es la proporcin de cdigo en paralelo y S


la aceleracin que se logra mediante la
programacin
paralela.
La CPU vs GPUs.
Una forma sencilla de entender la diferencia entre
la CPU y la GPU es comparar la forma en que
procesan las tareas. Una CPU est formada por
varios ncleos optimizados para el procesamiento
en serie, mientras que una GPU consta de millares
de ncleos ms pequeos y eficientes diseados
para manejar mltiples tareas simultneamente.
Un concepto esencial para entender la enorme
capacidad de los sistemas multiprocesador en
general y en especial los sistemas apoyados en GPU
es la programacin en paralelo.

Figura 1: Comparacin entre los cores de un CPU


y un GPU
A modo de ejemplo podramos comparar los
ncleos (cores) de un procesador Intel Core i76700K que cuenta con 4 cores fsicos comparado
con una placa de video GeForce GTX 980 que
cuenta con 2048 CUDA cores.
Modelo de computacin CPU-GPU
La utilizacin de las GPUs para computacin se
basa fundamentalmente en el aprovechamiento del
diseo de stas para una programacin paralela. En
concreto el modelo de instruccin nica-mltiples
datos, lo que permite que una instruccin sea
ejecutada por distintos hilos usando datos diferentes
dependiendo del hilo.
En la figura 1 se ilustra este modelo. En general el
modelo parte de un bloque principal que se ejecuta
en la CPU. Este bloque llamado MAIN en el
diagrama controla el inicio y final del programa.
Cuando se alcanza una seccin que permita ser
ejecutada en paralelo, se invoca a las secciones
HOST correspondientes.
Las secciones HOST establecen la transicin entre
la ejecucin CPU y GPU. Se encargan de reservar
memoria en la GPU, de copiar los datos necesarios
para la operacin de la memoria local a la memoria
de la GPU, y de definir los parmetros de ejecucin
(Que en el caso de CUDA definen el nmero de
hilos y la velocidad). Estas instrucciones son
trasladadas a la GPU mediante la invocacin de los
Kernels.
Los Kernels son las secciones de ejecucin en
Paralelo que se ejecutan en la GPU. Slo estas
secciones son ejecutadas en la GPU. Se limitan a
usar los datos previamente recibidos desde la
memoria local y ejecutar las instrucciones paralelas
definidas. Una vez concluidas estas operaciones se
copian los resultados a la memoria local y se
devuelve el control, primero, a la seccin HOST y
de sta nuevamente a la seccin principal MAIN.

Figura 2: Comparacin entre el modelo CPU y el modelo GPU


2.2 Modelo GPU
2.2.1 Arquitectura y programacin de la GPU
Una GPU est altamente segmentada, lo que indica
que posee gran cantidad de unidades funcionales.
Estas unidades funcionales se pueden dividir
principalmente en dos: aqullas que procesan
vrtices, y aqullas que procesan pxeles. Por tanto,
se establecen el vrtice y el pxel como las
principales unidades que maneja la GPU.
Adicionalmente, y no con menos importancia, se
encuentra la memoria. sta destaca por su rapidez,
y va a jugar un papel relevante a la hora de
almacenar los resultados intermedios de las
operaciones y las texturas que se utilicen.
Inicialmente, a la GPU le llega la informacin de la
CPU en forma de vrtices. El primer tratamiento
que reciben estos vrtices se realiza en el vertex
shader. Aqu se realizan transformaciones como la
rotacin o el movimiento de las figuras. Tras esto,
se define la parte de estos vrtices que se va a ver
(clipping), y los vrtices se transforman en pxeles
mediante el proceso de rasterizacin. Estas etapas
no poseen una carga relevante para la GPU.
Donde s se encuentra el principal cuello de botella
del chip grfico es en el siguiente paso: el pixel
shader. Aqu se realizan las transformaciones
referentes a los pxeles, tales como la aplicacin de
texturas. Cuando se ha realizado todo esto, y antes
de almacenar los pxeles en la cach, se aplican
algunos efectos como el antialiasing, blending y el
efecto
niebla.
Otras unidades funcionales llamadas ROP toman la

informacin guardada en la cach y preparan los


pxeles para su visualizacin. Tambin pueden
encargarse de aplicar algunos efectos. Tras esto, se
almacena la salida en el frame buffer. Ahora hay
dos opciones: o tomar directamente estos pxeles
para su representacin en un monitor digital, o
generar una seal analgica a partir de ellos, para
monitores analgicos. Si es este ltimo caso,
han de pasar por un Convertidor Analgico-Digital
o DAC,(Digital Analog Converter), para ser
finalmente
mostrados
en
pantalla.
Al principio, la programacin de la GPU se
realizaba con llamadas a servicios de interrupcin
de la BIOS. Tras esto, la programacin de la GPU
se empez a hacer en el lenguaje ensamblador
especfico
para
cada
modelo.
Posteriormente, se intercal un nivel adicional entre
el hardware y el software, diseando las APIs
(Application
Program
Interface),
que
proporcionaban un lenguaje ms homogneo para
los modelos existentes en el mercado. la primera
API usada ampliamente fue el estndar abierto
OpenGL (Open Graphics Language), tras el cual
Microsoft
desarroll
DirectX.
Tras el desarrollo de APIs, se decidi crear un
lenguaje ms natural y cercano al programador, es
decir, desarrollar un lenguaje de alto nivel para
grficos. Por ello, de OpenGL y DirectX surgieron
otras propuestas como El lenguaje estndar de alto
nivel, asociado a la biblioteca OpenGL que se llama
el "OpenGL Shading Language", GLSL,
implementado en principio por todos los
fabricantes. La empresa NVIDIA cre un lenguaje

propietario llamado Cg (del ingls, "C for


graphics"), con mejores resultados que GLSL en las
pruebas de eficiencia. En colaboracin con
NVIDIA, Microsoft desarroll su "High Level
Shading Language", HLSL, prcticamente idntico
a Cg, pero con ciertas incompatibilidades menores.

automatizadas por ultrasonido, cambi su algoritmo


patentado de un sistema tradicional en la CPU a
CUDA y a las GPU NVIDIA Tesla. El sistema
basado en CUDA (figura 3) es capaz de procesar el
algoritmo de TechniScan dos veces ms rpido.

2.2.2 Introduccin a CUDA


CUDA es una arquitectura de clculo paralelo de
NVIDIA que aprovecha la gran potencia de la GPU
(unidad
de
procesamiento grfico)
para
proporcionar un incremento extraordinario del
rendimiento del sistema.
Para programar en la arquitectura CUDA,
actualmente los desarrolladores pueden usar C, uno
de los lenguajes de programacin de alto nivel ms
utilizados (figura 2), que entonces puede ejecutarse
con un excelente rendimiento en un procesador
compatible con CUDA.

Figura 3: Lenguajes de programacin que


soportan CUDA.
La GPU est especializada en cmputo intensivo,
computacin altamente paralela y por lo tanto
diseada de manera que ms transistores se dedican
al procesamiento de datos (figura 3) en lugar de
almacenamiento en cache de datos y control de
flujo.
2.2.3 Aplicaciones de CUDA
En la actualidad, decenas de miles
desarrolladores, cientficos, estudiantes,

de

creadores de juegos e investigadores realizan


aplicaciones que aprovechan la computacin de la
GPU en reas tan diversas como juegos basados en
la fsica, anlisis de riesgo de activos, anlisis de
datos ssmicos y pronsticos climticos.
Como ejemplo podramos citar:
La capacidad de producir rpidamente imgenes
bastante detalladas en un plazo corto tiene gran
relevancia en el campo de las ecografas para
deteccin del cncer de mama. TechniScan, un
desarrollador
de
sistemas
de
imgenes

Figura 4: Renderiado volumetrica del sistema de


ultrasonido para la mama completa (WBU) de
TechniScan.
2.3 Ejemplo de Aplicacin de Calculo acelerado
por GPU
2.3.1 Introduccin
Hay varios indicadores de la similitud entre dos
strings, por ejemplo, la distancia de edicin. La
subsecuencia comn ms larga (LCS para abreviar)
es una de ellos. LCS puede ser aplicado a varios
problemas, por ejemplo, la comparacin de ADN,
correccin ortogrfica, y otros.
Un algoritmo para calcular el LCS dadas dos
cadenas fue propuesto por Hirschberg. El algoritmo
calcula de forma recursiva el LCS, mientras que el
clculo de la longitud de LCS (LLCS por sus
siglas) entre varias subcadenas de los dos strings
dados. Cuando las longitudes de dos strings dados
son m y n, el algoritmo de Hirschberg requiere
O(mn) unidades de tiempo y O(m+n) espacio de
memoria. Un mtodo bien conocido para calcular
los LLCS ms rpido es con el paralelismo a nivel
de bit. El mtodo requiere O ([m/w]n) unidades de
tiempo y O(m+n) espacio de memoria, donde w es
el tamao de palabra del ordenador. Usando este
mtodo, el algoritmo LCS de Hirschberg puede ser
acelerado. Sin embargo, algoritmos mucho ms
rpidos son deseables para cadenas con ms de un
milln de caracteres, que son comunes en el campo
de la comparacin de los ADN. Es por esto, que
consideramos acelerar el algoritmo de bits en
paralelo con una GPU (Unidad de Procesamiento
Grfico). El algoritmo con bit en paralelo incluye
operaciones lgicas bit a bit y sumas aritmticas.
Las operaciones lgicas bit a bit son apropiados
para la GPU, ya que pueden ser ejecutadas
velozmente en paralelo. Sin embargo, las sumas
aritmticas tienen menos paralelismo. As, el
dispositivo que al com-computar de manera
eficiente en paralelo.

Basado en el mtodo propuesto en el documento, se


ha implementado el algoritmo con bit en paralelo
LCS en CUDA. El experimento con GeForce GTX
480 y 2.93GHz Intel Core i3 530 CPU muestra que
el algoritmo es de 2.1 a 12.77 veces ms rpido que
el algoritmo CPU-bits en paralelo, y 37,3 a 76,5
veces ms rpido que los algoritmos sin bit paralelo
de CPU.

Ejemplo 2.1.
El LCS entre la secuencia BIOLOGIA y algunas
otras secuencias o palabras del idioma espaol se
puede observar en la Figura 5.

2.3.2 Definicin de LCS (Longest Common


Subsequence)
Sean C y A dos cadenas; c1c2cp y a1a2am
respectivamente. Si existe una correspondencia
entre los ndices de C a los ndices de A sujeto a las
siguientes condiciones de C1 y C2, C se denomina
subsecuencia de A.
C1: F(i) = k si y slo si ci = ak
C2: Si i < j, entonces F(i) < F(j).
Sin embargo, se define la cadena nula como una
subsecuencia de cualquier cadena. Definimos una
cadena que es una subsecuencia de cadena tanto A
y la cadena B como un comn subsecuencia entre A
y B. Los LCS entre A y B es el ms largo de todas
las subsecuencias comunes entre A y B. Por
ejemplo, los LCS entre "Abcdefghij" y "cfilorux" es
"TPI". LCS entre "abcde" y "baexd" son "Anuncio",
"ae", "bd", y "ser".
2.3.3 Cmo calcular la longitud de la LCS
La LLCS se puede calcular con programacin
dinmica (Algoritmo de Hirschberg). Este
algoritmo almacena la LLCS entre A y B en una
tabla L[m] [n] si llenamos la tabla L con
(m+1)(n+1) celdas basadas reglas R1, R2 y R3
donde m es la longitud de A y n es la de B.
Este algoritmo necesita un tiempo de O(mn) y un
espacio de O(mn).
R1: si i = 0 y j = 0 L[i][j] = 0
R2: si A[i-1] = B[i-1] L[i][j] = L[i-1][j-1] + 1
R3: otros casos, L[i][j] = max(L[i][j-1], L[i-1][j]
Las reglas R2 y R3 implican que la i-esima fila (1
i m) de L puede ser calculada solo con la i-esima
y (i-1)-esima filas. Esta propiedad lleva a un
algoritmo que requiere menos memoria, mostrado
en el Algoritmo de Hirschberg de LLCS. Donde K
es un arreglo temporal de tamao 2 (n + 1), en
celdas y L es un arreglo para almacenar la salida
con un tamao de 1 (n + 1) celdas. El algoritmo
de Hirschberg de LLCS mostrado en la Fig1
almacena el LLCS entre una cadena A y otra
Cadena B[0..j-1] (la sub cadena de B desde el
primer carcter al j-esimo carcter de B) en L[j].
Esta implementacin reduce el espacio requerido a
O (m + n) con la misma complejidad O (mn).

Figura 5: LCS para la secuencia BIOLOGIA


contra otras secuencias. Los nmeros representan
el LCS entre las secuencias, adems, para cada par
de secuencias se muestra un posible alineamiento.
Se usa el carcter - como carcter vaco.
2.3.4 Algoritmo de Hirschberg de LCS
La Figura 6 muestra el algoritmo de LCS paralelo
propuesto por Hirschberg donde S[u..1][u 1]
representa el reverso de la sub cadena S[l..u] de una
cadena S. Este algoritmo calcula recurrentemente
una LCS mientras computa la LLCS. Requiere un
tiempo de O(mn) y un espacio de O(m + n).

Figura 6: Algoritmo de Hirschberg para recuperar


el LCS.
2.3.5 Calculando la LLCS con paralelismo de bit
Existe un algoritmo para el clculo de la LLCS con
paralelismo de bit ms eficiente, es el de

Crochemore (Fig3), donde V es una variable que


almacena un vector de bits de longitud m. Y tiene
las operaciones lgicas AND (&), OR (|) y
complemento (), todas ellas se realizan en paralelo.
+ se refiere a V[0] como el bit de menor peso. Se
calcula as, primero, el algoritmo de Crochemore
hace un vector de coincidencia de patrn (PMV). El
PMV P de una cadena S sobre c es el vector de bits
de longitud m el cual satisface las siguientes
condiciones.
C1: si S[i] = c P[i] = 1
C2: otros casos, P[i] = 0
Desde la lnea 4 a la 8 de la Fig3, se crea el PMV
de una cadena A sobre cada carcter C. como
suponemos un carcter de un byte, 0 c 255. Los
reversos del PMV sobre c son almacenados en
PM[c] donde la variable PM es una matriz
dimensional de bits de tamao 256 m.
Este algoritmo representa la tabla de programacin
dinmica como una secuencia de vectores de bits tal
que cada vector de bits corresponde a una columna
de la tabla. El i-esimo bit de cada vector de bits
representa la diferencia entre la i-esima y la (i 1)esima celda de la correspondiente columna.
Repitiendo operaciones bit a bit el algoritmo hace el
proceso que es igual a calcular la tabla L de
izquierda a derecha.
La ltima columna de la tabla L de salida, hecha
por este algoritmo, es un vector de bits. Sin
embargo, fcilmente podemos convertirla en un
arreglo comn de enteros en un tiempo de O (mn).
El proceso de conversin se encuentra en las lneas
11 y 12 de la Fig3.
El algoritmo de Crochemore requiere O ([m/w]n)
en tiempo y O (m + n) de espacio, donde w es el
tamao de palabra de computadora.
2.3.6 El algoritmo de CPU a ser implementado
en una GPU
La parte dominante en el Algoritmo de Hirschberg
de LCS, es llcs (), funcin que calcula la LLCS. En
el desarrollo del trabajo, se apuntaba a acelerar el
Algoritmo de Hirschberg de LCS -Algoritmo de
LLCS del bit paralelo de Crochemore- en otras
palabras se reemplazaba la llamada a llcs () en el
Algoritmo de Hirschberg con llcs_bp () -Algoritmo
de LLCS del bit paralelo de Crochemore.
Para este propsito, propusieron un mtodo para
acelerar el algoritmo LCS con una GPU. En el
Algoritmo de Hirschberg, se calcula el LLCS entre
el reverso de la cadena A y el reverso de la cadena

B. Sin embargo, si se invierten A y B en cada


invocacin de llcs (), la sobrecarga de inversin se
vuelve significativa. Entonces, crearon una nueva
funcin llcs () la cual invierte las cadenas de
adelante hacia tras. La funcin llcs () es la misma
que llcs () excepto por la orden de invertir la
cadena. Tambin hicieron corresponder la funcin
de algoritmo del bit paralelo llcs_bp () a llcs ().
La salida del algoritmo de Hirschberg de LLCS es
la m-esima fila de la tabla L. Sin embargo, el
algoritmo de Crochemore al representar una
columna de la tabla como un vector de bits y
calcula la tabla desde la columna 0 hasta la
columna n-esima. Por lo tanto, el algoritmo de
Crochemore imprime la n-esima columna.
Entonces, cambiaron el algoritmo original LLCS en
el algoritmo de Hirschberg de hacer por filas a un
algoritmo por columnas. Adems de esto, tuvieron
que cambiar el algoritmo LCS original. Debido a
que el algoritmo propuesto incorpora 32 caracteres
en una variable entera sin signo, la longitud de la
cadena A debe ser mltiplo de 32. Por lo tanto,
cuando la longitud de la cadena A no es mltiplo de
32, se debe rellenar la cadena A y hacer su longitud
mltiplo de 32. Para hacer el relleno se usa
caracteres no incluidos en ninguna de las cadenas A
o b (caracteres de control).
2.3.7 Esquemas del Algoritmo Propuesto
La GPU calcula solo la funcin llcs () en tan solo
una parte -en las lneas 11 y 12- del Algoritmo de
Hirschberg . Otras partes de ste, son calculadas por
la CPU, ya que la GPU soporta llamadas recursivas
solo dentro de algunos niveles, y el algoritmo posee
diversas llamadas recursivas.
Los operadores lgicos bit a bit que posee el
Algoritmo de LLCS del bit paralelo de
Crochemore, se pueden paralelizar fcilmente. El
nico operador que posee mayor dificultad para
esto, es el de suma aritmtica, ya que posee acarreo,
y estos en el peor de los casos- se pueden propagar
del bit de menor peso, al de mayor. En una GPU,
cada vector de bits est representado por un arreglo
de enteros sin signos. Una variable de entero sin
signo en una GPU tiene un tamao de 32 bits. En la
arquitectura CUDA, 32 hilos en el mismo punto
estn sincronizados a nivel de instruccin
(ejecucin SIMD). Entonces, establecieron el
nmero de hilos en un bloque en 32 as los hilos en
un bloque pueden estar sincronizados sin costo
alguno. Ya que un hilo procesa un entero sin signo
(32 bits), un bloque procesa 1024 bits.

Fig6. Particin de un bloque cuando m = 3072; n


= 4096
La Fig6 es un ejemplo de un particin de un bloque
en un paso, cuando m = 3027 y n = 4096. Cada
rectngulo en esta figura representa un paso de un
bloque. Son llamados bloques computadores. Cada
bloque computador no puede ser ejecutado hasta
que los bloques de ms a la izquierda y de niveles
ms bajos hayan sido ejecutados. Por lo tanto, solo
el bloque de ms a la izquierda bajo el bloque
computador puede ser ejecutado en la primera
invocacin de la funcin kernel. En cada
invocacin de la funcin kernel, se ejecutan todos
los bloques computadores que puedan ser
ejecutados en ese momento. Luego, los bloques
computadores con el mismo nmero, en la Fig6,
puede ser ejecutados en paralelo al mismo tiempo
(el numero representa el orden de ejecucin). Las
flechas blancas indican el paso de acarreos y las
negras indican que el bloque cubriendo el sub
vector de bits V[i..i + 1024] da el valor de V[i..i +
1023] al (j + 1)-esimo paso de s mismo al fin del jesimo paso
Las entradas son dos arreglos de enteros sin signo,
que almacenan vectores de 1024 bits, y un acarreo
del vector de bits de menor peso. Las salidas son
dos arreglos de enteros sin signo y un acarreo para
el vector de bits de mayor peso. El nmero de
elementos en un arreglo es de 32. Adems, crearon
otro arreglo que almacena acarreos hacia el
elemento de nivel superior en memoria compartida.
Primero, se calculan sumas de un byte para dos
arreglos de enteros sin signo. Cuando una suma es
ms pequea que los dos operandos, se pone el
acarreo del byte de mayor peso a 1. A continuacin,
se obtiene sumas de dos bytes y acarreos de las
sumas de dos bytes y acarreos adyacentes. Este
proceso puede ser hecho con una comparacin y
dos sustituciones. De la misma manera se obtienen
sumas de 4 bytes, de 8 bytes y finalmente de 32

bytes. Un acarreo para el byte de mayor peso del


byte de mayor peso es un acarreo para el sub
vector de bits superior. As, se almacena el acarreo
en memoria global.
2.3.8 Paralelizaran de la suma aritmtica
Como la suma aritmtica (+) tiene menos
paralelismo debido a los acarreos. Para
paralelizarla, se aplic el mtodo de Sklansky para
paralelizar el sumador completo llamado
condicional de la suma. El mtodo se aprovecha del
hecho de que cada acarreo es 0 o 1. Para calcular la
adicin de nmeros de n bits, cada semi-sumador
calcula una suma y un acarreo para el bit de mayor
peso, en ambos casos de antemano. Luego, los
acarreos se propagan en paralelo.
2.3.9 Experimentos
En esta seccin se hace una comparacin de los
tiempos de ejecucin del algoritmo propuesto con
los algoritmos antes mencionados (Algoritmo de
Kloetzli (GPU), algoritmo de Hirschberg (CPU),
Algoritmo de Crochemore (CPU)). Los
experimentos se realizaron sobre un procesador
Intel i3 530 2,93Ghz y GPUs GeForce 8800GTX,
GeForce GTX 285, GeForce GTX 480.

Fig7. Relacin de aumento de velocidad entre el algoritmo propuesto y los dems


algoritmos.
3. Conclusiones
El modelo de programacin paralela de optimizada
para GPU es una tcnica interesante que aprovecha
la arquitectura con la que se cuenta en la actualidad
gracias a la tecnologa disponible en la actualidad
para los ordenadores modernos.
En el artculo Katsuya Kawanami y Noriyuki
Fujimoto
presentaron
un
mtodo
de
implementacin del bit paralelo de LCS en una
GPU y realizaron varios experimentos basados en
su mtodo, los cuales dieron como resultado que el
algoritmo que propusieron es de 2,48 a 12,77 veces
ms rpido que el algoritmo bit paralelo en CPU y
10,9 a 18,1 veces ms rpido que el algoritmo de
Kloetzli en una GPU.

Bibliografa
[1]
NVIDIA,
N.
2015.
http://www.nvidia.es/object/gpu-computinges.html.
[2]
INTEL,
I.
2015.
http://ark.intel.com/es/products/88195/Intel-Corei7-6700K-Processor-8M-Cache-up-to-4_20-GHz
[3]
GEFORCE,
G.
2015.
http://www.geforce.com/hardware/desktopgpus/geforce-gtx-980/specifications
[4]
Misael
Angeles
Arce,
A.
.
https://riunet.upv.es/bitstream/handle/10251/11735/
INCO2-2011-01.pdf?sequence=1
[6] Katsuya Kawanami and Noriyuki Fujimoto.
GPU Accelerated Computation of the Longest
Common Subsequence. 1-1 Gakuen-cho, Naka-ku,
Sakai-shi, Osaka 599-8531 Japan

You might also like