transformadas de fourier -...
TRANSCRIPT
![Page 1: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/1.jpg)
Transformadas de Fourier
Clase 11, 13/05/2015http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases
![Page 2: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/2.jpg)
Pero antes... streams with Thrust
![Page 3: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/3.jpg)
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
![Page 4: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/4.jpg)
Transformadas de Fourier
Clase 11, 13/05/2015http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases
![Page 5: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/5.jpg)
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
![Page 6: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/6.jpg)
¿ 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.
![Page 7: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/7.jpg)
¿ Que se puede hacer con CUFFT ?
![Page 8: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/8.jpg)
h(t)
tSimetrías
“Descomposición en senos y cosenos”
Ver Por ej: Press etal, Numerical Recipes
Repaso de Transformada de Fourier
![Page 9: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/9.jpg)
h(t)
t
Repaso de Transformada de Fourier
![Page 10: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/10.jpg)
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
![Page 11: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/11.jpg)
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))
![Page 12: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/12.jpg)
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
![Page 13: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/13.jpg)
h(t)
Sampling theorem
Transformadadiscreta
Transformada de Fourier discreta
![Page 14: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/14.jpg)
Transformadadiscreta
Anti-Transformada
h(t)
Transformada de Fourier discreta
![Page 15: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/15.jpg)
Transformada discreta 2D
Transformada discreta 3D, etc
Transformada discreta 1D
Transformada de Fourier discreta
![Page 16: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/16.jpg)
Transformadadiscreta
Anti-Transformada
h(t)
Transformada de Fourier discreta
![Page 17: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/17.jpg)
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
![Page 18: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/18.jpg)
● 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
![Page 19: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/19.jpg)
CUFFT
![Page 20: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/20.jpg)
CUFFT
![Page 21: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/21.jpg)
CUFFT Samples
![Page 22: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/22.jpg)
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);
![Page 23: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/23.jpg)
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;
}
![Page 24: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/24.jpg)
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]
![Page 25: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/25.jpg)
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
![Page 26: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/26.jpg)
Esquema explícito
Ecuación de difusión con fuentes arbitrarias
Esquema implícito [Crank-Nicholson]
Diferencias finitas espaciales
![Page 27: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/27.jpg)
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
![Page 28: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/28.jpg)
-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
![Page 29: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/29.jpg)
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
![Page 30: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/30.jpg)
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!
![Page 31: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/31.jpg)
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
…
…
![Page 32: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/32.jpg)
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!
![Page 33: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/33.jpg)
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
…
…
![Page 34: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/34.jpg)
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
![Page 35: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/35.jpg)
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)
![Page 36: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/36.jpg)
“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
![Page 37: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/37.jpg)
“PlacaMetálica”[Condiciones de ContornoPeriódicas]
Una configuración de fuentes divertida
Hands-on: Ecuación de difusión con fuentes arbitrarias
![Page 38: Transformadas de Fourier - Iniciofisica.cab.cnea.gov.ar/gpgpu/images/clases/clase11_icnpg2015_cufft.pdf · La librería pública de FFT mas popular: “La mas rápida del oeste”](https://reader030.vdocuments.net/reader030/viewer/2022021805/5baaa96509d3f215608cafa1/html5/thumbnails/38.jpg)
● 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