Optimizando Aplicaciones de Prueba Automatizadas para Procesadores de Múltiples Núcleos

Visión General

LabVIEW proporciona un ambiente de programación gráfica única y fácil de utilizar para aplicaciones de prueba automatizadas. Sin embargo, es la habilidad para asignar códigos a varios núcleos CPU de manera dinámica lo que mejora las velocidades de ejecución en los procesadores de múltiples núcleos. Aprenda cómo es que las aplicaciones LabVIEW pueden optimizarse para tomar ventada de las técnicas de programación en paralelo.

Contenido

 

El Reto de la Programación Multi-Hilo

Hasta ahora, las nuevas innovaciones en la tecnología de procesadores ha resultado en computadoras con unidades de procesamiento central (CPUs) con un reloj que opera a una taza mayor. Sin embargo, a medida que las tasas de reloj se acercan a los límites físicos teóricos, los nuevos procesadores están siendo desarrollados con múltiples núcleos de procesamiento, en vez de solo uno. Con los nuevos procesadores de múltiples núcleos, las aplicaciones de prueba automatizadas logran un mejor desempeño y un mayor procesamiento al utilizar técnicas de procesamiento en paralelo. El Dr. Edward Lee, professor distinguido en Ingeniería Eléctrica y Computación en la Universidad de California – Berkeley describe los beneficios del procesamiento en paralelo de la siguiente manera:

 

“Muchos tecnólogos predicen que el fin de la Ley de Moore será respondida con un incremento en las arquitecturas de computación en paralelo. Si esperamos continuar en la ganancia de desempeño computacional, los programas deben ser capaces de explotar el paralelismo.”

 

Más aún, es ampliamente reconocido que para las aplicaciones de programación resulta un reto significativo tomar ventaja de los procesadores múltiples. Bill Gates, fundador de Microsoft, Inc. explica este reto con las siguientes palabras:

 

“Para explotar completamente la potencia de los procesadores que trabajan en paralelo, ….el software debe enfrentar el problema de concurrencia. Pero como cualquier desarrollador que haya escrito un código de hilado múltiple, le dirá, esta es una de las tareas más difíciles en programación.”

 

Afortunadamente, LabVIEW ofrece un ambiente de programación ideal para procesadores de múltiples núcleos poniendo a su disposición un ambiente intuitivo para crear algoritmos en paralelo; así como la facilidad para asignar de forma dinámica múltiples ligas a una sola aplicación. De hecho, las aplicaciones de prueba automatizada que utilizan procesadores de múltiples núcleos pueden optimizarse con facilidad para lograr un mejor desempeño. Más aún, los instrumentos modulares PXI Express aumentan el beneficio debido a sus altas tasas de transferencia, posible gracias al PCI Express bus. Dos aplicaciones en específico que se ven beneficiadas de los procesadores de múltiples núcleos e instrumentos PXI Express son: análisis de señales de múltiples canales y procesamiento en línea (hardware en la iteración). En el siguiente documento fuente, evaluaremos varias técnicas de programación en paralelo y caracterizaremos los beneficios de desempeño que cada técnica produce.

 

Implementando Algoritmos de Prueba en Paralelo

Una aplicación de prueba automatizada (ATE) común beneficiada por el procesamiento en paralelo es el análisis de señales de múltiples canales. Debido a que el análisis de frecuencia es una operación intensa para el procesador, la velocidad de ejecución puede mejorarse al poner en paralelo el código de prueba de tal manera que el procesamiento de señales de cada canal pueda distribuirse a múltiples núcleos del procesador. Desde la perspectiva de un programador, el único cambio requerido para obtener este beneficio es sencillamente reestructurar el algoritmo de prueba.

 

Para ilustrar esto, compararemos los tiempos de ejecución de dos algoritmos para análisis de frecuencia de múltiples canales (Transformada de Fourier, o FFT) en dos canales de un digitalizador de alta velocidad. En nuestra prueba, dos canales del PXIe-5122 de 14-bit y digitalizador de alta velocidad se utilizan para adquirir señales a una máxima tasa de muestreo (100 MS/s). Primero, mostramos el modelo de programación secuencial tradicional para esta operación en LabVIEW.

 

Figura 1. Código LabVIEW utilizando ejecución secuencial.

 

