OpenCL en el trading - página 5

 

6. Superescalar y VLIW



6. Superescalar y VLIW

El video explora cómo los procesadores usan la ejecución superescalar para detectar y extraer el paralelismo entre las instrucciones binarias para mejorar el rendimiento. Discute la importancia de la lógica de control en la identificación de instancias en las que las instrucciones pueden ejecutarse simultáneamente, como cuando no hay dependencias entre ellas. El video también presenta dos ejemplos de diseño de procesador, superescalar y VLIW, con este último transfiriendo la responsabilidad de detectar dependencias a los compiladores, generando largas palabras de instrucción para ser ejecutadas en paralelo. Si bien VLIW reduce la verificación del tiempo de ejecución, los puntos no utilizados en la palabra de instrucción larga aún pueden causar desperdicio en la unidad de ejecución.

  • 00:00:00 En esta sección, el video explica cómo los procesadores utilizan la ejecución superescalar para mejorar el rendimiento general en programas con instrucciones binarias. Los programadores confían en procesadores bien diseñados para ejecutar sus programas correctamente, por lo que la responsabilidad recae sobre el procesador para identificar y extraer el paralelismo de las instrucciones para aumentar el rendimiento. El video proporciona un ejemplo de un gráfico de dependencia entre instrucciones, y si bien existen dependencias entre ciertas instrucciones, los procesadores pueden ejecutar otras simultáneamente debido a la falta de dependencias entre ellas. El trabajo de la lógica de control dentro del procesador es identificar estas instancias y ejecutar instrucciones de la manera más eficiente posible para maximizar el rendimiento.

  • 00:05:00 En esta sección, el video analiza dos ejemplos de diseños arquitectónicos en procesadores: superescalar y VLIW. El primer ejemplo muestra cómo el procesador puede detectar dependencias entre instrucciones y programarlas en consecuencia para ahorrar tiempo. El video también destaca la posibilidad de ejecución especulativa para instrucciones de bifurcación. El segundo ejemplo analiza el diseño de VLIW, que transfiere la responsabilidad de detectar dependencias a los compiladores. El compilador genera palabras de instrucción largas que comprenden múltiples instrucciones que se pueden ejecutar en paralelo, lo que simplifica el diseño del procesador.

  • 00:10:00 En esta sección, se explica el concepto de palabra de instrucción muy larga (VLIW). Esto permite empaquetar múltiples instrucciones en una palabra de instrucción larga, que se obtiene y decodifica juntas. El VLIW transfiere la responsabilidad a los compiladores para descubrir oportunidades para ejecutar instrucciones al mismo tiempo antes de que se ejecute el programa y reduce la necesidad de verificar el tiempo de ejecución. Sin embargo, si hay espacios vacíos en la palabra de instrucción larga, la unidad de ejecución aún puede experimentar algún desperdicio.
 

EECE.6540 Computación heterogénea (Universidad de Massachusetts Lowell)



7. SIMD y multiproceso de hardware

