Transformadas de Fourier - Argentina.gob.arTransformadas de Fourier Clase 11, 13/05/2015

Preview:

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

Recommended