En el diagrama de bloques superior, el análisis de frecuencia de ambos canales se desempeña en un VI Express FFT el cual analiza cada canal en serie. Mientras que el algoritmo mostrado arriba puede aún ejecutarse con eficiencia en los procesadores de múltiples núcleos, es posible mejorar el desempeño del algoritmo al procesar cada canal en paralelo.

 

Si fuéramos a diseñar el perfil del algoritmo anterior, notaríamos que le toma más tiempo al FFT completar que la adquisición del digitalizador de alta velocidad. Al sortear cada canal de uno en uno y desempeñar dos FFTs en paralelo, somos capaces de reducir significativamente el tiempo de procesamiento. A continuación se muestra un nuevo diagrama de bloques utilizando un acercamiento en paralelo:

 

Figura 2. Código LabVIEW utilizando ejecución en paralelo.

 

Tal como el código anterior ilustra, cada canal será llamado en secuencia por el digitalizador. Note que estas operaciones pueden terminarse completamente en paralelo si ambos productos fueran de instrumentos únicos. Sin embargo, debido a que el procesado de una Trasformada de Fourier es intensivo, aún somos capaces de mejorar el desempeño simplemente colocando en paralelo el procesamiento de señales. Como resultado, el tiempo total de ejecución es reducido. El tiempo de ejecución de ambas implementaciones se muestra a continuación.

Figura 3. Tiempo de ejecución de algoritmos secuenciales vs. algoritmos paralelos (tiempo).

 

Tal como muestra la figura anterior, a medida que aumenta el tamaño del bloque (muestras por producto), el tiempo de procesamiento ahorrado a través de ejecuciones en paralelo se torna más obvio. De hecho, el algoritmo paralelo se aproxima a una mejora en desempeño de 2x para bloques de mayor tamaño. La gráfica siguiente ilustra el incremento exacto del desempeño (en porcentaje) como función del tamaño de adquisición (en muestras).

 

Figura 4. Aumento de desempeño de algoritmos en paralelo (porcentaje).

 

La figura 4 ilustra que para los bloques mayores de 1 millón de muestras (resolución del ancho de banda de 100 Hz), el acercamiento en paralelo resulta en un incremento en desempeño de 80% o simplemente un mejor desempeño.

 

Una mejora al desempeño de aplicaciones de prueba automatizadas en fácil de lograr en procesadores de múltiples núcleos debido a que LabVIEW aloja cada hilo de manera dinámica. De hecho, no se requiere que los usuarios creen códigos especiales para permitir el hilado múltiple. En cambio, las aplicaciones de prueba en paralelo pueden beneficiarse de los procesadores de múltiples núcleos con mínimos ajustes en la programación.

 

Configurando Algoritmos de Prueba en Paralelo

El beneficio de que los algoritmos de procesamiento de señales se encuentren en paralelo es que permite a LabVIEW dividir el uso del CPU entre múltiples núcleos. En la siguiente figura, ilustramos el orden en el cual el CPU procesa cada parte del algoritmo.

Figura 5. Proceso de ejecución por el CPU.

 

Como ilustra la gráfica, LabVIEW es capaz de procesar muchos de los datos adquiridos en paralelo, el cual guarda el tiempo de ejecución. Un requerimiento para el procesamiento en paralelo es que LabVIEW haga una copia (o clon) de cada subrutina del procesamiento de señales. En general, muchos de los algoritmos para procesamiento de señales de LabVIEW están configurados para tener una “ejecución reentrante.” Esto significa que LabVIEW de manera dinámica, alojará un momento único de cada subrutina – incluyendo hilos separados y espacio de memoria. Como resultado, las subrutinas configuradas deben reajustarse para operar de una manera reentrante. Esto puede realizarse con un simple paso de configuración en LabVIEW. Para ajustar esta propiedad, seleccione File >> VI Properties y elija la categoría “Execution”. Posteriormente, seleccione la bandera “reentrant execution” como se muestra a continuación.

 

Figura 6. Configurando la ejecución reentrante en LabVIEW.

 

Con el simple paso mostrado arriba, las subrutinas de configuración múltiple pueden ejecutarse en paralelo, igual que las funciones de análisis LabVIEW estándar. Como resultado, las aplicaciones de prueba automatizadas pueden lograr una mejora en el desempeño de procesadores de múltiples núcleos a través de técnicas de programación sencillas.

 

Optimizando Aplicaciones de Hardware en la Iteración

