Está en la página 1de 6

PROGRAMACIN EN EL ENTORNO CUDA EN APLICACIONES DE MECNICA COMPUTACIONAL

CDIGO DEL PROYECTO

II. ANLISIS DEL CDIGO MATLAB DE PARTIDA EN CPU


Como punto de partida se escogi un cdigo MATLAB que deba ser adaptado
a CUDA con el objetivo de explorar la nueva tecnologa y realizar
comparaciones. Este cdigo haba sido probado y su correccin haba sido
comprobada. Sera por tanto el patrn elegido para comparar y medir la
eficiencia de CUDA. El cdigo tiene por objeto resolver la ecuacin del
calor mediante el Mtodo de los Elementos Finitos.

1. MALLADO
La solucin se busca en un dominio cuadrado de superficie unidad que se
somete a mallado con un patrn sencillo de tringulos. Se generan
archivos que identifican este mallado que sern usados por los cdigos
de resolucin.

En el mallado se definen tambin las condiciones de contorno segn


Neumann y Dirichlet.

El Mallado se realiza mediante la herramienta de Ecuaciones


Diferenciales Parciales (PDE Toolbox) de MATLAB que se ilustra en la
figura 1. Esta herramienta permite modificar el grado de mallado en
sucesivos pasos para ir aumentando su detalle y por tanto la precisin
de las operaciones. Este aumento se traduce en un aumento del nmero de
tringulos y de nodos.

Fig. 1: Punto de partida: Mallado del problema.

83
PROGRAMACIN EN EL ENTORNO CUDA EN APLICACIONES DE MECNICA COMPUTACIONAL
CDIGO DEL PROYECTO

CDIGO TRATAMALLA:
Gracias a ste cdigo auxiliar, facilitado por el tutor, se genera a
partir de los parmetros del mallado 4 archivos con extensin .dat.
Estos archivos son los que se usan para la ejecucin del programa y
describen en su totalidad el mallado y las condiciones de contorno.

Triangulos.dat: Este archivo contiene los nodos de cada tringulo. Cada


lnea corresponde al tringulo que lleva el mismo nmero y contiene tres
vrtices que son los nodos del tringulo.

Coordenadas.dat: Es un archivo ordenado donde cada lnea corresponde al


nodo que lleva el mismo nmero y contiene las coordenadas x e y de dicho
nodo.

Neumann.dat: Es un archivo que describe las condiciones de contorno


Neumann. En cada lnea encontramos descrito el lado de Neumann
correspondiente mediante el primer nodo que lo forma, el segundo nodo y
el subdominio al que pertenece dicho lado.

Dirichlet.dat: De igual modo este archivo describe las condiciones de


contorno de Dirichlet. Cada lnea corresponde a un lado Dirichlet
descrito mediante su primer nodo, su segundo nodo y el subdominio al que
pertenece.

2. CDIGO SECUENCIAL
Esta parte est constituida por el archivo femP4 y por archivos
auxiliares. Realiza las siguientes tareas:

1. Inicializacin y definicin de variables.

2. Lectura de archivos

3. Generacin de matrices locales y su ensamblado en la matriz de


Rigidez.

4. Generacin del vector de elementos independientes definido segn


las condiciones de contorno Dirichlet y Neumann.

5. Resolucin de problema y obtencin del vector X.

6. Comprobacin de la precisin del resultado con respecto a la


solucin correcta.

7. Representacin.

En Matlab la matriz de rigidez se define y almacena como matriz dispersa


(Sparse).

84
PROGRAMACIN EN EL ENTORNO CUDA EN APLICACIONES DE MECNICA COMPUTACIONAL
CDIGO DEL PROYECTO

Todas estas operaciones se realizan en la CPU. En las versiones


multiprocesador, algunas de las tareas se comparten entre los distintos
microprocesadores del equipo de manera transparente para el usuario,
realizndose una ejecucin en paralelo. Sin embargo, el control de dicha
ejecucin, en todo momento, lo realizan la aplicacin y el sistema
operativo.

3. BUCLES E IDENTIFICACIN DE CUELLOS DE BOTELLA (BLOQUES)


Para proceder a la adaptacin del cdigo se tuvieron presentes los
siguientes objetivos:

- El sistema debe ser acelerado mediante la tecnologa CUDA; es decir


usando paralelizacin basado en el modelo Una Instruccin-Datos
Mltiples.

- El sistema debe gestionar la memoria de manera eficiente permitiendo


manejar matrices grandes y por tanto mallados muy finos.

Por tanto se pretendan aprovechar dos caractersticas fundamentales del


problema conocidas de antemano:

- Que la Matriz de rigidez, es una matriz Real, Cuadrada, Dispersa,


Simtrica y con diagonal principal no-nula.

- Que a la hora de resolver el sistema se debe tener presente que se


debe desarrollar un SOLVER rpido apropiado para matrices dispersas.

Mediante inspeccin del cdigo se identificaron los bloques iterativos


como cuellos de botellas y se decidi analizarlos para someterlos a
aceleracin con la tecnologa CUDA. En un anlisis terico previo para
decidir su prioridad se ordenaron del siguiente modo:

- Bloque I: Resolucin de problema y obtencin del vector Solucin (X).


Es el bloque identificado en el cdigo MATLAB con el comentario %
RESOLVER y que realiza la resolucin mediante la orden
MATLAB:x[Lib]=A[Lib]\B[Lib].

- Bloque II: Generacin de matrices de rigidez: En MATLAB se seala


este bloque como potencialmente lento por la propia aplicacin. Est
identificado por el comentario % ENSAMBLADO MATRIZ + FUERZAS
VOLUMETRICAS (f) e invoca un programa auxiliar para la generacin de
matrices locales y su ensamblado.

- Bloque III: Generacin del vector de elementos independientes


definido segn las condiciones de contorno Dirichlet y Neumann.

MODIFICACIONES INTRODUCIDAS EN EL CDIGO ORIGINAL:


El cdigo Matlab original fue modificado insertando lneas de comando
que no modificaban sus tareas sino que aportaban mayor informacin.

85
PROGRAMACIN EN EL ENTORNO CUDA EN APLICACIONES DE MECNICA COMPUTACIONAL
CDIGO DEL PROYECTO

En concreto se insert un comando para generar un archivo en formato


martix market con extensin .mtx que almacenaba la matriz de rigidez
para poder ser usada en la comprobacin de los solvers CUDA. Esto se
hizo mediante la orden mmwrite('A_matlab.mtx',A).

Esta orden se apoya en la funcin mmwrite codificada en el archivo


mmio.c y disponible en el sitio Web Matrix Market. Esta funcin
permite el almacenamiento de una matriz en un archivo en formato MM.
Tambin est disponible la funcin inversa que carga una matriz desde un
archivo MM a la memoria del sistema. Ambas son funciones C
convencionales.

Tambin se insert una instruccin para generar un archivo que contena


el vector de elementos independientes con extensin .dat con el mismo
fin. Esto se hizo con la orden save file.dat array -ascii disponible
en MATLAB.

Esto permitira comparar los valores de la Matriz de Rigidez y del


Vector de trminos independientes con aquellos obtenidos por la
aplicacin CUDA, mediante la inspeccin de los archivo.

Se insertaron tambin instrucciones tic y toc antes y despus de A\B


para medir el tiempo que tardaba la CPU en ejecutar esa instruccin y
compararlo con el tiempo de ejecucin del equivalente paralelo en los
solvers CUDA. Pero tambin se usaron para medir el tiempo de ejecucin
global, colocndolos al principio y al final de cdigo.

Como criterio de comparacin de la exactitud de las soluciones se


decidi usar la Norma de tal forma que tambin se insert una orden para
ofrecer en pantalla el resultado de: Norma (B-AX)/Norma (B).

86
PROGRAMACIN EN EL ENTORNO CUDA EN APLICACIONES DE MECNICA COMPUTACIONAL
CDIGO DEL PROYECTO

4. ANEXOS
ANEXO I: Cdigo MATLAB de Partida con las modificaciones
usadas.

function u=femP4
tic %medida de tiempo de ejecucin
load coordenadas.dat;
load triangulos.dat;
load neumann.dat;
load dirichlet.dat;

numNodos=size(coordenadas,1);
numTriang=size(triangulos,1);
numLadosDir=size(dirichlet,1); % no se usa
numLadosNeu=size(neumann,1);

% CREACION DE LA LISTA DE NODOS DIRICHLET

dirichlet=[dirichlet(:,[1 3]);dirichlet(:,[2 3])];


[Dir,distintos]=unique(dirichlet(:,1));
save DIR.dat Dir -ascii
save dirich.dat dirichlet -ascii
subDir=dirichlet(distintos,2);

Lib=setdiff(1:numNodos,Dir); % nodos incognita


A=sparse(numNodos,numNodos);
b=zeros(numNodos,1);

% ENSAMBLADO MATRIZ + FUERZAS VOLUMETRICAS (f)

for j=1:numTriang
tri=triangulos(j,:); % vertices del triangulo # j
vertices=coordenadas(tri,:); % coordenadas de sus vertices
[R,M,jacob]=local(vertices); % rigidez y masa local
A(tri,tri)=A(tri,tri)+0*M+R; % ensamblado
baricentro=sum(vertices)/3; % baricentro del triangulo
aux=(jacob/6)*f(baricentro); %contribucion
b(tri)=b(tri)+aux*[1;1;1];
end

mmwrite('A_matlab.mtx',A);
% CONDICIONES NEUMANN (g)

for j=1:numLadosNeu
lado=neumann(j,1:2); % extremos del lado # j
subd=neumann(j,3); % subdominio del lado #j
coord=coordenadas(lado,:); % coordenadas de los extremos
ptomedio=sum(coord)/2; % punto medio del lado
longitud=norm(coord(1,:)-coord(2,:)); % longitud del
lado
aux=longitud*g(ptomedio,subd)/2; % contribucion;
b(lado)=b(lado)+aux*[1;1];
end
87
PROGRAMACIN EN EL ENTORNO CUDA EN APLICACIONES DE MECNICA COMPUTACIONAL
CDIGO DEL PROYECTO

save BN.dat b -ascii


% CONDICIONES DIRICHLET (u_d)

coorDir=coordenadas(Dir,:); % coordenadas de los nodos


Dirichlet
u=zeros(numNodos,1); % para la solucion
u(Dir)=u_d(coorDir,subDir); % evalo u_d en los
nodos Dirichlet
save UD.dat u -ascii
b=b-A*u; % A*u=A(:,Dir)*u(Dir) porque u(Lib)=0
save temp.dat b -ascii

% RESOLVER

u(Lib)=A(Lib,Lib)\b(Lib);

save x.dat u -ascii


toc
K=b-A*u;
save dif.dat K -ascii
norm(b-A*u)/norm(b)

trisurf(triangulos,coordenadas(:,1),coordenadas(:,2),u),...
view(0,90),...
colorbar,...
shading interp;

exacta=u_ex(coordenadas);
save exacta.dat u_ex -ascii
err=abs(exacta-u);

pause
trisurf(triangulos,coordenadas(:,1),coordenadas(:,2),err),...
view(0,90),...
colorbar,...
shading interp;

88

También podría gustarte