• No se han encontrado resultados

4   Aceleración del MoM 121

4.2   Versión intermedia en lenguaje C 123

Como se explica en la sección anterior, la razón de ser de la versión intermedia en C es permitir realizar la transición completa de FORTRAN a CUDA con un punto intermedio que sirva para comprobar errores, en primer lugar en el paso de FORTRAN a C, y después, en el paso de ésta última (el algoritmo original, expresado en C) a una para CUDA.

Además de la conversión a C de las rutinas encargadas de calcular la matriz de impedancias, se ha aprovechado para introducir algunas modificaciones en la organización de los datos en memoria con vistas

Inicialización

Análisis

Geometría

Cálculo del

PWS

Cálculo matriz

MoM

FORTRAN C (CUDA)

a que ésta se adapte mejor a la jerarquía y modo de acceso de una GPU. Estas mejoras afectan fundamentalmente a las matrices que contienen la información de la geometría y consisten en reordenar los índices de acceso, de forma que elementos que van a ser leídos por el programa uno después de otro, estén situados en memoria en posiciones consecutivas. Esto tiene su interés en la versión secuencial, ya que estos datos podrán situarse en el mismo bloque de memoria caché, reduciendo el tráfico de ésta con niveles superiores de la jerarquía de memoria, y además también será conveniente cuando se cree la versión para la GPU.

El programa comienza procesando la geometría a la que hay que aplicarle el análisis electromagnético. Se divide en parches y subparches y se calculan las posiciones de los mismos (de su centro, concretamente), así como las de los segmentos que los separan (los subdominios), siguiendo el procedimiento indicado en el apartado de

Discretización de la sección 3.1.3 (ver Figura 3-3). También se calculan las derivadas del vector de posición en los subparches, las posiciones en los mismos de los puntos de integración para las integrales lineales y de superficie y otros datos necesarios para el análisis. Para todo esto se ha respetado la versión original en FORTRAN. También se ha respetado para calcular el Espectro de Ondas Planas (Planar Wave Spectrum), aunque éste no se utilice en el MoM, sino en el CBFM.

Una vez analizada la geometría, se procede a aplicarle el método de los momentos. Esta parte ya debe ser traducida a C, y el procedimiento consiste en calcular el acoplo entre cada par de subdominios de la geometría. Para ello, se crean dos bucles que recorren, cada uno de ellos, todos los subdominios, como indica la

Figura 4-2, el más externo tratándolos como subdominio víctima y el más interno como subdominio activo. Para cada par de subdominios se calcula tanto el acoplo inductivo como el capacitivo. El inductivo consiste en una integral de línea a lo largo de la cuchilla. La integral se transforma, por el método de las cuadraturas de Gauss [69], en un sumatorio. Por ejemplo, las integrales entre los corchetes en la ecuación (3.36) se transforman de esta manera:

(4.1) Para obtener cada uno de los términos del sumatorio es preciso calcular una integral de superficie en los subparches que bordean el subdominio activo, y esto, a su vez y de forma análoga, se convierte en el sumatorio de un sumatorio. Cada término de éste último sumatorio requiere calcular el valor de la función integrada en un punto de una malla bidimensional que cubre ambos subparches del subdominio activo.

Figura 4-2. Pseudo-código general del programa.

G(!r ,!r ')JCj(!r ')ds'≈ i=1 N

wiwlG(ui,vl)Jij l=1 M

SCj

/*Inicialización y cálculos generales*/ Generar descripción de la geometría Generar PWS

/*Generar matriz de impedancias*/ Para cada subdominio víctima

Para cada subdominio activo /*Obtener elemento de Z*/

Calcular acoplo inductivo víctima-activo Calcular acoplo capacitivo víctima-activo Acumular

De esta manera, cada uno de los sumatorios necesarios para calcular el acoplo inductivo se transforma en un bucle de tipo for.

Dentro de cada uno se encuentra otro bucle for, y así

sucesivamente hasta completar los 3 niveles de anidamiento que supone el acoplo inductivo (los tres sumatorios). La Figura 4-3 representa esta construcción. En el bucle más interno se realiza el cálculo del valor de la función que se integra en ese punto concreto. La acción denominada ‘Acumular’ representa la suma siguiendo el

método de las cuadraturas de Gauss.

Figura 4-3. Pseudo-código para el cálculo del acoplo inductivo de un par víctima-activo

La Figura 4-4 representa gráficamente todo el proceso para obtener el componente de acoplo inductivo de un elemento de la matriz. La primera fila de cajas (con la letra C) representa el bucle

for que recorre la cuchilla (una caja por iteración). Para cada

elemento de la cuchilla es preciso evaluar la función tejado, proceso representado por las dos filas (ya que es una integral de superficie) de

/*Acoplo inductivo para un par de subdominios*/

/*Integral de línea*/

Para cada punto en la cuchilla /*Integral de superficie*/

Para cada punto P1 en la dimensión 1

Para cada punto P2 en la dimensión 2

Evaluar la función en (P1,P2)

Acumular Acumular

cajas con la letra T. Cada elemento final supone la evaluación (cajas con la letra E) de la función en un punto del subdominio activo.

Figura 4-4. Esquema del cálculo del acoplo inductivo.

El acoplo capacitivo (ver Figura 4-5) tiene una estructura algo más sencilla, ya que sólo es preciso calcular la integral de superficie de cada uno de los subparches que delimitan el subdominio activo para obtener su efecto sobre el centro de cada uno de los dos subparches que delimitan el subdominio víctima. En total son cuatro integrales de superficie, y la secuencia de operaciones es parecida al caso inductivo, pero con un nivel menos de anidamiento, ya que el bucle correspondiente a la integral sobre la cuchilla no está presente.

C

C

T

C

T

T

T

T

T

E

E

E

Elemento de la matriz

Figura 4-5. Pseudo-código para el cálculo del acoplo capacitivo de un par víctima-activo

La versión intermedia es una conversión prácticamente línea a línea de la versión original en FORTRAN. Sólo en contadas ocasiones se ha introducido alguna modificación como desenrollado de bucles o hacer alguna función ‘inline’ (sustituir su invocación por su código), optimizaciones que en cualquier caso puede realizar también el propio compilador sobre el programa original.