El video explica dos formas de abordar los desafíos del paralelismo: instrucción única, datos múltiples (SIMD) y subprocesos múltiples de hardware (SMT). SIMD permite que las instrucciones de hardware se ejecuten en paralelo sobre múltiples elementos de datos, lo que simplifica la lógica de programación y decodificación. SMT explota el paralelismo a nivel de subprocesos al ejecutar flujos de instrucciones independientes simultáneamente, lo que exige archivos de registro adicionales y un uso compartido cuidadoso de la memoria caché. El video también analiza la implementación de la programación de subprocesos divididos en el tiempo, donde los subprocesos se turnan para ocupar la ruta de datos del procesador en forma rotativa, lo que reduce la latencia y permite que múltiples subprocesos accedan a unidades informáticas y sistemas de memoria simultáneamente. En última instancia, el procesador puede acomodar tantos subprocesos como sea necesario, aunque la ganancia de rendimiento puede no ser tan significativa en un procesador de un solo subproceso.

  • 00:00:00 En esta sección, se explica el concepto de datos múltiples de instrucción única (SIMD), donde las instrucciones de hardware se pueden usar para la ejecución paralela de operaciones en elementos de datos múltiples. SIMD simplifica la lógica de programación y decodificación, ya que solo se necesita programar una instrucción para aplicar la misma operación a cada elemento de los datos. El uso de SIMD es beneficioso si el problema que se está resolviendo involucra un paralelismo de datos significativo; de lo contrario, puede que no sea una solución eficiente. Además, se explica la similitud de SIMD y el cálculo vectorial, donde las instrucciones vectoriales se pueden usar en datos que se encuentran dispersos en diferentes partes de la memoria para realizar operaciones virtuales.

  • 00:05:00 En esta sección, el video explica cómo se pueden utilizar subprocesos múltiples de hardware o subprocesos múltiples simultáneos (SMT) para explotar el paralelismo a nivel de subprocesos. Al poner varios programas o subprocesos en el mismo procesador, se pueden ejecutar diferentes flujos de instrucciones simultáneamente si son independientes entre sí. Los subprocesos múltiples de hardware pueden ser útiles para máquinas grandes y CPU individuales, ya que permiten la fácil extracción de instrucciones de dos subprocesos independientes. Sin embargo, esto requiere archivos de registro adicionales y una cuidadosa consideración de cómo se comparten los cachés entre los diferentes subprocesos.

  • 00:10:00 En esta sección del video, el presentador analiza cómo mantener ocupada la unidad lógica aritmética (ALU) implementando la programación de subprocesos divididos en el tiempo. Este método permite que los subprocesos se turnen para ocupar la ruta de datos del procesador en forma rotativa, lo que reduce significativamente la latencia al programar más subprocesos. Al ejecutar la siguiente instrucción mientras se espera un subproceso detenido, este método permite que múltiples subprocesos utilicen unidades informáticas y sistemas de memoria simultáneamente. En última instancia, el resultado es que no hay pérdida de tiempo y el procesador puede acomodar tantos subprocesos como sea necesario. Sin embargo, es posible que el rendimiento de un solo subproceso en un procesador de un solo subproceso no mejore tanto como en un procesador de varios subprocesos.
 

8. Arquitectura de procesador multinúcleo



8. Arquitectura de procesador multinúcleo

Este video explica la arquitectura de los procesadores multinúcleo y sus beneficios, como varios núcleos que funcionan de forma independiente y comparten algunos componentes, mientras que cada núcleo tiene su propia canalización y caché de datos. La importancia de la jerarquía de caché para cerrar la brecha de velocidad entre el microprocesador y el acceso a la memoria se destaca utilizando múltiples niveles de caché que explotan la localidad temporal y espacial. El video también aborda el diseño de sistema en chip, que combina diferentes unidades de función e interfaces en un solo chip para reducir el costo y el factor de forma. En general, el video brinda una útil introducción a la complejidad y las compensaciones involucradas en el diseño de procesadores multinúcleo.

  • 00:00:00 En esta sección, aprendemos sobre los procesadores multinúcleo y sus ventajas sobre los procesadores de un solo núcleo. Los procesadores multinúcleo tienen varios núcleos, que funcionan de forma independiente y comparten algunos componentes, como la obtención de instrucciones, la decodificación y los programadores de coma flotante. Sin embargo, cada núcleo tiene su propia tubería y su propio caché de datos de nivel 1. Los procesadores multinúcleo requieren protocolos de coherencia de caché para garantizar que los datos almacenados en cada caché sean consistentes con los datos en la memoria principal. System-on-chip es otra opción de diseño en la que varios elementos se combinan en un solo dispositivo en el mismo chip para reducir el costo y el factor de forma. Tiene muchas unidades e interfaces de funciones dedicadas diferentes conectadas al resto del chip a través de una interconexión fuera de la nave.

  • 00:05:00 En esta sección, el ponente explica el concepto de jerarquía de caché en una arquitectura de procesador multinúcleo. La principal razón para usar caché es cerrar la brecha de velocidad entre el microprocesador y el acceso a la memoria, que se ejecutan a diferentes frecuencias y tienen diferentes capacidades de almacenamiento. Los cachés de nivel 1, nivel 2 y nivel 3 se utilizan para cerrar la brecha y explotan la localidad temporal y espacial de acceder a una pequeña cantidad de instrucciones o datos en un período corto o acceder a ubicaciones cercanas, respectivamente. Los cachés se organizan mediante bloques, que se mueven entre los niveles de memoria, lo que permite que el procesador aproveche la localidad temporal y espacial.
 

9. Arquitectura GPU



9. Arquitectura GPU