Una segunda aplicación que se ve beneficiada de las técnicas de procesamiento de señales en paralelo es el uso de múltiples instrumentos para entradas y salidas simultáneas. En general, éstas se refieren al hardware en el ciclo (HIL) o aplicaciones de procesamiento en línea. En este escenario, ya sea un digitalizador de alta velocidad o un módulo de E/S digital de alta velocidad es utilizado para adquirir señales. En software, se desempeña un algoritmo de procesamiento de señales digital. Finalmente, el resultado es generado por otro instrumento modular. Un diagrama de bloques típico se ilustra a continuación.

Figura 7.  Este diagrama muestra los pasos en una aplicación típica de hardware en el ciclo (HIL).

 

Aplicaciones HIL comunes incluyen: procesamiento de señales digitales en línea (filtración, interpolación, etc.), simulación de sensores, y emulación de componentes comunes. En este documento en particular, exploraremos técnicas para obtener el mejor procesamiento para las aplicaciones de procesamiento de señales digitales en línea.

 

En general, dos estructuras básicas de programación pueden utilizarse: la estructura de iteración sencilla, y la estructura de iteración múltiple entubada con línea de espera. La estructura de iteración sencilla es fácil de implementar y tendrá baja latencia para bloques de tamaño pequeño. En contraste, las arquitecturas de iteración múltiple son capaces de soportar un mayor procesamiento debido a que pueden utilizar de mejor manera los CPUs de múltiples núcleos.

 

Utilizando el acercamiento de iteración sencilla tradicional, la función de lectura del digitalizador de alta velocidad, algoritmo de procesamiento de señales, y E/S digital de alta velocidad son colocados en orden secuencial. Tal como ilustra el diagrama de bloques siguiente, cada una de estas subrutinas deben ejecutarse en serie, tal como se determinó en el modelo de programación de flujo de datos LabVIEW.

Figura 8. Con el enfoquede iteración sencilla de LabVIEW, cada subrutina se ejecuta en serie.

 

La estructura de iteración sencilla está sujeta a varias limitaciones. Debido a que cada etapa se desempeña en serie, el procesador está limitado a desempeñar E/S de instrumentos mientras se procesan los datos. Con este acercamiento, un CPU de múltiples núcleos puede no estar siendo utilizado con eficiencia debido a que el procesador solo puede ejecutar una función a la vez. Por tanto, solo un núcleo del CPU de múltiples núcleos se utilizará para la aplicación. Mientras que la estructura de iteración sencilla es suficiente para tasas de adquisición menores, se requiere de un acercamiento de iteración múltiple para alto procesamiento de datos.

 

La arquitectura de iteración múltiple utiliza estructuras de espera para pasar datos entre cada iteración. A continuación, ilustramos el concepto de programación de flujo de datos entre iteraciones con una estructura de espera.

Figura 9. Con estructuras de filas, múltiples ciclos pueden compartir datos.

 

Tal como demuestra la figura 9, la espera permite a los datos compartirse entre múltiples iteraciones. La figura anterior representa lo que típicamente se refiere como una estructura de productor-consumidor. En este caso, un digitalizador de alta velocidad adquiere datos en una iteración y pasa el nuevo conjunto de datos al FIFO en cada iteración. La iteración del consumidor simplemente realiza un monitoreo del estatus de la espera y escribe cada conjunto de datos en el disco cuando está disponible. El valor que representa utilizar esperas es que ambas iteraciones pueden ejecutarse independientemente una de la otra. En el ejemplo anterior, el digitalizador de alta velocidad puede continuar adquiriendo datos aunque haya un retraso en la escritura del disco. Las muestras adicionales simplemente se almacenan en el FIFO por el momento. Generalmente, el acercamiento en tubería del productor-consumidor permite un uso más eficiente del procesador. Esta ventaja es aún más aparente el los procesadores de múltiples núcleos debido a que LabVIEW puede asignar dinámicamente los hilos del CPU a cada núcleo.

 

Para una aplicación de procesamiento en línea, podemos utilizar tres iteraciones independientes y dos estructuras de espera para pasar datos entre sí. En este escenario, una iteración adquirirá datos a partir de un instrumento, uno desempeñará solo procesamiento de señales, y el tercero escribirá datos a un segundo instrumento. A continuación se presenta un diagrama de bloques LabVIEW mostrando este enfoque:

