• No se han encontrado resultados

AMEE

In document UNIVERSIDAD DE EXTREMADURA (página 70-73)

5. Procesamiento paralelo en GPU

5.3. AMEE

Al igual que ocurre con el KPPI el proceso total del algoritmo AMEE se divide en una serie de kernels, en concreto este se divide en 4 kernels de ejecución, estos son: calculo de ventanas (exactamente igual que el KPPI, las ventanas son las mismas), generación de vectores, cálculo de la distancia acumulada y obtención de distancias máximas. Cabe decir que el código de este algoritmo se ha realizado adaptando el código del KPPI ya que hay muchas partes similares.

5.3.1. Generación de vectores

Al igual que ocurría en el KPPI, se va a generar un vector de tamaño num_bands por cada ventana en cada iteración, utilizando además la misma estructura, la diferencia está en que en este caso los vectores no son aleatorios sino que van a ser vectores pertenecientes a la ventana en ejecución. Además este kernel tiene en cuenta la iteración en la que se encuentra el algoritmo. Como ya sabemos en el AMEE se va a calcular la distancias de cada píxel de una ventana con todos los demás de la misma ventana, si en una iteración calculamos la distancia acumulada de un píxel con todos los demás de la ventana, todo esto para cada ventana, podemos decir que el algoritmo se completará en TAMANO_V*TAMANO_V iteraciones siendo TAMANO_V el lado de la ventana. Sabiendo esto el funcionamiento es el siguiente: supongamos que estamos en la iteración 0, es decir, la primera. La llamada al kernel se hace con los modificadores 100 y 100, es decir 100 bloques y 100 hilos en cada bloque. De esta manera cada hilo se encarga de obtener el vector píxel que ocupa la posición 0 dentro de cada ventana y copiarlo a la estructura que almacena las ventanas, como ya sabemos existen ventanas que se salen fuera de los bordes de la imagen, en este caso no se copia nada a la estructura.

5.3.2. Cálculo de la distancia acumulada

Este kernel se encarga de calcular la distancia acumulada de cada píxel con el resto de los píxeles de su ventana, para ello hace uso de las siguientes estructuras: image_vector (vector que almacena la imagen hiperespectral), ventana_vector(vector

Proyecto fin de carrera

-71-

Sergio Sánchez Martínez

que almacena los índices de los píxeles que corresponden a cada ventana, gen_vector(vector que almacena los vectores generados para cada iteración) y ventana_res para almacenar los resultados de cada iteración, es la misma que utiliza el KPPI y la explicación a su utilización también viene dada por la ausencia de las operaciones atómicas), además el kernel debe conocer la iteración en la que se encuentra el algoritmo, de esta manera se evita calcular la distancia angular de un píxel consigo mismo.

El funcionamiento es el siguiente: kernel se configura con los modificadores 100 y 100, para cada iteración extraemos el vector correspondiente de gen_vector y realizamos un bucle que recorra toda la ventana que se está tratando, calculamos la distancia angular y la sumamos a la acumulada con cada vector píxel de la ventana siempre que no se corresponda con el generado y siempre que no esté fuera de la ventana. El resultado lo almacenamos en la posición correcta de ventana_res para evitar que varios hilos escriban simultáneamente en la misma posición de memoria. Finalmente en ventana_res tendremos en la posición 1 de la ventana 1 la distancia angular acumulada del primer píxel de la ventana 1 con el resto y así sucesivamente. El siguiente paso es conocer cuál es el píxel que ha obtenido la mayor distancia acumulada, ese es el trabajo del siguiente kernel.

5.3.3. Obtención de distancias máximas

Este kernel al igual que los anteriores se configura con los valores 100 y 100. Su función es obtener el índice del píxel que ha obtenido la mayor distancia acumulada dentro de cada ventana. Para ello hace uso de dos estructuras: ventana_res (almacena los resultados de cada píxel de cada ventana), ventana_vector (para conocer el índice de cada píxel de cada ventana) y un vector para almacenar los resultados. El funcionamiento es el siguiente: cada hilo recorre su ventana comprobando las distancias acumuladas y quedándose con la mayor y la posición que ocupa dentro de la ventana esa distancia mayor, es decir el índice del píxel que la generó. Finalmente almacena en el vector de resultados este índice en la posición que se corresponde con el hilo que lo ha calculado.

Proyecto fin de carrera

-72-

Sergio Sánchez Martínez

acumulada en más de una ventana y nos interesa saber cuántas veces exactamente, para ello utilizamos un proceso lineal que se encarga de recorrer esta estructura y contar cuantas veces aparece cada píxel, almacenando este resultado en el lugar que le corresponde al píxel, es decir si el píxel 55 se ha contado 7 veces pondremos un 7 en la celda 55 del vector que almacena los resultados finales, de esta manera obtenemos una imagen de pureza.

Como veremos en el siguiente apartado de resultados de los tres algoritmo el que logra el speedup más bajo en comparación con la versión C++ es el PPI, esto es así porque se decidió centrar los objetivos en los algoritmos KPPI y AMEE por sus características de ventana que permitían establecer comparativas entre sí. De esta manera se opto por una implementación mas estándar para el PPI de forma que sirviera como prueba o punto de partida para los algoritmos KPPI y AMEE y así asegurarnos de que todo funcionaba correctamente.

Proyecto fin de carrera

-73-

Sergio Sánchez Martínez

In document UNIVERSIDAD DE EXTREMADURA (página 70-73)

Documento similar