La unidad de procesamiento acelerado (APU) es un procesador heterogéneo con núcleos de bajo consumo y unidades GPU, todo en el mismo chip. Las GPU tienen una gran cantidad de núcleos de sombreado que se pueden programar con instrucciones, y sus cachés generalmente no son coherentes, lo que hace que su diseño sea más simple y permite un rendimiento mucho mayor cuando muchos núcleos funcionan al mismo tiempo. AMD y Nvidia utilizan pequeñas unidades de cómputo para respaldar la operación en múltiples piezas de datos al mismo tiempo y tienen archivos de registro grandes para respaldar el cambio rápido de contexto. El orador también explica cómo administrar el flujo de control en la arquitectura GPU, especialmente en el manejo de instrucciones de bifurcación que pueden producir resultados no válidos, pero los programadores no deben preocuparse mucho por estos problemas porque los proveedores de procesadores ya han proporcionado lógica de control en el hardware. En general, las GPU son procesadores populares para cargas de trabajo complejas en el mercado moderno, especialmente en el campo de la IA y el aprendizaje automático.

  • 00:00:00 En esta sección, aprendemos sobre la unidad de procesamiento acelerado (APU), que es un procesador heterogéneo típico que consta de núcleos de bajo consumo que se utilizan para computación, administración y configuración del sistema de uso general, y unidades de GPU, todo en el mismo chip. La APU tiene un núcleo x86 típico con dos niveles de caché, mientras que los núcleos de la GPU son diferentes y no x86, con un almacenamiento de datos locales más bajo que se considera memoria privada. La propiedad de la memoria es visible en un diagrama que muestra las ubicaciones, la accesibilidad y el tamaño de la memoria, con una memoria privada más pequeña que la memoria local y mucho más pequeña que la memoria global. Los procesadores actuales para computadoras portátiles de Intel o AMD suelen tener una pequeña cantidad de núcleos de uso general, memoria integrada y una unidad de procesamiento de gráficos en el chip.

  • 00:05:00 En esta sección, aprendemos sobre la arquitectura GPU y cómo se usa en el campo de la IA y el aprendizaje automático. Las GPU tienen una gran cantidad de procesadores, llamados núcleos de sombreado, que se pueden programar con instrucciones. Pueden acceder a la memoria GPU de alta velocidad que es diferente del subsistema de memoria de un procesador de uso general, y sus cachés generalmente no son coherentes. Las GPU no utilizan el protocolo de coherencia de caché para garantizar la coherencia, lo que simplifica el diseño y permite un rendimiento mucho mayor cuando muchos núcleos funcionan al mismo tiempo. En general, las GPU son un procesador popular para cargas de trabajo complejas en el mercado moderno.

  • 00:10:00 En esta sección, aprendemos cómo AMD y Nvidia utilizan pequeñas unidades informáticas que tienen hardware cmd para admitir la operación en múltiples piezas de datos al mismo tiempo. Ambos proveedores tienen 16 cmds de ancho y pueden agrupar los elementos de trabajo en grupos más grandes y asignarlos a diferentes lotes según el chip y los parámetros de configuración. Además, tienen archivos de registro de gran tamaño para admitir cambios de contexto rápidos, y ambos proveedores tienen una combinación de caché de nivel uno automático y bloc de notas administrado por el usuario, que está fuertemente respaldado en un gran ancho de banda para admitir operaciones rápidas en sus respectivas memorias privadas. Por último, abordamos brevemente el flujo de control y el concepto de ejecutar múltiples datos con una instrucción, y cómo las instrucciones de bifurcación causan alguna desviación en la ejecución de rutas, lo que requiere una forma de minimizar la cantidad de cómputo realizado en datos no válidos.

  • 00:15:00 En esta sección, el orador explica cómo administrar el flujo de control en la arquitectura GPU, especialmente al tratar con instrucciones de bifurcación que pueden producir resultados no válidos. Para manejar este problema, los carriles cmd se pueden enmascarar para descartar algunos cálculos, aunque puede afectar el rendimiento. Otro problema que debemos abordar cuando se utiliza la tecnología de subprocesos múltiples de instrucción única (SIMT) es la divergencia entre los subprocesos de software, que pueden desperdiciar ciclos de cálculo si no se gestionan bien. Afortunadamente, los programadores de OpenCL no necesitan preocuparse mucho por estos problemas porque los proveedores de procesadores ya han proporcionado lógica de control en el hardware.
 

10. Componentes internos de FPGA


10. Componentes internos de FPGA

