• No se han encontrado resultados

Procesamiento de señales SAR en GPGPU

N/A
N/A
Protected

Academic year: 2017

Share "Procesamiento de señales SAR en GPGPU"

Copied!
10
0
0

Texto completo

(1)

Procesamiento de Se˜

nales SAR en GPGPU

M´onica M. Denham1,2, Javier A. Areta1

1 Universidad Nacional de R´ıo Negro, R´ıo Negro, Argentina

2 Instituto de Investigaci´on en Inform´atica III-LIDI, Universidad Nacional de La

Plata, La Plata, Argentina

mdenham@unrn.edu.ar,jareta@unrn.edu.ar

Abstract. Este trabajo tiene como objetivo presentar las principales caracter´ısticas del dise˜no e implementaci´on de algoritmos paralelos para el procesamiento de se˜nales de radar de apertura sint´etitca (SAR). Se analizan las razones por las que el problema es paralelizable y se pre-sentan implementaciones de algoritmos cl´asicos para la obtenci´on de im´agenes. Tambi´en se presentan adaptaciones de estos algoritmos para ser utilizados sobre arquitecturas paralelas de tipo GPU de prop´osito general. Estas modificaciones son propuestas con el objetivo de obtener algoritmos altamente eficientes y escalables en este tipo de arquitecturas.

1

Introducci´

on

En este trabajo se aborda el procesamiento de se˜nales de radares SAR ( Syn-thetic Aperture Radar) utilizando algoritmos implementados en forma paralela en GPU (Graphic Processing Unit) de prop´osito general. Este procesamiento se basa en la combinaci´on de m´ultiples ”mediciones” (datos recibidos por un sensor, en este caso un radar) para generar informaci´on ´util al ser humano. El tipo de procesamiento realizado puede aplicarse tambi´en en problemas tales como procesamiento de se˜nales sonar [5], sistemas de detecci´on de movimientos s´ısmicos, arreglos de sensores terrestres, etc. Luego, el obtener soluciones para-lelas eficientes para uno de estos dominios puede generalizarse a otros campos.

Si bien existen diversos tipos de procesamiento de se˜nales SAR, la aplicaci´on m´as difundida es la de generar im´agenes de la superficie terrestre de alta reso-luci´on. Estas im´agenes se utilizan en ´areas de diversa ´ındole como cartograf´ıa, teledetecci´on, agronom´ıa, estudio de corrientes marinas, estudio de dispersi´on de fluidos en oc´eanos o mares, detecci´on de cambios terrestres, informaci´on de respuesta de emergencia, etc. En la actualidad, estos radares generan im´agenes fiables de alta resoluci´on (por ejemplo en [12] se reportan resoluciones de 1m) independientemente de las condiciones meteorol´ogicas y de iluminaci´on.

(2)
[image:2.612.156.465.187.321.2]

dichos pulsos recibidos por el radar (esquema en figura 1). La energ´ıa de dicho eco recibido es proporcional a la reflectancia del terreno [3] [1]. Al ser este tipo de radar activo tiene su propia fuente de energ´ıa, por lo que no depende de factores externos para poder operar (luz solar por ejemplo).

Fig. 1.Env´ıo de pulsos y recepci´on de ecos, datos crudos SAR y datos procesados.

El principio b´asico de funcionamiento de un radar cl´asico es el de medici´on del tiempo de viaje de un pulso enviado desde el radar, siendo este tiempo proporcional a la distancia a la que se encuentra el objeto que lo ha reflejado. Este tipo de radar tiene en general una buena resoluci´on en rango pero su resoluci´on en acimut decae en forma proporcional a la distancia a la que se encuentra el objeto. Este decaimiento de la resoluci´on con la distancia est´a relacionado con la apertura de la antena, que a su vez es inversamente proporcional a las dimensiones de la misma. Por ello el uso de radares convencionales para la gene-raci´on de im´agenes es inadecuado ya que para obtener una adecuada resoluci´on el tama˜no de la antena resulta prohibitivo (esto depende a su vez de la longitud de onda utilizada, pero resoluciones del orden del metro en banda X implicar´ıan antenas del orden de la centena de metros para aplicaciones aerotransportadas). Para obtener una antena con gran apertura sin necesidad de que esta antena est´e compuesta por un solo elemento, se propuso el uso de distintas mediciones de radar y su posterior combinaci´on coherente, de manera de refinar los valores estimados. Para ello se recurre a tomar muestras temporales consecutivas de radar que iluminen un ´area com´un, lo que puede verse en forma an´aloga a tener un arreglo de sensores ”sint´etico” –adem´as de asincr´onico (figura 1)– y de gran apertura (proporcional a la distancia recorrida por el sensor m´ovil en el tiempo que dura la recolecci´on de datos). Estos datos se procesan luego conjuntamente para obtener lo que se denomina una medici´on de apertura sint´etica.