Figura 10. Este diagrama de bloques ilustra el procesamiento de señales en tubería con iteraciones múltiples y estructuras de espera.

 

En la figura anterior, la iteración superior es una iteración de productor la cual adquiere datos a partir de un digitalizador de alta velocidad y lo pasa a la primera estructura de espera (FIFO). La iteración en el centro opera tanto como productor como consumidor. Cada iteración, descarga (consume) varios conjuntos de datos de la estructura de espera y los procesa de manera independiente en forma de tubería. Este acercamiento tipo tubería mejora el desempeño del procesamiento en procesadores de múltiples núcleos al permitir un procesamiento independiente de hasta cuatro conjuntos de datos. Note que la iteración del centro también opera como productor, al pasar los datos procesador a la segunda estructura de espera. Finalmente, la iteración inferior escribe los datos procesados a un modulo de E/S digital de alta velocidad.

 

Los algoritmos de procesamiento en paralelo mejoran el uso del procesador en CPUs de múltiples núcleos. De hecho, el procesamiento total depende de dos factores: el uso del procesador y las velocidades de transferencia del bus. En general, el CPU y el bus de datos operan con mayor eficiencia al procesar grandes bloques de datos. Además, podemos reducer el tiempo de transferencia de datos aún más al utilizar instrumentos PXI Express, los cuales tienen una transferencia más rápida. Como resultado, ilustramos el máximo procesamiento en términos de la razón de muestreo de acuerdo al tamaño de adquisición de las muestras. Esto se muestra a continuación:

 

Figura 11. El rendimiento de estructura multiciclo es mucho más rápido que estructura de un solo ciclo.

 

Todas las referencias computacionales ilustradas en esta gráfica fueron desempeñadas en muestras de 16-bit. Además, el algoritmo de procesamiento de señales utilizado fue un filtro de bajo flujo de 7° orden con un corte con tasa de muestreo de0.45 x. Como los datos ilustran, el acercamiento de la tubería (iteración múltiple) de cuarto estado permite el mayor procesamiento de datos. Note que el acercamiento de procesamiento de datos del segundo estado arroja un mejor desempeño que el método de iteración sencilla (secuencial), pero no utiliza el CPU tan eficientemente como el método del cuarto estado. Las tasas de muestreo listadas arriba son las máximas tasas de muestreo tanto de las entradas como de las salidas para el digitalizador de alta velocidad PXIe-5122 y el módulo de E/S digital de alta velocidad PXIe-6537. Note que a 20 MS/s, el bus de aplicación está transfiriendo datos a una tasa de 40 MB/s para entradas y de 40 MB/s para salidas para un ancho de banda del bus de 80 MB/s. 

 

También es importante considerar que el acercamiento del procesamiento de la tubería introduce latencia entre la entrada y salida. La latencia depende de varios factores, incluyendo el tamaño del bloque y tasa de muestreo. Las tablas que se presentan a continuación comparan la latencia medida de acuerdo al tamaño del bloque y tasa de muestreo máxima para iteraciones sencillas y arquitecturas de iteración múltiple de cuarto estado.   

Tablas 1 y 2. Estas tablas ilustran la latencia de iteraciones sencillas y entubado de 4 etapas.

 

Como uno esperaría, la latencia aumenta a medida que el CPU se acerca al 100% del uso. Esto es particularmente evidente en el ejemplo de entubado de cuatro etapas con una tasa de muestreo de 20 MS/s. En cambio, el uso del CPU alcanza poco más del 50% de su uso en los ejemplos de iteraciones sencillas.

 

Conclusión

La instrumentación basada en PCs como los instrumentos modulares PXI y PXI Express se benefician enormemente de los avances tecnológicos de los procesadores de múltiples núcleos y mejoras de velocidad en los buses de datos. A medida que los CPUs mejoran el desempeño al agregar procesamiento de múltiples núcleos, las estructuras de procesamiento en pipa o paralelo son necesarias para maximizar la eficiencia del CPU. Afortunadamente, LabVIEW proporciona una excelente solución a este reto de programación al asignar dinámicamente tareas de procesamiento a núcleos de procesamiento individuales. Como ilustran los datos anteriores, pueden lograrse mejoras significativas al desempeño al estructurar algoritmos LabVIEW logrando tomar ventaja del procesamiento paralelo.

     Vea el Seminario Web: Incremento en el Desempeño Multinúcleo con LabVIEW 8.5