• No se han encontrado resultados

2.6 Fundamentos de los códigos Stencil

2.6.1 Descripción

Existe una gran diversidad de códigos Stencil. Para diferenciarlos entre sí se pueden utilizar las siguientes características:

Dimensión: Se refiere al número de ejes que tiene la estructura de datos

sobre la que se realiza el cálculo delStencil. La dimensión de unStenciltiene un fuerte impacto en las optimizaciones que se puedan aplicar a éste. En

un Stencilunidimensional, la reutilización de datos es muy sencilla, debido

a que los datos están almacenados de forma adyacente en memoria y a que la distancia entre el primer y último elemento usado para cada cálculo es corta. Cuanta mayor sea la distancia entre elementos peor será su localidad espacial, perjudicando la reutilización de los datos. Éste es el caso de los códigos Stencilde 3 o mas dimensiones.

Orden: Este parámetro especifica la distancia a la que se encuentran el

vecino más alejado que se necesita para el cómputo del elemento actual en cualquiera de los ejes dimensionales. A mayor orden, mayor distancia entre

2.6. Fundamentos de los códigosStencil

los elementos de un mismo cálculo y mayor posibilidad de existencia de problemas de localidad espacial.

Tamaño:Esta característica define el número total de elementos de la matriz

que están involucrados en el cálculo. Alguno de los tamaños mas conocidos son de 5 puntos, 7 puntos, 9 puntos o 25 puntos. En la Figura 2.13 se muestra un Stencil3-D de 11 puntos donde se considera un vecino en cada una de las tres dimensiones, más los vecinos que están en la diagonal del plano X-Y.

Figura 2.13:Stencil 3-D de 11 puntos.

Patrones iterativos: Esta característica define dónde y en qué orden se

actualizan cada uno de los elementos. Los tres tipos básicos son:

Jacobi. Este patrón iterativo es ampliamente utilizado por su sencillez y capacidad para ser paralelizado. La base del patrón consiste en realizar las iteraciones sobre una copia los datos que se utiliza sólo para lectura mientras se escriben los resultados en otra copia de los datos. Al final de cada iteración se intercambian las copias de los datos, la nueva entrada es la salida de la iteración anterior y la antigua copia pasa a ser la salida de la nueva iteración. Al ser necesario mantener dos copias del volumen de datos, necesitamos el doble de recursos de almacenamiento, consumiendo también el doble de ancho de banda a memoria. Esta duplicación de los datos es a la vez su mayor ventaja. Este patrón se puede paralelizar como convenga al programador al no existir dependencias de datos dentro de cada iteración, ya que los volúmenes de datos para lecturas y escrituras están totalmente aislados.

Gauss-Seidel. En este patrón iterativo se llevan a cabo las escrituras en la misma copia que se usa para leer los datos. En consecuencia,

los accesos memoria se reducen drásticamente. Este patrón dificulta el proceso de paralelización, ya que los accesos a los datos no son completamente independientes. Es decir, algunos elementos serán actualizados antes de que puedan ser consultados por los elementos vecinos para sus cálculos. Se hace necesario establecer un patrón de actualización para que el código sea determinista y se pueda replicar el mismo resultado final.

Gauss-Seidel Red-Black (GSRB). Al igual que en Gauss-Seidel, este patrón escribe el resultado del cálculo en la misma copia de donde se leen los datos. La diferencia radica en que el patrón de actualización viene dado desde el comienzo y permite que la ejecución se realice en dos pasos independientes. Para esto se dividen los datos en “puntos” rojos y negros de forma que los puntos adyacentes tengan un color diferente. El patrón actualizará primero los puntos de un color y después los del otro. Como los puntos de un mismo color no forman parte del cálculo del resto de puntos de ese color, cada elemento de un color es independiente del resto. Sin embargo, aunque los requisitos de memoria son los mismos que en Gauss-Seidel, no es así con el ancho de banda, ya que al dividir la iteración de forma simple calculando primero los puntos de un color y después los del otro, aumenta la tasa de fallos de cache y, en consecuencia, el tráfico de datos a memoria.

Bordes o fronteras. Para determinados algoritmos Stenciles necesario rea-

lizar un trato especial sobre las partes limítrofes de los datos (bordes o fronteras). Destacando los siguientes:

Borde constante. Se definen así los elementos limítrofes de la entrada de datos que no se actualizan. Suelen estar situados al comienzo y final de cada una de las dimensiones de los datos de entrada. Esta situación se puede simular creando unhalo alrededor de los datos de entrada cuyos elementos no se actualicen con el paso del tiempo y mantengan valores fijos (Figura 2.14a).

Borde periódico. Este tipo de fronteras se utiliza cuando los datos limítrofes de la matriz de datos se solapan, es decir, en una entrada de 0 a N, el elemento N+1 vuelve a ser 0 (Figura 2.14b).

Coeficientes.Los coeficientes son los valores mediante los cuales se pondera

2.6. Fundamentos de los códigosStencil

(a) Borde constante (b) Borde periódico

Figura 2.14: Bordes o fronteras.