Upload
others
View
7
Download
1
Embed Size (px)
Citation preview
Transformadas de Fourier
Clase 11, 13/05/2015http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases
Pero antes... streams with Thrust
Streams con Thrust
Ejemplo de clase de streams reciclado ...● cp -r /share/apps/codigos/alumnos_icnpg2015/streams_thrust .
Incluimos thrust 1.8 headers (no necesario con cuda 7 toolkit)● nvcc async_thrust.cu -I /share/apps/codigos/thrust-master
Ejecutamos nvprof -o a.prof ./a.out ● qsub submit_gpu.sh
Verificar concurrencia de streams (overlaps copy-kernel, kernel-kernel...)
● Nvpp → import a.prof
Transformadas de Fourier
Clase 11, 13/05/2015http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases
Random123:
a Library of Counter-Based
Random Number Generators
C++ template library en GPU/CPU Random Numbers en GPU/CPU
Librerias hasta ahora
CUFFT Transformada Rápida de Fourier en GPU
Algebra lineal densa en GPU/CPU
¿ Que es la CUFFT ?
The FFT is a divide-and-conquer algorithm for efficiently computing discrete Fouriertransforms of complex or real-valued data sets. It is one of the most important andwidely used numerical algorithms in computational physics and general signalprocessing. The CUFFT library provides a simple interface for computing FFTs on anNVIDIA GPU, which allows users to quickly leverage the floating-point power andparallelism of the GPU in a highly optimized and tested FFT library.
¿ Que se puede hacer con CUFFT ?
h(t)
tSimetrías
“Descomposición en senos y cosenos”
Ver Por ej: Press etal, Numerical Recipes
Repaso de Transformada de Fourier
h(t)
t
Repaso de Transformada de Fourier
Convolution theorem Correlation theorem
h(t)
t
Porque es tan importante la transformada de Fourier en física computacional ?
Operador...
Interacción...
“Descomposición en senos y cosenos”
Repaso de Transformada de Fourier
Patrones magnéticos (en 2D)
Discretización + Transformada de Fourier
Requiere transformar/antitransformar matrices en cada paso de tiempo....
Lineal pero No-local
Local y lineal
Naive: O(N*N)
PseudoEspectral:O(N log(N))
Convolution theorem Correlation theorem
h(t)
t
Porque es tan importante la transformada de Fourier en física computacional ?
Operador...
Interacción...
“Descomposición en senos y cosenos”
Repaso de Transformada de Fourier
h(t)
Sampling theorem
Transformadadiscreta
Transformada de Fourier discreta
Transformadadiscreta
Anti-Transformada
h(t)
Transformada de Fourier discreta
Transformada discreta 2D
Transformada discreta 3D, etc
Transformada discreta 1D
Transformada de Fourier discreta
Transformadadiscreta
Anti-Transformada
h(t)
Transformada de Fourier discreta
Transformadadiscreta
Anti-Transformada
h(t)
Como calcularlas eficientemente?
Naïve approach [hasta ~1960]: O(N*N)Algoritmos de Fast Fourier transform (FFT) [Cooley–Tukey o Gauss?] : O(N*log2 N) → recursivo
AlgoritmosSecuenciales
Transformada de Fourier discreta
● La librería pública de FFT mas popular:
“La mas rápida del oeste”
Our benchmarks, performed on on a variety of platforms, show that FFTW's performance is typically superior to that of other publicly available FFT software, and is even competitive with vendor-tuned codes. In contrast to vendor-tuned codes, however, FFTW's performance is portable: the same program will perform well on most architectures without modification. Hence the name, "FFTW," which stands for the somewhat whimsical title of "Fastest Fourier Transform in the West."
MKL: Math Kernel LibraryIntel's Math Kernel Library (MKL) is a library of optimized, math routines for science, engineering, and financial applications. Core math functions include BLAS, LAPACK, ScaLAPACK, Sparse Solvers, Fast Fourier Transforms, and Vector Math.
The library supports Intel and compatible processors and is available for Windows, Linux and Mac OS X operating systems.
● Vendor-tuned codes:
Fast Fourier Transforms
CUFFT
CUFFT
CUFFT Samples
Ejemplo de CUFFT3D Complex-to-Complex Transforms #define NX 64#define NY 64#define NZ 128
cufftHandle plan;cufftComplex *data1, *data2;cudaMalloc((void**)&data1, sizeof(cufftComplex)*NX*NY*NZ);cudaMalloc((void**)&data2, sizeof(cufftComplex)*NX*NY*NZ);/* Create a 3D FFT plan. */cufftPlan3d(&plan, NX, NY, NZ, CUFFT_C2C);
/* Transform the first signal in place. */cufftExecC2C(plan, data1, data1, CUFFT_FORWARD);
/* Transform the second signal using the same plan. */cufftExecC2C(plan, data2, data2, CUFFT_FORWARD);
/* Destroy the cuFFT plan. */cufftDestroy(plan);cudaFree(data1); cudaFree(data2);
CUFFT y Thrust
#include <cufft.h>typedef cufftDoubleReal REAL;typedef cufftDoubleComplex COMPLEX;// includes de thrust
int main(){// declaro/aloco arrays input, y su transformada, output thrust::device_vector<REAL> input(N);thrust::device_vector<COMPLEX> output(N/2+1);
// llenar input[] con alguna señal ...
// cast a punteros normales a memoria del deviceREAL * d_input_raw = thrust::raw_pointer_cast(&input[0]);
COMPLEX * d_output_raw = thrust::raw_pointer_cast(&output[0]);
cufftHandle planfft; // declara un plan ... cufftPlan1d(&planfft,N,CUFFT_R2C,1); // lo inicializa ...
cufftExecR2C(planfft, d_input_raw, d_output_raw); // y lo ejecuta ...
// copio la transformada del device al host, y la imprimothrust::host_vector<REAL> output_host = output;for(i=0; i < N/2+1; i++) cout << output_host[i].x << “ ” << output_host[i].y << endl;
}
Ecuación de difusión o “del calor” en dos dimensiones con fuentes arbitrarias
Campo escalar bidimensional Fuentes dependientes del espacio y del tiempo
Fluídos [Navier-Stokes]
Magnetismo[Ginzburg-Landau]
Etc...
Física Estadística [Fokker-Planck]
Mecánica Cuántica[Schrodinger]
Transformando Fourier
Solución analítica!
Modos desacoplados
Ecuación de difusión o “del calor” en dos dimensiones con fuentes arbitrariasen el espacio de Fourier
Esquema explícito
Ecuación de difusión con fuentes arbitrarias
Esquema implícito [Crank-Nicholson]
Diferencias finitas espaciales
Diferencias finitas
-4C'+1C' C'
C'
C'
0
0 0
0
Convolucion en 2D
Stencil h
Se puede resolver en el espacio real, Pero lo haremos en espacio de Fourier
Ecuación de difusión con fuentes arbitrarias
-4C'+1C' C'
C'
C'
0
0 0
0
Stencil h
Todo desacoplado :-)
Ecuación de difusión con fuentes arbitrarias
Aplicar el stencil o hacer la convolucion 2D en el espacio real se reduce a multiplicar por un campo escalar constante la transformada
Ecuación de difusión con fuentes arbitrarias
Esto se calcula una sola vez al principio
Loop temporal
for(t=0;t<TRUN;t++){
}
Euler StepTrivialmenteParalelizable
Ecuación de difusión con fuentes arbitrarias
Euler StepTrivialmenteParalelizable
// Paso de Euler en el espacio de Fourier __global__ void euler_step(cufftComplex *a, const cufftComplex *b, const float *qqmodule, int nx, int ny){// idx and idy, the location of the element in the original NxN array int idx = blockIdx.x*blockDim.x+threadIdx.x; int idy = blockIdx.y*blockDim.y+threadIdx.y; if ( idx < nx && idy < ny){ int index = idx*ny + idy; const float fac=-(qqmodule[index]); a[index].x = (1.f+C_BETA*fac*DT)*a[index].x + DT*b[index].x; a[index].y = (1.f+C_BETA*fac*DT)*a[index].y + DT*b[index].y; } }
Conviene trabajarCon grillas 2D!
Ecuación de difusión con fuentes arbitrarias
Para dibujar (cada tanto) el campo en espacio real → CUFFT → memcpy
for(t=0;t<TRUN;t++){
}
Las fuentes son dadas instantaneamente en el espacio real, pero las necesitamos en Fourier → CUFFT
Kernel Paso de Euler
…
…
Hands-on! Ecuación de difusión con fuentes arbitrarias
● cp -r /share/apps/codigos/alumnos_icnpg2015/heat .● make● qsub script.sh
● Check .ppm images!
Ecuación de difusión con fuentes arbitrarias
Para dibujar (cada tanto) el campo en espacio real → CUFFT → memcpy
for(t=0;t<TRUN;t++){
}
Las fuentes son dadas instantaneamente en el espacio real, pero las necesitamos en Fourier → CUFFT
Kernel Paso de Euler
…
…
main.cu
En este problema: Solo para hacer imágenes
Controla fuentes en espacio real...
Un paso de tiempo en el Espacio de Fourier
Hands-on: Ecuación de difusión con fuentes arbitrarias
Loop temporal principal
Files: main.cu, heat.cu, ppmimages.cuh, Makefile, script.sh
10 FIXED FIXME:● Declaración de planes CUFFT 2D [forward y backward, R2C, C2R]● Alocación de memoria para arrays en espacio real y complejo● Ejecución de planes de transformada/antitransformada ● Destrucción de planes, liberación de memoria● Varios Kernels con grillas 2D Make & Run
● Producir imágenes / hacer película → ● Jugar con parámetros y fuentes...● Donde y como se puede optimizar?● Como agregar términos no lineales?
Hands-on: Ecuación de difusión con fuentes arbitrarias
Kernels, CUFFT Imágenes ppm a partir del campoen espacio real [host]
Loop temporal(alto nivel)
“PlacaMetálica”[Condiciones de ContornoPeriódicas]
“Fuentecaliente”
“Fuente fría”
Una configuración de fuentes divertida
Temp(x,y,t)=???
Hands-on: Ecuación de difusión con fuentes arbitrarias
“PlacaMetálica”[Condiciones de ContornoPeriódicas]
Una configuración de fuentes divertida
Hands-on: Ecuación de difusión con fuentes arbitrarias
● CUFFT Library User Guide NVIDIA.
● CUDA Libraries SDK Code Samples (simpleCUFFT, PDEs, etc).
● FFTW home page: http://www.fftw.org/ [interface parecida para CPU + openmp, mpi].
● Numerical Recipes in C [algoritmo FFT explicado].
● Libros de Numerical PDEs.... [como discretizar las PDEs?]
Referencias