(3)

modo de operaci´on genera un gran volumen de datos. A modo de ejemplo, se toma un escenario real descrito en [6]: radar que opera en el sat´elite ERS donde una escena de 100x100km2, genera una matriz de datos crudos de 26800 l´ıneas y cada l´ınea (fila) est´a formada por 5616 p´ıxeles. Esto genera 300MB de datos crudos a procesar. Los c´alculos son realizados en punto flotante, lo que genera una matriz de 1.2GB de procesamiento. A su vez, en este escenario, la salida es una matriz de 500MB aproximadamente: 25000 l´ıneas de 4912 p´ıxeles, cada uno codificado como n´umero complejo de 2 + 2 bytes.

Luego, el procesamiento de se˜nales SAR implica el procesamiento de un gran volumen de datos. A su vez, las aplicaciones actuales generan la necesidad de au-mentar la precisi´on de las im´agenes: esto implica algoritmos m´as complejos sobre los datos, lo que resulta en tiempos de c´omputo mayores. Se observa tambi´en que el requerimiento de obtener estas im´agenes en tiempo real (o cercano al tiempo real) es cada vez mayor.

Todas estas caracter´ısticas llevan a que este tipo de aplicaciones sea un gran desaf´ıo desde el punto de vista de la tecnolog´ıaHigh Performance Computing.

Una forma natural de enfrentar este problema es a trav´es del c´omputo para-lelo. En este trabajo se propone utilizar la arquitectura GPGPU (General Pur-pose Graphic Processing Unit). La arquitectura GPU nace para realizar c´omputo gr´afico, pero debido a su alto rendimiento en c´omputo complejo los investigadores han propuesto el uso de estos dispositivos para acelerar soluciones a problemas f´ısicos como son an´alisis de flujos de fluidos, transformadas de Fourier (FFT), crecimiento de cristales, etc [1].

Dada su alta capacidad de procesamiento y su bajo costo, el uso de esta tecnolog´ıa es cada vez mayor, se estima que su uso ser´a masivo y en un futuro arquitecturas paralelas de tipocluster estar´an formados por nodos donde cada nodo sea una o m´ultiples placas GPU conectadas.

Para obtener aplicaciones eficientes y escalables en este tipo de arquitectura es necesario tener en cuenta sus caracter´ısticas de hardware como as´ı tambi´en del software relacionado a la programaci´on en las mismas. Es necesario luego realizar un dise˜no de las aplicaciones espec´ıficas para GPU, aplicaciones que maximicen el alto poder de paralelismo y de c´omputo de dichas placas.

El estudio de la bibliograf´ıa relacionada al procesamiento de se˜nales SAR muestra la tendencia de soluciones desarrolladas paraclustersde computadoras, y muy poco se observa en relaci´on al desarrollo en GPGPU.

Este trabajo propone el dise˜no e implementaci´on de dos algoritmos para el procesamiento de se˜nales SAR: RDA (Range Doppler Algorithm) y CSA (Chirp Scaling Algorithm) [1] [3] [11]. Estos algoritmos son ampliamente utilizados en este dominio y en este trabajo significan un primer paso en el desarrollo de procesamiento de se˜nales SAR.

Dichos algoritmos ser´an espec´ıficamente desarrollados para GPGPU, donde se intentar´a lograr algoritmos altamente eficientes y escalables.

(4)

2

Arquitectura GPGPU

Los procesadores gr´aficos GPU nacen para aplicaciones espec´ıficas: aplicaciones gr´aficas, tridimiensionales o videojuegos, pero su alta potencia de c´omputo, bajo costo y reducido consumo han convertido estas placas en arquitecturas utilizadas para c´omputo de alto rendimiento de uso general [7] [9].

Se utilizan como co-procesador para resolver tareas altamente paralelizables, mientras que el c´odigo menos paralelizable puede seguir ejecut´andose en la CPU [9].