Este video analiza la arquitectura y las características de los arreglos de puertas programables en campo (FPGA). Los FPGA tienen lógica programable, lo que les permite reprogramarse para adaptarse a nuevas funcionalidades y tener acceso directo a los datos a través de cantidades masivas de entradas y salidas (I/O). La estructura de la tabla de búsqueda en los FPGA consta de múltiples niveles de multiplexores que se pueden programar para definir funciones lógicas. Los FPGA usan registros programables que se pueden usar para contadores, registros de desplazamiento, máquinas de estado y funciones DSP. Cada bloque rectangular del chip representa un bloque de matriz lógica (LAB), y cada LAB contiene diez módulos lógicos adaptables (ALM). Los FPGA se utilizan en industrias tales como dispositivos de consumo, automotriz, instrumentación médica y comunicación y transmisión.

  • 00:00:00 En esta sección, se introducen los conceptos básicos de los FPGA, incluida su lógica programable que se puede reprogramar para adaptarse a nuevas funcionalidades y su acceso directo a los datos a través de cantidades masivas de E/S. Las ventajas de los FPGA son su conveniente conexión con los componentes de memoria y los coprocesadores, las funcionalidades reemplazables sin necesidad de reemplazar el hardware y su ubicuidad en industrias como la de dispositivos de consumo, automotriz, instrumentación médica y comunicación y transmisión. La arquitectura de los FPGA incluye la tabla de búsqueda, que se puede programar para definir funciones lógicas, y otras partes importantes, como registros de carga y módulos lógicos adaptativos, que se analizarán en las secciones siguientes.

  • 00:05:00 En esta sección del video, el presentador explica la estructura de una tabla de búsqueda en FPGA, que consta de múltiples niveles de multiplexores con entradas seleccionables. Las entradas a la tabla de búsqueda se pueden usar para construir una función lógica combinacional arbitraria. Luego, el video analiza los registros programables, que son elementos de almacenamiento en FPGA utilizados para contadores, registros de desplazamiento, máquinas de estado y funciones DSP. Estos registros tienen una señal de reloj típicamente impulsada por un reloj global y pueden retroalimentar la tabla de búsqueda. Además, el video explica cómo los elementos lógicos y los módulos de lógica adaptativa se conectan a través de señales en cadena.
    y llevar bits, y cómo la entrada a los registros puede provenir de elementos lógicos anteriores.

  • 00:10:00 En esta sección, aprendemos cómo organizar los elementos lógicos dentro de un chip FPGA. Cada bloque rectangular del chip representa un bloque de matriz lógica (LAB), y cada LAB contiene diez módulos lógicos adaptables (ALM). Cada ALM consta de unidades aritméticas, interconexión local y conexiones de registro, así como recursos dedicados y una tabla de búsqueda adaptable para una organización flexible de entradas y generación de salidas específicas. Además, tenemos interconexiones de filas y columnas que pueden conectar LAB específicos y escalas de enrutamiento linealmente según la densidad del dispositivo. Finalmente, tenemos bloques de memoria incorporados que admiten diferentes tipos de estructuras de memoria, como RAM de puerto único o doble, memoria de solo lectura o pequeñas porciones de estructuras de memoria llamadas eMLAB.

  • 00:15:00 En esta sección, aprendemos sobre las diferentes funcionalidades de los FPGA, incluidos los bloques de procesamiento de señales digitales (DSP) y los componentes de entrada/salida (IO). Los bloques DSP son útiles para implementar funciones de procesamiento de señales, como transformaciones FFT y operaciones de multiplicación y acumulación de alto rendimiento. Los FPGA también pueden comunicarse con varios componentes de E/S, lo que permite habilitar, controlar y terminar la salida. La lógica del elemento IO incluye pines bidireccionales y control de señal de habilitación de salida, y la ruta de salida genera valores A y B a través de la señal de reloj. Por otro lado, si el control de salida está deshabilitado, las señales de entrada pasan por el registro de entrada.

  • 00:20:00 En esta sección sobre los componentes internos de FPGA, se destaca la importancia de las señales de reloj junto con el uso de pines de reloj de entrada dedicados para admitir operaciones de FPGA. También se analizan los transceptores de alta velocidad, que son útiles para implementar protocolos de señal más complejos en FPGA, sin necesidad de un acondicionamiento y procesamiento de señal complejo. También se explica el uso de PLL para generar diferentes señales de reloj para usar en todo el dispositivo con un sesgo mínimo, junto con el uso de la tecnología de celdas SRAM y tablas de búsqueda para configurar bits programables que controlan la conectividad de las señales de entrada y salida. El video también cubre los métodos utilizados para programar FPGA utilizando W prom externo, Cpl D o una CPU para controlar las secuencias de programación, y el uso de una conexión JTAG de hardware especial para diagnóstico y depuración adicionales.

  • 00:25:00 En esta sección, se analizan el diseño y las características de una matriz de puertas programables en campo (FPGA). La mayor parte del área en un FPGA son los bloques de matriz lógica que se pueden conectar a través de interconexiones de fila y columna. Otros bloques incluyen PR, transceptores y un controlador de memoria que se puede conectar a diferentes componentes de memoria. Un área PJ 10g X FPGA se usa como ejemplo con 1 millón de elementos lógicos, 1,7 millones de registros, 54 000 bloques de memoria con 22 bits cada uno, 1518 bloques DSP, transceptores de 367,4 gigabits por segundo, dos bloques PCIe duros, 492 pines IO generales y 12 controladores de memoria. La ventaja de los FPGA es la alta densidad para crear funciones complejas, la integración de múltiples funciones, el acceso a diferentes estándares y características de IO y el acceso directo a los datos en un solo chip.
