• No se han encontrado resultados

Entrada: La secuencia a evaluar que se almacena en peptido, el tamaño de la ventana, la región a evaluar delimitada por angulo_Inicial y angulo_F inal y la tabla con los valores de hidrofobicidad de cada aminoácido contenidos en el arreglo T ablaH.

Salida: El valor del momento hidrofóbico helicoidal del péptido. 1: para i←0 hasta ventana−1hacer

2: hidrof obicidad= TablaH[peptido[i]] 3: sumHidro+= hidrofobicidad

4: para angP os←0 hasta angulo_F inal−angulo_Inicial hacer 5: angulo= angulo_Inicial * i

6: sumSin[angPos] += seno[angulo] * hidrof obicidad 7: sumCos[angPos] += coseno[angulo] * hidrof obicidad

8: n para

9: n para

10: para i←ventana hasta longitud[peptido] hacer 11: hidrofobicidad = TablaH[peptido[i]]

12: sumHidro+= hidrofobicidad

13: promedioHidro+= sumHidro/ventana 14: momento_M AX[i] = 0;

15: para angP os←0 hasta angulo_F inal−angulo_Inicial hacer 16: angulo= angulo_Inicial * i

17: sumSin[angPos] += seno[angulo] * hidrof obicidad 18: sumCos[angPos] += coseno[angulo] * hidrof obicidad

19: momento= Ecuacion_Momento_Hidrofobico(sumSin, sumCos, promedioHidro) 20: momento=momento /ventana

21: simomento >=momento_M AX[i]entonces

22: momento_M AX[i] =momento

23: angulo_M AX[i] =angulo_Inicial+angP os 24: n si

25: n para

26: hidrof obicidad= TablaH[peptido[i−window]] 27: sumHidro-= hidrofobicidad

28: para angP os←0 hasta angulo_F inal−angulo_Inicial hacer 29: angulo= angulo_Inicial * i

30: sumSin[angPos] -= seno[angulo] * hidrof obicidad 31: sumCos[angPos] -= coseno[angulo] * hidrof obicidad

32: n para

33: n para

del momento hidrofóbico. Esta primer ventana abarca desde el aminoácido en la posición `0' hasta el tamaño de ventana - 1.

En el paso 2 se obtiene la hidrofobicidad del i-ésimo aminoácido y en el paso 3 se realiza la sumatoria con la hidrofobicidad de cada aminoácido.

El ciclo de los pasos 4 al 8 recorre el número de ángulos a evaluar, 10 en este caso (del 95◦ al 105). Dentro de este se realiza una sumatoria con el seno y coseno por cada ángulo

multiplicado por la hidrofobicidad del i-ésimo aminoácido. Los resultados se almacenan en los arreglossumSin y sumCos.

En el ciclo del paso 10 se agrega un nuevo elemento para completar la ventana. En el paso 11 se toma la hidrofobicidad del nuevo aminoácido que se añade, en el paso 11 se agrega este valor a la sumatoria de hidrofobicidad previamente iniciada y en el paso 13 se calcula el promedio de hidrofobicidad entre los elementos de la ventana.

Al inicio del ciclo de los pasos 14 al 22 se agregan a las sumatorias sumSin y sumCos el valor de cada ángulo del elemento recién agregado a la ventana, pasos 16 y 17. Para cada ángulo del ciclo se realiza el cálculo del momento hidrofóbico en el paso 18, este recibe las sumatorias sumSin y sumCos así como el promedio de hidrofobicidad de la ventana. El resultado se divide entre el número de elementos de la ventana en los pasos y se almacena en momentoen el paso 19.

Simomentodel ángulo evaluado es el máximo encontrado para deli-ésimo aminoácido, es- te se almacena en el arreglomomento_M AXen la posición reservada para dicho aminoácido en los pasos 20 y 21.

El ciclo de los pasos 26 al 30 se encarga de remover el primer elemento de la ventana. El momento hidrofóbico de la cadena se obtiene del valor promedio de los elementos almacenados enmomento_M ax, como se indica en el paso 33.

4.4. Estrategias para optimizar la escritura de SCAPs en la memoria global del dispositivo

Además de la estrategia para la detección de SCAPs en paralelo, es necesario considerar el método de escritura de los resultados en la memoria global. Se deben almacenar solo los casos positivos y desechar los negativos aún cuando estos se encuentran intercalados. El procedimiento para calcular los índices contiguos de cada caso positivo requiere de operaciones

que no son triviales cuando se trabaja en un proceso en paralelo, pero no considerar el ltrado de los casos positivos signicaría faltar a una optimización obvia pues esto generaría un desperdicio de memoria global y tiempo de ejecución, principalmente al momento de pasar los datos del dispositivo hacia el huésped y cuando el huésped escriba los resultados hacia algún dispositivo de almacenamiento (presumiblemente disco duro), principalmente si el número de casos negativos es alto.

A continuación se describen las estrategias implementadas para la escritura de SCAPs dentro del dispositivo.

4.4.1. Suma de Prejos

En esta sección se explica la técnica suma de prejos que se utiliza en el paso 5 del Algoritmo 3 y los detalles de la implementación que utiliza instrucciones especícas de CUDA. A continuación se presenta le denición de suma de prejos (JaJa, 1992a). Consideremos una secuencia de n elementos{x1, x2, . . . , xn} obtenidos de un conjunto S con una operación

binaria asociativa, denotada por L. La suma de prejos de esta secuencia es igual a las

sumas parciales (o productos) denidos por:

si =x1

M

x2

M

. . .Mxi,1≤i≤n.

Un algoritmo trivial secuencial calcula si con una sola operación mediante el uso de la

identidadsi =si−1Lxi, para2≤i≤n, y por lo tanto tomaO(n)de tiempo. Este algoritmo

es inherentemente secuencial.

En la Figura 24 se muestra un ejemplo donde L representa la operación suma.

Figura 24: El arregloA muestra una secuencia de valores aleatorios. El arreglo A0 muestra el resultado de la suma de prejos sobre A.

En la teoría de algoritmos paralelos la herramienta utilizada para calcular la suma de prejos es el árbol binario balanceado.

La suma de prejos tiene diferentes usos como son la clasicación, análisis léxico, com- paración de cadenas, evaluación de polinomios, compactación corriente e histogramas de construcción y estructuras de datos (grácos, árboles, etc) en paralelo, entre otras (Harris, 2007).

En este problema se utiliza para optimizar la memoria requerida. El objetivo es ubicar los hilos que contienen un SCAP en posiciones contiguas de memoria y eliminar los casos negativos que se encuentran intercalados. La Figura 25 muestra un ejemplo de esta operación.

Figura 25: El arreglo A muestra el contenido relevante (descrito por las letras A, B y C) y contenido irrelevante (representado por `-'). En el arreglo B se cambia la información relevante por

`1' y la irrelevante por `0'. En B' se muestra la suma de prejos. La posición de la información relevante en A' se obtiene de las casillas donde ocurre un incremento de valor (casillas coloreadas)

en B'.

Para resolver la suma de prejos, CUDA proveé un conjunto de funciones llamadas sh (en abreviación a la palabra shue o barajeo en español) que optimizan el cálculo bajo esta arquitectura (ver sh en la Sección 3.9.2).

La unidad básica con que trabaja este algoritmo es el warp. Cada warp contiene 32 hilos, cada hilo tiene un valor numérico de1 si contiene un SCAP o 0 de lo contrario. Un ejemplo

de un warp se muestra en la Figura 26.

Figura 26: Diagrama que ilustra el concepto de warp.