Una GPU est´a compuesta por un gran n´umero de n´ucleos (cores) de proce-samiento. El procesamiento en una GPU se basa en la definici´on de funciones llamadas kernels las cuales se ejecutan en paralelo (y concurrentemente) en los

cores disponibles. Dichoscores se agrupan en multiprocesadores, existiendo di-versos multiprocesadores en cada GPU.

Para la programaci´on de aplicaciones paralelas en GPU existe un modelo de programaci´on ampliamente difundido llamado CUDA (Compute Unified Device Architecture) [2]. CUDA propone el modelo de programaci´on SIMD (Simple Instruction Multiple Data) y es una extensi´on del lenguaje C/C++ que agrega funcionalidad para el manejo dethreads (kernels) concurrentes y la jerarqu´ıa de memoria de las placas GPU [2] [10] [4].

Una aplicaci´on CUDA est´a compuesta por c´odigo secuencial y c´odigo para-lelo. El c´odigo secuencial se ejecuta en la CPU mientras que el c´odigo paralelo (kernels) se ejecuta en la placa GPU. La CPU comanda la ejecuci´on de los

kernels en la GPU.

Por cadakernel definido en una aplicaci´on CUDA se crean m´ultiplesthreads

(pueden ser miles) que se ejecutan en paralelo. Los threads se organizan en bloques (de 1, 2 o 3 dimensiones) y a su vez, los bloques se organizan en grids (de 1 o 2 dimensiones, y 3 dimensiones para las arquitecturas m´as actuales) (figura 2). Es el programador el que define la configuraci´on de los kernels en bloques y grid. Esta configuraci´on puede ser distinta para cadakernel.

En las arquitecturas actuales (Fermi, Tesla, Quadro [7]) cada bloque puede tener hasta 1024 threads y cada grid puede tener hasta un m´aximo de 65535 bloques por dimensi´on (1, 2 o 3 dimensiones). Esta gran cantidad dethreadsque se pueden crear por cadakernel constituyen una forma distinta de dise˜nar los algoritmos: el n´umero de threads paralelos es ”infinito”, siendo esto una gran ventaja respecto a otras arquitecturas paralelas, donde la cantidad de procesos paralelos est´a limitado, por ejemplo, por la cantidad de nodos y procesadores presentes en uncluster de computadoras.

Todos losthreads creados en un kernel ejecutan la misma instrucci´on sobre distintos datos. La potencia de las GPU reside en este alt´ısimo poder de para-lelismo y la alta capacidad de c´omputo de cada n´ucleo de procesamiento. Las GPUs aprovechan el paralelismo de datos presente en las aplicaciones.

Losthreadsde cada bloque se ejecutan enwarpsde 32threads (en las arqui-tecturas actuales, probablemente en el futuro este n´umero aumente). Losthreads

(5)
[image:5.612.237.369.120.275.2]

Fig. 2.Organizaci´on dethreads en bloques y en grids [4].

hay bifurcaciones y distintos threads ejecutan distintas instrucciones, un sub-grupo dethreads espera a la ejecuci´on de otro subgrupo dethreads, dependiendo de las instrucciones que ejecuten.

Por otro lado, las placas GPU tienen distintos tipos de memoria definiendo una clara jeraqu´ıa. Cada tipo de memoria tiene sus propias caracter´ısticas: tipo y costo de acceso, alcance y ciclo de vida de los objetos definidos en ella, costo de accesos y mecanismos de optimizaci´on. CUDA provee mecanismos para operar con esta jerarqu´ıa de memorias presente en los dispositivos GPU [9]. Conociendo las caracter´ısticas de la jerarqu´ıa de memoria instalada en el dispositivo GPU, el programador puede tomar decisiones respecto al almacenamiento y acceso a los datos a fin de mejorar la eficiencia de la aplicaci´on en la GPU, como as´ı tambi´en, evitar posibles penalizaciones por la latencia que significa el acceso a cada memoria.

La jerarqu´ıa de memoria y tipos de accesos en un sistema GPU est´an es-quematizados en la figura 3 ([9]).

Existe una memoria global a la cual acceden todos los threads del grid, y que es el medio de comunici´on entre CPU y GPU. El acceso a dicha memoria es muy costoso en t´erminos de tiempo de acceso. Adem´as existen las memorias