FPGA Internals
FPGA Internals
  • 2020.04.18
  • www.youtube.com
The internal architecture of FPGA
 

11. Memoria OpenCL en un sistema GPU



11. Memoria OpenCL en un sistema GPU

El instructor explica la asignación de la memoria OpenCL a la GPU AMD y los diferentes niveles de memoria en un sistema de GPU. El dispositivo de cómputo tiene un procesador de comandos que administra las directivas de las unidades de cómputo, que funcionan como núcleos con múltiples carriles SIMD, archivos de registro privados y memoria privada. El programa kernel está diseñado para proporcionar trabajos autónomos que permitan utilizar todos los núcleos disponibles y disminuir la latencia de acceso a la memoria. El orador también menciona el concepto de intensidad aritmética, que se refiere a la relación entre el cálculo y el movimiento del eje de la memoria, y cómo debe ser alta para evitar que el ancho de banda de la memoria de la GPU sea el factor limitante.

  • 00:00:00 En esta sección, el orador analiza OpenCL en relación con la arquitectura de hardware de diferentes procesadores, centrándose específicamente en la GPU AMD. El diagrama muestra la memoria global, la memoria constante y la memoria local, con el núcleo de la izquierda que representa el núcleo de OpenCL utilizado al diseñar un programa paralelo de datos. Cada grupo de trabajo realiza un subconjunto del cálculo basado en los datos, siendo la memoria local local para el grupo de trabajo y compartida con las unidades de ejecución dentro del procesador. Los elementos de trabajo dentro del grupo de trabajo son el cálculo real realizado, y cada uno tiene su propio conjunto de datos.

  • 00:05:00 En esta sección, el instructor explica cómo se asigna la memoria OpenCL a la GPU AMD y los diferentes niveles de memoria en un sistema GPU. El dispositivo de cómputo tiene un procesador de comandos que programa instrucciones para las unidades de cómputo, que tienen caché de nivel 1 y comparten algo de caché de nivel 2, y están conectadas a la memoria global. La unidad de computación funciona como un núcleo, con múltiples carriles SIMD y archivos de registro privados, llamados GPR, que constituyen la memoria privada. Se espera que el programa kernel proporcione piezas de trabajo independientes, que deben ser tantas como sea posible para que todos los núcleos disponibles estén ocupados, y estas piezas deben permitir el cambio de contexto de hardware para minimizar la latencia de acceso a la memoria. El kernel también debe tener una alta intensidad aritmética para hacer un uso eficiente del hardware.

  • 00:10:00 En esta sección, el orador analiza el concepto de intensidad romántica, que es esencialmente la relación entre el cálculo y el movimiento del eje de la memoria. El objetivo es tener operaciones matemáticas para acceder a la memoria lo más alto posible para evitar estar limitado por el ancho de banda de la memoria.
OpenCL Memory on a GPU System
OpenCL Memory on a GPU System
  • 2020.05.23
  • www.youtube.com
This lecture introduces how OpenCL memory model is mapped to a GPU based system.
 

12. Ejemplo de OpenCL: multiplicación de matrices



12. Ejemplo de OpenCL: multiplicación de matrices

