Método de Vórtices en el GPU
Julián T. Becerra Sagredo
Carlos Málaga
Motivación
A lo largo de la última década, los GPUs (Graphics Processing Units)
se volvieron órdenes de magnitud más rápidos que los CPUs
APIs: CUDA C, OpenCL
CPU y GPU
Memoria 3D
Programación Ideal en GPU
Uso masivo de L2 - Operaciones locales - Un resultado a RAM
L2 fetch
Operaciones locales en registers
GPU RAM
Templete @T 2
=r T
Ecuación de difusión (calor) @t
Diferencias finitas centradas y avance explícito en t
MPI-CUDA C
MPI-OpenCL
MPI = message passing interface para CPUs
GPU GPU GPU GPU
GPU GPU GPU GPU
CPU CPU CPU CPU
MPI
CUDA Kernel
__global__ void solveheat_kernel (int ni, int nj, float kcond, float dt,
float dx, float dy, float *t_data, float *t_data_old)
{
int i, j, i2d, i2d2, i2d3, i2d4, i2d5;
float told,tnow,tip1,tim1,tjp1,tjm1;
i = blockIdx.x*TILE_I + threadIdx.x;
j = blockIdx.y*TILE_J + threadIdx.y;
i2d = i + j*ni;
i2d2 = (i+1) + (j)*ni;
i2d3 = (i-1) + (j)*ni;
i2d4 = (i) + (j+1)*ni;
i2d5 = (i) + (j-1)*ni;
told = t_data_old[i2d];
tip1 = t_data_old[i2d2];
tim1 = t_data_old[i2d3];
tjp1 = t_data_old[i2d4];
tjm1 = t_data_old[i2d5];
tnow = told + dt*kcond*((tip1-2.0f*told+tim1)/(dx*dx)
+ (tjp1-2.0f*told+tjm1)/(dy*dy));
t_data[i2d] = tnow;
}
Ecuaciones de Vorticidad en 2D
Dω 2 2
= ν∇ ω ∇ ψ = −ω
Dt
Flujo de Vorticidad
@! @
⌫ = (v · s)
@n @t
Vórtices y Partículas
Transporte
Volumen finito multidimensional (MoT)
Finite Volumes Method of Transport
(a) (b)
Ecuaciones de Transporte
Derivada Total del Tiempo (Derivada Material)
Posición Trayectoria
Velocidad
Advección Semi-lagrangiana de Alta Resolución
t+∆ t
t
Mapeo No Lineal
Z-Splines (Base de Colocación de Diferencias Finitas Compactas)
Transporte de un Escalar
D↵
=0
Dt
dx
=v
dt
Multigrid
@
2
∇ ψ = −ω = (r2 + !)
@t
Multigrid
Dipolos
Doubly periodic shear layer
Re = 10,000
Doubly periodic shear layer
Vortex Method
KRLNS - 1200s en 311GHz
VM -1190s en 345GHz
77.6s (15.4X) en 3945GHz
(3584 cuda cores)
Motivación
Motivación