constante y de textura, las cuales cuentan con una memoria cache por lo que su tiempo de acceso es r´apido. Estas memorias son de escritura para la CPU y de lectura para los threads. A nivel de bloque existe una memoria compartida (shared en la figura) que es de muy r´apido acceso pero de dimensiones mucho m´as peque˜nas que las memorias anteriormente mencionadas. Por ´ultimo, cada

thread cuenta con registros cuyo acceso es el m´as veloz de todos, pero como se puede preveer, la capacidad y cantidad de los registros es limitada.

(6)
[image:6.612.213.405.117.299.2]

Fig. 3.Arquitectura GPU. Multiprocesadores y jerarqu´ıa de memorias y accesos. En la figura, host designa a la CPU y Dispositivo a la GPU [9].

afectado por la utilizaci´on de dichas memorias. En general, se debe evitar el acceso a memoria global mientras que se debe maximizar la correcta utilizaci´on de memoria compartida y registros internos de cadathread.

Por otro lado, para muchas de las librer´ıas existentes para C, existe su versi´on para CUDA optimizadas para su ejecuci´on en los dispositivos gr´aficos. Estas li-brer´ıas operan de forma ´optima y de forma transparente al usuario, definen la mejor configuraci´on dethreads en bloques y del grid. Adem´as optimizan la uti-lizaci´on de la jerarqu´ıa de memorias instalada en dichos dispositivos. Ejemplos de estas librer´ıas son cuBLAS (CUDA Basic Linear Algebra Subprograms), cuFFT (CUDA Fast Fourier Transform), MAGMA (similar a LAPACK para GPU), etc. Todas estas librer´ıas son una ventaja para el programador, ya que de forma transparente al usuario, se utiliza de forma ´optima los recursos de la placa GPU.

Debido a las caracter´ısticas propias de las placas GPU, las aplicaciones deben tener ciertas caracter´ısticas que las har´ıan convenientes para su desarrollo en GPU. Estas caracter´ısticas son: alto nivel de paralelismo, alto requerimiento de c´omputo, gran volumen de datos, que los c´alculos realizados sobre los datos no tengan dependencias entre s´ı, datos que se puedan organizar en vectores o matrices (para satisfacer la configuraci´on f´ısica de losthreads en arreglos de 1, 2 o 3 dimensiones), poca comunicaci´on CPU-GPU, pocas secciones cr´ıticas.

(7)

3

Algoritmos RDA y CSA en GPGPU

Actualmente existen distintos algoritmos para el procesamiennto de se˜nales SAR. Los algorimos m´as difundidos en este ´area sonRange Doppler Algorithm(RDA),

Chirp Scaling Algorithm (CSA), Omega-K Algorithm(ωK), Back Projection

Algorithm, etc.

[image:7.612.183.442.274.479.2]

En este trabajo se toman dos de los algoritmos m´as utlizados para la ob-tenci´on de im´agenes utilizando radares SAR: RDA y CSA. Dichos algoritmos son el paso inicial para continuar con el desarrollo de otros m´etodos y etapas en todo el desarrollo de procesamiento de se˜nales SAR. La figura 4 muestra las principales operaciones realizadas en cada uno de estos algoritmos.

Fig. 4.Principales pasos deRange Doppler Algorithm yChirp Scaling Algorithm.

El algoritmo RDA fue uno de los primeros algoritmos desarrollados para procesamiento SAR de uso civil. Hoy en d´ıa, contin´ua siendo uno de los al-goritmos m´as utlizados, gracias a su favorable compromiso entre simplicidad, eficiencia y precisi´on [3].

Los pasos b´asicos del algoritmo RDA son: compresi´on de rango (implemen-tada a trav´es de FFT, filtros e IFFT), FFT en acimut (para cambio de dominio), RCMC (Range Cell Migration Correction: correcci´on de migraci´on de celdas en rango), compresi´on en acimut y una ´ultima IFFT para llevar los datos al dominio del tiempo.

(8)

Como se puede observar, los algoritmo RDA y CSA se basan en m´ultiples transformadas de Fourier y antitransformadas, multiplicaciones y aplicaci´on de filtros. La complejidad computacional de dichos algoritmos est´a dominada por las transformadas de Fourier; para una matriz de n×m la complejidad com-putacional es denlog(n) +mlog(m).