Este video presenta la multiplicación de matrices como un ejemplo de programación OpenCL. El orador demuestra cómo se escribe el código C para crear bucles independientes que pueden atravesar las filas y columnas de la matriz. Se analizan los elementos de trabajo y cómo se pueden asignar a elementos de matriz en OpenCL. Se explica una implementación del núcleo, cubriendo los argumentos de la función del núcleo, cómo se llama y su cuerpo. El orador muestra cómo se almacena la matriz de entrada en una matriz de una sola dimensión utilizando números de fila e índice para calcular los índices. En última instancia, la función kernel calcula el producto escalar para producir el elemento en la matriz de salida. Se enfatiza el enfoque lineal para almacenar matrices en la memoria física.

  • 00:00:00 En esta sección, aprendemos sobre la multiplicación de matrices como un ejemplo de programación OpenCL. La multiplicación de matrices es un ejemplo clásico de computación de potencia que se ha utilizado en muchas aplicaciones diferentes. La implementación requiere bucles anidados, con el requisito de que el número de columnas de la matriz A debe ser igual al número de filas de la matriz B. Esto se debe a que cada elemento resultante en la matriz C es el producto escalar de un vector fila de A con un vector columna de B. Vemos cómo se escribe el código C para implementar la operación y cómo los bucles funcionan de forma independiente, permitiéndonos recorrer cada fila o columna de la matriz C resultante de forma aleatoria.

  • 00:05:00 En esta sección, se introduce el concepto de elementos de trabajo y se explica cómo se pueden asignar elementos de trabajo a elementos de matriz en OpenCL. Los elementos de trabajo se pueden crear para que cada elemento de salida de una matriz se calcule de forma independiente y, por lo tanto, se pueden asignar a elementos de trabajo de rango bidimensional. También se analiza la implementación del núcleo para la multiplicación de matrices en OpenCL, donde se explican los argumentos para la función del núcleo y cómo llamarla desde la función principal, y se presenta el cuerpo de la función del núcleo. La función kernel calcula el producto punto de un vector de fila y un vector de columna para calcular cada elemento de la matriz de salida.

  • 00:10:00 En esta sección, el disertante explica el proceso de multiplicación de matrices utilizando el lenguaje de programación OpenCL. La idea principal es almacenar la matriz de entrada bidimensional en una matriz de una sola dimensión usando el número de fila y el número de índice para calcular el índice correcto para encontrar el elemento correcto para realizar la operación de producto escalar. La función kernel inicializa la variable de suma con 0 e itera a través del vector de fila de A y el vector de columna de B para calcular el producto escalar, y finalmente asigna el resultado al elemento correspondiente en C. Estos pasos ilustran cómo usar los números de fila y columna para calcular índices de forma lineal, lo cual es esencial para almacenar la matriz en la memoria física.
OpenCL Example: Matrix Multiplication
OpenCL Example: Matrix Multiplication
  • 2020.06.05
  • www.youtube.com
This video explains how to do matrix multiplication in OpenCL. Note the thinking process to break a large problem into smaller partitions, and compute the sm...
 

13. Estructura de un programa OpenCL (parte 1)



13. Estructura de un programa OpenCL (parte 1)

En el video "Estructura de un programa OpenCL (parte 1)", se explica el proceso de construcción de una aplicación OpenCL. El programa primero debe consultar la plataforma OpenCL para comprender sus recursos y crear un contexto OpenCL y una cola de comandos. A continuación, se crean búferes para el intercambio de datos entre el host y la memoria del dispositivo, y el programa del núcleo se compila en un binario para su ejecución en el dispositivo. El video continúa explicando cómo crear búferes de solo lectura y solo escritura, asignar espacio para matrices de salida y copiar los resultados al host. Se enfatiza la importancia de verificar las llamadas API para una ejecución exitosa.

  • 00:00:00 En esta sección, el ponente explica los pasos para construir una aplicación OpenCL. Primero, el programa necesita consultar la plataforma OpenCL para comprender los recursos disponibles en la plataforma y luego crear un contexto OpenCL y una cola de comandos, que es esencial para las operaciones de búfer y los lanzamientos del kernel. Luego se crean búferes para intercambiar datos entre el host y la memoria del dispositivo. Después de esto, el programa del núcleo debe compilarse en un binario que pueda ejecutarse en el dispositivo acelerador, ya sea en una FPGA o en una GPU. El proceso de compilación difiere según el dispositivo.

  • 00:05:00 En esta sección, el video explica cómo configurar el entorno para crear la plataforma y el dispositivo, crear un contexto y crear colas de comandos para la programación de OpenCL. Esto implica obtener la identificación de la plataforma, lo que le permite al programador determinar la cantidad de plataformas disponibles y asignar espacio para el almacenamiento. El video continúa explicando cómo elegir los dispositivos dentro de la plataforma, obtener información sobre el dispositivo elegido, establecer los argumentos adecuados y pasar los valores de estos argumentos a la función del kernel para instanciar el kernel. Finalmente, muestran cómo copiar los resultados del dispositivo a la memoria del host una vez que se completa el kernel.

  • 00:10:00 En esta sección, el video explica cómo crear un contexto de OpenCL y la importancia del objeto de contexto para unir todos los recursos necesarios para las operaciones de OpenCL, como las colas de comandos y los búferes. La transcripción describe cómo crear búferes de solo lectura y solo escritura, y cómo copiar datos entre el host y el dispositivo usando los comandos CL ink y CL in Q write buffer. El ejemplo utilizado es la multiplicación de matrices, donde las matrices A y B son de entrada y la matriz C es una salida. El video enfatiza la importancia de verificar las llamadas API exitosas.

  • 00:15:00 En esta sección, el orador explica cómo asignar espacio para Matrix C, que es la matriz de salida. Dicen que el búfer C se declara como memoria CL, lo que permite que el dispositivo escriba los resultados en él. Sin embargo, esto no impide leer este búfer desde el lado del host, lo cual es necesario para recuperar los resultados del dispositivo y copiar la matriz resultante en algún lugar del host. El orador muestra la definición completa de la API del búfer, que toma cinco argumentos: contexto, indicadores, tamaño, puntero de host y valor devuelto.
