Articulo de referencia

Procesamiento digital de señales multidimensional con aceleración por GPU

El procesamiento de señales digitales multidimensional (MDSP) se refiere a la extensión de las técnicas de procesamiento de señales digitales (DSP) a señales que varían en más d...

El procesamiento de señales digitales multidimensional (MDSP) se refiere a la extensión de las técnicas de procesamiento de señales digitales (DSP) a señales que varían en más de una dimensión. Mientras que el DSP convencional generalmente trabaja con datos unidimensionales, como señales de audio variables en el tiempo , el MDSP implica el procesamiento de señales en dos o más dimensiones. Muchos de los principios del DSP unidimensional, como las transformadas de Fourier y el diseño de filtros , tienen contrapartes análogas en el procesamiento de señales multidimensionales .

La computación moderna de propósito general en unidades de procesamiento gráfico (GPGPU) ofrece un excelente rendimiento en operaciones vectoriales y manipulaciones numéricas gracias a un alto grado de paralelismo. El procesamiento de señales digitales, especialmente las multidimensionales, suele implicar una serie de operaciones vectoriales sobre un gran número de muestras de datos independientes. Actualmente, las GPGPU se utilizan ampliamente para acelerar el procesamiento digital de señales (DSP) multidimensional, como el procesamiento de imágenes , los códecs de vídeo , el análisis de señales de radar , el procesamiento de señales de sonar y la ecografía . Conceptualmente, las GPGPU reducen drásticamente la complejidad computacional en comparación con las unidades centrales de procesamiento (CPU), los procesadores digitales de señales (DSP) u otros aceleradores FPGA .

Motivación

El procesamiento de señales multidimensionales es un problema común en la investigación científica y/o en cálculos de ingeniería. Generalmente, la complejidad computacional de un problema de procesamiento digital de señales (DSP) crece exponencialmente con el número de dimensiones. Sin embargo, debido a la alta complejidad temporal y de almacenamiento, resulta extremadamente difícil procesar señales multidimensionales en tiempo real. Si bien se han propuesto numerosos algoritmos rápidos (por ejemplo, la transformada rápida de Fourier, FFT ) para problemas de DSP unidimensionales, aún no son lo suficientemente eficientes para adaptarse a problemas de DSP de alta dimensionalidad. Por lo tanto, sigue siendo difícil obtener los resultados computacionales deseados con procesadores digitales de señales. En consecuencia, se necesitan mejores algoritmos y arquitecturas de hardware para acelerar los cálculos de DSP multidimensionales.

Enfoques existentes

En la práctica, para acelerar el procesamiento digital de señales multidimensional, se han propuesto y desarrollado algunos enfoques comunes en las últimas décadas.

Menor frecuencia de muestreo

Una solución provisional para cumplir con los requisitos de tiempo real en aplicaciones DSP multidimensionales consiste en utilizar una frecuencia de muestreo más baja, lo que permite reducir eficazmente el número de muestras a procesar simultáneamente y, por lo tanto, disminuir el tiempo total de procesamiento. Sin embargo, esto puede provocar el problema del aliasing debido al teorema de muestreo y resultados de baja calidad. En algunas aplicaciones, como radares militares e imágenes médicas, se requieren resultados altamente precisos y exactos. En estos casos, utilizar una frecuencia de muestreo más baja para reducir la cantidad de cálculos en el dominio DSP multidimensional no siempre es viable.

Procesadores de señales digitales

Los procesadores de señales digitales están diseñados específicamente para procesar operaciones vectoriales. Se han utilizado ampliamente en cálculos DSP durante décadas. Sin embargo, la mayoría de los procesadores de señales digitales solo son capaces de manipular unas pocas operaciones en paralelo. Este tipo de diseño es suficiente para acelerar el procesamiento de audio (señales unidimensionales) y el procesamiento de imágenes (señales bidimensionales). No obstante, con un gran número de muestras de datos de señales multidimensionales, aún no son lo suficientemente potentes como para obtener resultados de cálculo en tiempo real.

Asistencia de supercomputadoras

Para acelerar los cálculos DSP multidimensionales, en ciertas circunstancias, como en la predicción meteorológica y los radares militares, se requiere el uso de supercomputadoras o clústeres de computadoras . Sin embargo, el uso de supercomputadoras destinadas únicamente a realizar operaciones DSP implica un costo económico y un consumo energético considerables. Además, no resulta práctico ni adecuado para todas las aplicaciones DSP multidimensionales.

aceleración de GPU

Las GPU se diseñaron originalmente para acelerar el procesamiento de imágenes y la renderización de secuencias de vídeo. Además, dado que las GPU modernas tienen una buena capacidad para realizar cálculos numéricos en paralelo con un coste relativamente bajo y una mayor eficiencia energética, se están convirtiendo en una alternativa popular para reemplazar a las supercomputadoras que realizan DSP multidimensional. [ 1 ]

cálculos GPGPU

Figura que ilustra una unidad de computación vectorial/SIMD en GPGPU.
Modelo de computación GPGPU/SIMD

Los diseños modernos de GPU se basan principalmente en el paradigma de computación SIMD (Single Instruction Multiple Data). [ 2 ] [ 3 ] Este tipo de dispositivos GPU se denominan GPU de propósito general (GPGPU) .

Las GPGPU pueden realizar operaciones con múltiples datos independientes simultáneamente gracias a sus unidades funcionales vectoriales o SIMD. Una GPGPU moderna puede generar miles de hilos concurrentes y procesarlos todos por lotes. Gracias a esta característica, las GPGPU se pueden emplear fácilmente como aceleradores DSP, mientras que muchos problemas DSP se pueden resolver mediante algoritmos de divide y vencerás . Un problema DSP complejo y de gran escala se puede dividir en varios problemas numéricos pequeños y procesarse simultáneamente, lo que reduce significativamente la complejidad temporal total. Por ejemplo, la multiplicación de dos matrices M × M se puede procesar con M × M hilos concurrentes en una GPGPU sin depender de los datos de salida. Por lo tanto, teóricamente, mediante la aceleración con GPGPU, podemos obtener una aceleración de hasta M × M en comparación con una CPU o un procesador de señales digitales tradicional.

lenguajes de programación de GPU

Actualmente, existen varios lenguajes de programación o interfaces que admiten la programación GPGPU.

CUDA

CUDA es la interfaz estándar para programar las GPU de Nvidia . Nvidia también proporciona muchas bibliotecas CUDA para admitir la aceleración DSP en los dispositivos GPU de Nvidia. [ 4 ]

OpenCL

OpenCL es un estándar industrial propuesto originalmente por Apple Inc. y mantenido y desarrollado actualmente por el Grupo Khronos . [ 5 ] OpenCL proporciona API similares a C++ para programar diferentes dispositivos de forma universal, incluidas las GPGPU.

Ilustrando el flujo de ejecución de un programa/núcleo OpenCL.
Flujo de ejecución del programa OpenCL

La siguiente figura ilustra el flujo de ejecución de un programa OpenCL en una GPU. La CPU primero detecta los dispositivos OpenCL (la GPU en este caso) y luego invoca un compilador justo a tiempo para traducir el código fuente de OpenCL al binario de destino. A continuación, la CPU envía datos a la GPU para realizar los cálculos. Mientras la GPU procesa los datos, la CPU puede dedicarse a sus propias tareas.

C++ AMP

C++ AMP es un modelo de programación propuesto por Microsoft . C++ AMP es una biblioteca basada en C++ diseñada para programar procesadores SIMD [ 6 ].

OpenACC

OpenACC es un estándar de programación para computación paralela desarrollado por Cray , CAPS, NVIDIA y PGI. [ 7 ] OpenACC está orientado a la programación para sistemas heterogéneos de CPU y GPU con extensiones de C , C++ y Fortran .

Ejemplos de programación de GPU para DSP multidimensional

Multiplicación de matrices m × m

Supongamos que A y B son dos matrices m × m y que queremos calcular C = A × B.

A=(A11A12A1metroA21A22A2metroAmetro1Ametro2Ametrometro),B=(B11B12B1metroB21B22B2metroBmetro1Bmetro2Bmetrometro){\displaystyle \mathbf {A} ={\begin{pmatrix}A_{11}&A_{12}&\cdots &A_{1m}\\A_{21}&A_{22}&\cdots &A_{2m}\\\vdots &\vdots &\ddots &\vdots \\A_{m1}&A_{m2}&\cdots &A_{mm}\\\end{pmatrix}},\quad \mathbf {B} ={\begin{pmatrix}B_{11}&B_{12}&\cdots &B_{1m}\\B_{21}&B_{22}&\cdots &B_{2m}\\\vdots &\vdots &\ddots &\vdots \\B_{m1}&B_{m2}&\cdots &B_{mm}\\\end{pmatrix}}}

do=A×B=(do11do12do1metrodo21do22do2metrodometro1dometro2dometrometro),doij=k=1metroAikBkj{\displaystyle \mathbf {C} =\mathbf {A} \times \mathbf {B} ={\begin{pmatrix}C_{11}&C_{12}&\cdots &C_{1m}\\C_{21}&C_{22}&\cdots &C_{2m}\\\vdots &\vdots &\ddots &\vdots \\C_{m1}&C_{m2}&\cdots &C_{mm}\\\end{pmatrix}},\quad C_{ij}=\sum _{k=1}^{m}A_{ik}B_{kj}}

Para calcular cada elemento en C se requieren m multiplicaciones y ( m1 ) sumas. Por lo tanto, con una implementación en CPU, la complejidad temporal para lograr este cálculo es Θ(n³ ) en el siguiente ejemplo de C. Sin embargo, sabemos que los elementos en C son independientes entre sí. Por lo tanto, el cálculo puede paralelizarse completamente mediante procesadores SIMD, como los dispositivos GPGPU. Con una implementación en GPGPU, la complejidad temporal se reduce significativamente a Θ(n) al desenrollar el bucle for como se muestra en el siguiente ejemplo de OpenCL .

// Multiplicación de matrices MxM en Cmatriz vacíaMul (float * A , // matriz de entrada Afloat * B , // matriz de entrada Bfloat * C , // matriz de salida Cint tamaño ) // tamaño de las matrices{// N x N x N iteracionespara ( int fila = 0 ; fila < tamaño ; fila ++ ) {para ( int col = 0 ; col < size ; col ++ ) {int id = fila * tamaño + columna ;suma flotante = 0.0 ;para ( int m = 0 ; m < tamaño ; m ++ ) {suma += ( A [ fila * tamaño + m ] * B [ m * tamaño + columna ]);}C [ id ] = suma ;}}}
// Multiplicación de matrices MxM en OpenCL__kernel void matrixMul (__global float * A , // matriz de entrada A__global float * B , // matriz de entrada B__global float * C , // matriz de salida C__global int size ) // tamaño de las matrices{size_t id = get_global_id ( 0 ); // cada hilo trabaja en un elementosize_t fila = id / tamaño ;tamaño_t col = id % tamaño ;suma flotante = 0.0 ;// N iteracionespara ( int m = 0 ; m < tamaño ; m ++ ) {suma += ( A [ fila * tamaño + m ] * B [ m * tamaño + columna ]);}C [ id ] = suma ;}

convolución multidimensional

La convolución es una operación muy utilizada en el procesamiento digital de señales (DSP). Para calcular la convolución bidimensional de dos señales m × m , se requieren multiplicaciones y m × ( m1 ) sumas para cada elemento de salida. Es decir, la complejidad temporal total es Θ(n⁴ ) para toda la señal de salida . Como muestra el siguiente ejemplo de OpenCL, con la aceleración de GPGPU, el tiempo total de cálculo se reduce efectivamente a Θ(n² ) ya que todos los elementos de salida son independientes de los datos.

Ecuación de convolución 2D:

y(norte1,norte2)=incógnita(norte1,norte2)h(norte1,norte2)=k1=0metro1k2=0metro1incógnita(k1,k2)h(norte1k1,norte2k2){\displaystyle y(n_{1},n_{2})=x(n_{1},n_{2})**h(n_{1},n_{2})=\sum _{k_{1}=0}^{m-1}\sum _{k_{2}=0}^{m-1}x(k_{1},k_{2})h(n_{1}-k_{1},n_{2}-k_{2})}

// Implementación de convolución 2D en OpenCL__kernel void convolución (__global float * x , // señal de entrada x__global float * h , // filtrar h__global float * y , // señal de salida y__global int size ) // tamaño de ROS de la señal de entrada y del filtro{size_t id = get_global_id ( 0 ); // cada hilo trabaja en un elementosize_t fila = tamaño + tamaño - 1 ; // número de filas de la señal de salidasize_t col = size + size - 1 ; // número de columnas de la señal de salidatamaño_t n1 = id / fila ;tamaño_t n2 = id % col ;suma flotante = 0.0 ;// N x N iteracionespara ( int k1 = 0 ; k1 < size ; k1 ++ ) {para ( int k2 = 0 ; k2 < size ; k2 ++ ) {suma += ( x [ k1 * fila + k2 ] * h [( n1 * fila - k1 ) + ( n2 - k2 )]);}}C [ id ] = suma ;}

Cabe señalar que, si bien el ejemplo mostrado anteriormente es una convolución 2D, se puede adoptar un enfoque similar para un sistema de mayor dimensión. En general, para una convolución sD, una implementación GPGPU tiene una complejidad temporal Θ(n s ) , mientras que una implementación CPU tiene una complejidad temporal Θ(n 2s ) .

Ecuación de convolución MD:

y(norte1,norte2,...,nortes)=incógnita(norte1,norte2,...,nortes)h(norte1,norte2,...,nortes)=k1=0metro11k2=0metro21...ks=0metros1incógnita(k1,k2,...,ks)h(norte1k1,norte2k2,...,nortesks){\displaystyle y(n_{1},n_{2},...,n_{s})=x(n_{1},n_{2},...,n_{s})**h(n_{1},n_{2},...,n_{s})=\sum _{k_{1}=0}^{m_{1}-1}\sum _{k_{2}=0}^{m_{2}-1}...\sum _{k_{s}=0}^{m_{s}-1}x(k_{1},k_{2},...,k_{s})h(n_{1}-k_{1},n_{2}-k_{2},...,n_{s}-k_{s})}

Transformada de Fourier de tiempo discreto multidimensional (MD DTFT)

Además de la convolución, la transformada discreta de Fourier (DTFT) es otra técnica que se utiliza con frecuencia en el análisis de sistemas.

incógnita(Ω1,Ω2,...,Ωs)=norte1=0metro11norte2=0metro21...nortes=0metros1incógnita(norte1,norte2,...,nortes)mij(Ω1norte1+Ω1norte1+...+Ωsnortes){\displaystyle X(\Omega _{1},\Omega _{2},...,\Omega _{s})=\sum _{n_{1}=0}^{m_{1}-1}\sum _{n_{2}=0}^{m_{2}-1}...\sum _{n_{s}=0}^{m_{s}-1}x(n_{1},n_{2},...,n_{s})e^{-j(\Omega _{1}n_{1}+\Omega _{1}n_{1}+...+\Omega _{s}n_{s})}}

En la práctica, para implementar una MD DTFT, podemos realizar M veces una DFTF 1-D y transponer la matriz con respecto a cada dimensión. Con una operación DTFT 1-D, GPGPU puede reducir conceptualmente la complejidad de Θ(n² ) a Θ(n ) , como se ilustra en el siguiente ejemplo de implementación OpenCL . Es decir, una MD DTFT con la complejidad de GPGPU se puede calcular en una GPU con una complejidad de Θ(n² ) . Si bien algunas GPGPU también están equipadas con aceleradores FFT de hardware internos, esta implementación también podría optimizarse invocando las API o bibliotecas FFT proporcionadas por el fabricante de la GPU. [ 8 ]

// DTFT en OpenCL__kernel void convolución (__global float * x_re ,__global float * x_im ,__global float * X_re ,__global float * X_im ,__tamaño entero global ){size_t id = get_global_id ( 0 ); // cada hilo trabaja en un elementoX_re [ id ] = 0.0 ;X_im [ id ] = 0.0 ;para ( int i = 0 ; i < size ; i ++ ) {X_re += ( x_re [ id ] * cos ( 2 * 3.1415 * id / size ) - x_im [ id ] * sin ( 2 * 3.1415 * id / size ));X_im += ( x_re [ id ] * sin ( 2 * 3.1415 * id / size ) + x_im [ id ] * cos ( 2 * 3.1415 * id / size ));}}

Aplicaciones reales

Diseño de filtros digitales

El diseño de filtros digitales multidimensionales representa un gran desafío, especialmente para los filtros IIR . Generalmente, se recurre a computadoras para resolver ecuaciones en diferencias y obtener un conjunto de soluciones aproximadas. Si bien la computación en GPGPU se está popularizando, se han propuesto diversos algoritmos adaptativos para diseñar filtros FIR y/o IIR multidimensionales mediante GPGPU. [ 9 ] [ 10 ] [ 11 ]

Reconstrucción y análisis de señales de radar

Los sistemas de radar suelen necesitar reconstruir numerosas muestras de datos 3D o 4D en tiempo real. Tradicionalmente, sobre todo en el ámbito militar, esto requiere el apoyo de supercomputadoras. Actualmente, las GPGPU también se emplean para reemplazar a las supercomputadoras en el procesamiento de señales de radar. Por ejemplo, para procesar señales de radar de apertura sintética (SAR) , generalmente se requieren cálculos de FFT multidimensionales . [ 12 ] [ 13 ] [ 14 ] Las GPGPU pueden utilizarse para realizar rápidamente FFT y/o iFFT en este tipo de aplicaciones.

coches autónomos

Muchos vehículos autónomos aplican técnicas de reconocimiento de imágenes 3D para el autocontrol. Evidentemente, para adaptarse al entorno exterior que cambia rápidamente, los procesos de reconocimiento y toma de decisiones deben realizarse en tiempo real. Las GPGPU son dispositivos excelentes para lograr este objetivo. [ 15 ]

Procesamiento de imágenes médicas

Para obtener un diagnóstico preciso, las señales médicas bidimensionales o tridimensionales, como las obtenidas mediante ultrasonido , rayos X , resonancia magnética y tomografía computarizada , suelen requerir una alta frecuencia de muestreo y una elevada resolución de imagen para su reconstrucción. Se ha demostrado que, gracias a la potencia de cálculo superior de las GPGPU, se pueden obtener imágenes médicas de mejor calidad [ 16 ] [ 17 ].

Referencias

  1. Chu, Slo-Li; Hsiao, Chih-Chieh (1 de septiembre de 2010). "OpenCL: Hacer posible la supercomputación ubicua". 2010 IEEE 12.ª Conferencia Internacional sobre Computación y Comunicaciones de Alto Rendimiento (HPCC) . págs. 556–561 . doi : 10.1109/HPCC.2010.56 . ISBN  978-1-4244-8335-8. S2CID 14586211 . 
  2. Lindholm, E.; Nickolls, J.; Oberman, S.; Montrym, J. (2008-03-01). "NVIDIA Tesla: una arquitectura unificada de gráficos y computación". IEEE Micro . 28 (2): 39– 55. Bibcode : 2008IMicr..28b..39L . doi : 10.1109/MM.2008.31 . ISSN 0272-1732 . S2CID 2793450 .  
  3. Kim, Hyesoon ; Vuduc, Richard; Baghsorkhi, Sara; Choi, Jee; Hwu, Wen-Mei W. (2012). Hill, Mark D. (ed.). Análisis y optimización del rendimiento para unidades de procesamiento gráfico de propósito general (GPGPU) . Morgan & Claypool Publishers. doi : 10.2200/S00451ED1V01Y201209CAC020 . ISBN 978-1-60845-954-4.
  4. "Plataforma de programación y computación paralela | CUDA | NVIDIA | NVIDIA" . www.nvidia.com . Archivado del original el 6 de enero de 2014. Consultado el 5 de noviembre de 2015 .
  5. "OpenCL – El estándar abierto para la programación paralela de sistemas heterogéneos" . www.khronos.org . 21 de julio de 2013. Consultado el 5 de noviembre de 2015 .
  6. "C++ AMP (C++ Accelerated Massive Parallelism)" . msdn.microsoft.com . Consultado el 5 de noviembre de 2015 .
  7. "Página principal de OpenACC | www.openacc.org" . www.openacc.org . Consultado el 5 de noviembre de 2015 .
  8. "Estudio de caso de optimización de OpenCL™ Transformada rápida de Fourier – Parte II – AMD" . AMD . Consultado el 5 de noviembre de 2015 .
  9. Nehab, Diego; Maximo, André; Lima, Rodolfo S.; Hoppe, Hugues (1 de enero de 2011). «Filtrado recursivo eficiente en GPU y tablas de área sumada». Actas de la Conferencia SIGGRAPH Asia 2011. SA '11. Nueva York, NY, EE. UU.: ACM. págs. 176:1–176:12. doi : 10.1145/2024156.2024210 . ISBN  978-1-4503-0807-6. S2CID 3014398 . 
  10. Pharr, Matt; Fernando, Randima (2005). GPU Gems 2: Técnicas de programación para gráficos de alto rendimiento y computación de propósito general . Pearson Addison Wesley. ISBN 978-0-321-33559-3.
  11. Hwu, Wen-mei W. (2011). GPU Computing Gems Emerald Edition . San Francisco, CA, EE. UU.: Morgan Kaufmann Publishers Inc. ISBN 978-0-12-385963-1.
  12. Clemente, C.; Di Bisceglie, M.; Di Santo, M.; Ranaldo, N.; Spinelli, M. (1 de octubre de 2009). "Procesamiento de datos sintéticos de radar de apertura con GPGPU". Taller IEEE de 2009 sobre sistemas de procesamiento de señales . págs. 309–314 . doi : 10.1109/SIPS.2009.5336272 . ISBN  978-1-4244-4335-2. S2CID 18932083 . 
  13. Liu, Bin; Wang, Kaizhi; Liu, Xingzhao; Yu, Wenxian (1 de octubre de 2009). "Un procesador SAR eficiente basado en GPU mediante CUDA". Segundo Congreso Internacional de Procesamiento de Imágenes y Señales de 2009. págs. 1-5 . doi : 10.1109/CISP.2009.5304418 . ISBN  978-1-4244-4129-7. S2CID 18801932 . 
  14. Monsurro, P.; Trifiletti, A.; Lannutti, F. (1 de junio de 2014). «Implementación de algoritmos de radar en hardware CUDA». Actas de la 21.ª Conferencia Internacional sobre Diseño Mixto de Circuitos Integrados y Sistemas (MIXDES) de 2014. pp. 455–458 . doi : 10.1109/MIXDES.2014.6872240 . ISBN  978-83-63578-05-3. S2CID 16482715 . 
  15. Fang, Jianbin; Varbanescu, AL; Shen, Jie; Sips, H.; Saygili, G.; van der Maaten, L. (1 de diciembre de 2012). "Aceleración de la agregación de costos para la correspondencia estéreo en tiempo real". 18.ª Conferencia Internacional IEEE de 2012 sobre Sistemas Paralelos y Distribuidos . págs. 472–481 . doi : 10.1109/ICPADS.2012.71 . ISBN  978-1-4673-4565-1. S2CID 14737126 . 
  16. "Imágenes médicas|NVIDIA" . www.nvidia.com . Consultado el 7 de noviembre de 2015 .
  17. Heng, Yang; Gu, Lixu (1 de enero de 2005). "Renderizado volumétrico basado en GPU para la visualización de imágenes médicas". 27.ª Conferencia Anual de Ingeniería en Medicina y Biología del IEEE de 2005. Vol. 5. págs. 5145–5148 . doi : 10.1109/IEMBS.2005.1615635 . ISBN   978-0-7803-8741-6. PMID 17281405 . S2CID 17401263 .