Considerando la complejidad computacional de los algoritmos y teniendo en cuenta el gran volumen de datos involucrados en el procesamiento de se˜nales SAR, se observa la necesidad de una implementaci´on eficiente, que genere im´a-genes de alta resoluci´on y exactitud a la vez que el tiempo de obtenci´on de dichas im´agenes se encuentre dentro de los l´ımites del tiempo real.

Los algoritmos se desarrollan en forma modular, de modo que permitan el dise˜no, desarrollo, implementaci´on, prueba y puesta a punto de forma inde-pendiente e incremental. Los datos crudos SAR ser´an almacenados en forma vectorial, y estos datos se copiar´an a memoria global del dispositivo (GPU) al comienzo de la aplicaci´on.

Para las operaciones que involucran transformadas de Fourier, se proponen dos alternativas. La primera implica buscar la rutina ´optima dentro de la li-brer´ıa cuFFT y la segunda se considerar´a realizar una implementaci´on propia que permita tener mayor control sobre la descomposici´on a la que se somete a los datos. Las aplicaciones de filtros y multiplicaciones ser´an desarrolladas en para-lelo, haciendo que cada thread realice el c´alculo sobre el dato (o datos) que le correspondan. Para dichos c´alculos, se combinar´a la forma de dividir losthreads

en bloques para que a su vez, se pueda utilizar la memoria compartida y local de cadathread de forma ´optima.

Ambos algoritmos se desarrollar´an teniendo en cuenta los distintos formatos de datos: n´umeros complejos y representaciones de n´umeros en simple y doble precisi´on. Adem´as, las arquitecturas GPU consiguen su m´aximo rendimiento cuanto mayor sea la carga de trabajo que tengan. Esto se considera en los actuales dise˜nos de los algoritmos.

Por otro lado, se sabe que loskernelsque tienen m´ultiples bifurcaciones en su c´odigo no consiguen el rendimiento ´optimo en GPU: esto se debe a la ejecuci´on enwarps que se ha mencionado anteriormente. Este es otro aspecto que se est´a considerando durante el dise˜no y desarrollo del c´odigo.

Una vez realizado el c´omputo sobre los datos, se copia el vector resultante desde la GPU a la memoria de la CPU.

En este trabajo, se proponen algoritmos modulares, donde cada m´odulo tiene una interfaz definida facilitando el intercambio y prueba de los mismos.

Una vez copiados los datos a la GPU, la CPU comandar´a la ejecuci´on de distintoskernels que se ejecutar´an en la GPU y que resolver´an las tareas parale-lizables: cada FFT e IFFT, cada filtrado, multiplicaci´on, se realizan en paralelo, haciendo que cadathread opere sobre un dato que compone la se˜nal.

(9)

1. Alta carga computacional para cada thread (que compense el alto costo de la transferencia de datos CPU-GPU): los algoritmos se basan, fundamental-mente, en FFTs e IFFTs.

2. Poca dependencia de datos (que losthreadss´olo necesiten datos de su memo-ria local o compartida, evitando accesos costosos a memomemo-ria global). En los algoritmos RDA y SCA no hay dependencia de datos.

3. M´ınima transferencia de datos entre CPU y GPU: se realiza s´olo al comienzo la copia de datos crudos SAR a la memoria global y al finalizar el proce-samiento se copia la imagen ya procesada en sentido inverso.

4. Pocas secciones cr´ıticas (escrituras y accesos a las mismas posiciones de memoria): en los algoritmos utilizados cada pixel se calcula sin depender de los dem´as.

5. Necesidad de que los datos se adapten a las estructuras de datos que manejan las GPUs: vectores o matrices. En los algoritmos utilizados el procesamiento se basa en vectores.

4

Trabajo actual, trabajo futuro y conclusiones

En este trabajo se propone la implementaci´on paralela de los algoritmos RDA y CSA para procesamiento de se˜nales SAR espec´ıficamente para placas gr´aficas GPU.

En dichos algoritmos se encuentran presentes las caracter´ısticas que hacen que un algoritmo sea conveniente para implementar en GPU y obtener el m´aximo rendimiento en las placas gr´aficas. La implementaci´on de dichos algoritmos son el primer paso para la implementaci´on de distintas tareas que involucra el proce-samiento de se˜nales SAR.

Actualmente se est´an implementando dichos algoritmos. Se est´a trabajando con datos sint´eticos y se espera trabajar con datos reales provenientes de grupos de trabajo de ´areas similares con las que se est´a en comunicaci´on.

Se cuenta con 2 GPUs instaladas y en funcionamiento. Una es un modelo GeForece GTX 550 Ti, con 192 nucleos (4 multiprocesadores de 48 n´ucleos cada uno). Otra GPU disponible es modelo GeForce GTX 570 que cuenta con 480

cores. Se dispone de CUDA y CUDA Toolkit funcionando en LINUX y en Win-dows. Se dispone tambi´en de la herramientaVisual Profilerque permite obtener datos muy interesantes, como por ejemplo, el rendimiento, requerimientos, etc de cada uno de loskernels que componen la aplicaci´on.

Proximamente se estima finalizar con la implementaci´on de dichos algoritmos. Se evaluar´a su eficiencia y exactitud. Adem´as, las im´agenes obtenidas con dichos algoritmos tambi´en ser´an evaluadas, abriendo esto otra tarea en este campo.

References

(10)

2. NVIDIA CUDA Web site: http://www.nvidia.com/object/cuda_home_new. htmlAccedido en julio de 2012.

3. Ian G. Cumming, Frank H. Wong: Digital Processing of Synthetic Aperture Radar Data. Artech House. ISBN-10: 1-58053-058-3

4. David B. Kirk, Wen-mei W. Hwu: Programming Massively Parallel Processors: a Hands-on Approach. ISBN-10: 0123814723. Febrero de 2010.

5. Jeffrey Krolik: Radar and Sonar Signal Processing: Similarities and Differ-ences. Duke University. Department of Electrical and Computer Engineering. Durham. 2005.

6. Antonio Martinez, Francisco Fraile, Jordi Mallorqu´ı, Leonardo Nogueira, Jordi Gabald´a, Antoni Broquetas, Antonio Gonzalez: PARSAR: Parallelisation of a Chirp Scaling Algorithm SAR Processor. Data Systems in Aerospace - DASIA 97, Proceedings of the meeting held 26-29 May, 1997 in Sevilla, Spain. Edited by T.-D. Guyenne. ESA SP-409. Paris: European Space Agency, 1997, p´aginas 1346 - 1350.

7. NVIDIA Web site:http://la.nvidia.com/page/home.html. Accedido en julio de 2012.

8. NVIDIA CUDA Toolkit 4.2. CUFFT Library. Programming Guide. Marzo 2012.

9. Mar´ıa Fabiana Piccoli: Computaci´on de Alto Desempe˜no en GPU. Universidad Nacional de San Luis, San Luis, Argentina. 2011.

10. Jason Sanders, Edward Kandrot: CUDA by Example: An Introduction to General-Purpose GPU Programming. ISBN-10: 0131387685. Julio de 2010. 11. Mehrdad Soumekh: Synthetic Aperture Radar Signal Processing.

Wiley-Interscience. John Wiley & Sons, Inc. Nueva York. ISBN 978-0-471-29706-2. 12. TerraSAR-X: Im´agenes por sat´elite de radar

TerraSAR-X. Web site: http://www.astrium-geo.com/es/

Figure

Fig. 1. Env´ıo de pulsos y recepci´on de ecos, datos crudos SAR y datos procesados.
Fig. 2. Organizaci´on de threads en bloques y en grids [4].
Fig. 3. Arquitectura GPU. Multiprocesadores y jerarqu´ıa de memorias y accesos. Enla figura, host designa a la CPU y Dispositivo a la GPU [9].
Fig. 4. Principales pasos de Range Doppler Algorithm y Chirp Scaling Algorithm.

Referencias

Documento similar

Aplicación de técnicas de procesamiento de la señal y machine learning para el procesamiento de señales EEG, con el objetivo de diagnosticar de forma objetiva la dislexia.Para

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637:

[r]

SVP, EXECUTIVE CREATIVE DIRECTOR JACK MORTON

Social Media, Email Marketing, Workflows, Smart CTA’s, Video Marketing. Blog, Social Media, SEO, SEM, Mobile Marketing,

diabetes, chronic respiratory disease and cancer) targeted in the Global Action Plan on NCDs as well as other noncommunicable conditions of particular concern in the European

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones

El contar con el financiamiento institucional a través de las cátedras ha significado para los grupos de profesores, el poder centrarse en estudios sobre áreas de interés