Structure of an OpenCL Program (part1)
Structure of an OpenCL Program (part1)
  • 2020.06.05
  • www.youtube.com
This video describes the basic structure of an OpenCL program. (this is part1, a second part follows)
 

14. Estructura de un programa OpenCL (parte 2)



14. Estructura de un programa OpenCL (parte 2)

El tercer paso en la programación de OpenCL involucra la compilación del núcleo, que es diferente para los dispositivos FPGA ya que se realiza fuera de línea. El programa de creación CL con fuente y C TX se usa para crear un programa, seguido del programa de creación CL para compilar el programa en binario. La función del kernel correcta se selecciona mediante el punto de entrada adecuado y los argumentos del kernel deben inicializarse mediante CL set kernel argument con el puntero correcto. El orador entra en detalles sobre la configuración adecuada de los argumentos en la multiplicación de matrices. Luego, analizan la configuración de tamaños de grupos de trabajo locales y globales, la ejecución del kernel y la obtención de resultados mediante la API CL in queue buffer. Finalmente, el orador menciona brevemente los eventos en la programación de OpenCL.

  • 00:00:00 En esta sección, se analiza el tercer paso en un programa OpenCL, que involucra la compilación del kernel. Este proceso es un poco diferente para los dispositivos FPGA, ya que la compilación se realiza fuera de línea. Suponiendo que el código fuente del programa se almacena en un búfer de caracteres, el programa de creación de CL con fuente y TX de C se usa para crear un programa, y el programa de compilación de CL se usa para compilar el programa en binario. A continuación, se selecciona la función de kernel correcta del código fuente mediante la creación de un kernel utilizando el punto de entrada apropiado para la función de kernel específica elegida. Una vez que se crea el kernel, los argumentos del kernel deben inicializarse correctamente utilizando el argumento CL set kernel, con un puntero apuntando al valor real. Por ejemplo, en la multiplicación de matrices, se deben configurar correctamente siete argumentos, incluido el búfer de destino, el tamaño de las matrices y las dos matrices de entrada.

  • 00:05:00 En esta sección, el orador habla sobre la inicialización de varios argumentos del núcleo y destaca la importancia de configurar correctamente los índices de estos argumentos para evitar errores. Luego explican cómo establecer tamaños de grupos de trabajo locales y globales, especificando la cantidad de elementos de trabajo en un grupo y la cantidad de grupos de trabajo. Finalmente, describen los pasos para ejecutar el kernel, incluida la llamada a la API de OpenCL y la obtención de los resultados desde el dispositivo a la memoria del host mediante la API de búfer de cola de CL. El orador también menciona brevemente los eventos y cómo se pueden usar en la programación de OpenCL, pero esto se discutirá más adelante en conferencias posteriores.
Structure of an OpenCL Program (part2)
Structure of an OpenCL Program (part2)
  • 2020.06.05
  • www.youtube.com
This video describe the basic structure of an OpenCL program. (continued from part 1)
 

15. Demostración de multiplicación de matriz OpenCL



15. Demostración de multiplicación de matriz OpenCL

El video "Demostración de multiplicación de matrices de OpenCL" explica el proceso de ejecución de un ejemplo de multiplicación de matrices utilizando el marco OpenCL. Incluye varios archivos de código fuente, como un programa C principal para el lado del host, un programa del núcleo y un archivo MAKE. El video cubre diferentes aspectos del marco OpenCL, la obtención de ID de plataforma y dispositivo, la creación de un contexto OpenCL, el programa y los objetos del núcleo, la administración del búfer para el host y la creación e inicialización de búfer en el dispositivo. El presentador también muestra un kernel de muestra que realiza operaciones de producto de puntos y una demostración del resultado final en un motor de cómputo AMD Radeon pro 575.

  • 00:00:00 En esta sección, el orador explica cómo ejecutar un ejemplo de multiplicación de matrices a través de OpenCL. El ejemplo consta de varios archivos de código fuente, incluido un programa C principal como programa del lado del host, un programa de kernel llamado my kernel CL y un archivo MAKE para ayudar a compilar el proyecto. El programa principal incluye bibliotecas estándar, definiciones de macros para el marco OpenCL y declaraciones para matrices de entrada (matriz A y matriz B), así como nombre de dispositivo, identificadores de plataforma y números de dispositivos. El orador también describe varios aspectos del marco OpenCL, como el contexto, el programa, el núcleo y la lectura y compilación del código fuente. Además, el orador explica la importancia de las identificaciones de plataforma y dispositivo, así como las dimensiones de la matriz en el código.

  • 00:05:00 En esta sección, el orador analiza el proceso de obtención de los ID de plataforma y dispositivo y la creación del contexto OpenCL para la demostración de multiplicación de matrices. Explican cómo se devuelve el recuento de la plataforma y cómo se asigna la matriz para almacenar los ID de la plataforma. También muestran cómo obtener los ID de dispositivo para un tipo específico elegido y consultar su nombre. El video demuestra cómo crear una cola de comandos para cada dispositivo y cómo compilar el programa OpenCL. Explican además cómo usar la aplicación abierta para abrir el archivo de código fuente del kernel y compilar el programa.

  • 00:10:00 En esta sección, el video explica cómo crear un objeto de programa a partir del código fuente del kernel de OpenCL. Este proceso es diferente en diferentes plataformas. En Mac OS con soporte nativo de OpenCL, se puede crear un objeto de programa usando el código fuente. Sin embargo, en Altera FPGA OpenCL SDK, la creación de un objeto de programa implica compilar el kernel y crearlo a partir del resultado binario de esa compilación utilizando la API específica de Altera. Una vez que se crea el objeto del programa, el video muestra cómo construir el programa kernel y crear el objeto kernel. Finalmente, el video pasa a la gestión del búfer en el lado del host, donde se asigna un búfer para almacenar la matriz C resultante.

  • 00:15:00 En esta sección, el presentador explica cómo crear e inicializar búferes en el lado del dispositivo para la multiplicación de matrices usando OpenCL. Continúan mostrando cómo configurar correctamente los argumentos del núcleo, incluida la configuración de tamaños de grupos de trabajo globales y locales. También se destaca la importancia de comprobar el valor de retorno de la CL. Luego, el presentador demuestra cómo leer los resultados en la memoria del host, y luego libera los recursos asignados en el host y OpenCL. Finalmente, muestran un kernel de muestra, que usa obtener ID global para iterar a través del ancho de una matriz, realizar operaciones de productos escalares y almacenar los resultados en el elemento correspondiente en la matriz C.

  • 00:20:00 En esta sección, el orador analiza la creación del programa C principal y el programa CL de Mike Rinder. Para compilar el programa del lado del host, los usuarios deben compilar un solo archivo de programa en C y, para el núcleo, se puede usar el compilador de GPU para compilar el CL de Micra en un binario de GPU. Después de compilar el programa tanto en el lado del host como del dispositivo, los usuarios tienen un ejecutable llamado "principal", junto con diferentes archivos binarios disponibles para diferentes versiones de GPU. Al ejecutar este archivo, el orador muestra una plataforma OpenCL con un motor de cómputo AMD Radeon pro 575 que tiene un valor inicial de la matriz C con todos los elementos que contienen ocho puntos.
OpenCL Matrix Multiplication Demo
OpenCL Matrix Multiplication Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Matrix Multiplication.
Razón de la queja: