OpenCL na negociação - página 5

 

6. Superescalar e VLIW



6. Superescalar e VLIW

O vídeo explora como os processadores usam a execução superescalar para detectar e extrair o paralelismo entre as instruções binárias para melhorar o desempenho. Ele discute a importância da lógica de controle na identificação de instâncias em que as instruções podem ser executadas simultaneamente, como na ausência de dependências entre elas. O vídeo também apresenta dois exemplos de design de processador, superescalar e VLIW, com o último transferindo a responsabilidade de detectar dependências para os compiladores, gerando longas palavras de instrução a serem executadas em paralelo. Embora o VLIW reduza a verificação do tempo de execução, os pontos não utilizados na longa palavra de instrução ainda podem causar desperdício na unidade de execução.

  • 00:00:00 Nesta seção, o vídeo explica como os processadores utilizam a execução superescalar para melhorar o desempenho geral em programas com instruções binárias. Os programadores contam com processadores bem projetados para executar seus programas corretamente e, portanto, recai sobre o processador a responsabilidade de identificar e extrair o paralelismo das instruções para aumentar o desempenho. O vídeo mostra um exemplo de gráfico de dependência entre as instruções e, embora existam dependências entre certas instruções, os processadores podem executar outras simultaneamente devido à falta de dependências entre elas. É tarefa da lógica de controle dentro do processador identificar essas instâncias e executar as instruções da maneira mais eficiente possível para maximizar o desempenho.

  • 00:05:00 Nesta seção, o vídeo discute dois exemplos de projetos arquitetônicos em processadores - superescalar e VLIW. O primeiro exemplo mostra como o processador pode detectar dependências entre as instruções e programá-las de acordo para economizar tempo. O vídeo também destaca a possibilidade de execução especulativa para instruções de desvio. O segundo exemplo discute o projeto VLIW, que transfere a responsabilidade de detectar dependências para os compiladores. O compilador gera longas palavras de instrução compreendendo várias instruções que podem ser executadas em paralelo, simplificando o projeto do processador.

  • 00:10:00 Nesta seção, o conceito de uma palavra de instrução muito longa (VLIW) é explicado. Isso permite que várias instruções sejam agrupadas em uma longa palavra de instrução, que é buscada e decodificada em conjunto. O VLIW transfere a responsabilidade para os compiladores descobrirem oportunidades para executar instruções ao mesmo tempo antes que o programa seja executado e reduz a necessidade de verificação em tempo de execução. No entanto, se houver espaços vazios na palavra de instrução longa, a unidade de execução ainda poderá sofrer algum desperdício.
Superscalar and VLIW
Superscalar and VLIW
  • 2020.05.22
  • www.youtube.com
This video introduces two types of processor architecture: Superscalar and Very Long Instruction Word (VLIW)
 

7. SIMD e Multithreading de Hardware



7. SIMD e Multithreading de Hardware

O vídeo explica duas maneiras de enfrentar os desafios do paralelismo: instrução única, dados múltiplos (SIMD) e multithreading de hardware (SMT). O SIMD permite que as instruções de hardware sejam executadas em paralelo em vários elementos de dados, simplificando o agendamento e a lógica de decodificação. O SMT explora o paralelismo em nível de thread executando fluxos de instruções independentes simultaneamente, exigindo arquivos de registro adicionais e compartilhamento de cache cuidadoso. O vídeo também discute a implementação do escalonamento de thread fatiado no tempo, em que os threads se revezam ocupando o caminho de dados do processador no modo round-robin, reduzindo a latência e permitindo que vários threads acessem unidades de computação e sistemas de memória simultaneamente. Em última análise, o processador pode acomodar quantos threads forem necessários, embora o ganho de desempenho possa não ser tão significativo em um processador de thread único.

  • 00:00:00 Nesta seção, o conceito de Single Instruction Multiple Data (SIMD) é explicado, onde as instruções de hardware podem ser usadas para a execução paralela de operações em vários elementos de dados. O SIMD simplifica o agendamento e a lógica de decodificação, pois apenas uma instrução precisa ser agendada para aplicar a mesma operação a todos os elementos dos dados. O uso do SIMD é benéfico se o problema a ser resolvido envolve paralelismo significativo de dados, caso contrário, pode não ser uma solução eficiente. Além disso, é explicada a semelhança entre SIMD e computação vetorial, onde as instruções vetoriais podem ser usadas em dados espalhados por diferentes partes da memória para executar operações virtuais.

  • 00:05:00 Nesta seção, o vídeo explica como hardware multi-threading ou simultâneo multi-threading (SMT) pode ser usado para explorar o paralelismo em nível de thread. Ao colocar vários programas ou threads no mesmo processador, diferentes fluxos de instruções podem ser executados simultaneamente se forem independentes uns dos outros. O multi-threading de hardware pode ser útil para máquinas grandes e CPUs únicas, pois permite a fácil extração de instruções de dois threads independentes. No entanto, isso requer arquivos de registro adicionais e consideração cuidadosa de como os caches são compartilhados entre os diferentes encadeamentos.

  • 00:10:00 Nesta seção do vídeo, o apresentador discute como manter a unidade lógica aritmética (ALU) ocupada implementando o escalonamento de thread fatiado no tempo. Esse método permite que os threads se revezem ocupando o caminho de dados do processador em um modo round-robin, o que reduz significativamente a latência ao agendar mais threads. Ao executar a próxima instrução enquanto espera por um encadeamento parado, esse método permite que unidades de computação e sistemas de memória sejam usados por vários encadeamentos simultaneamente. Em última análise, o resultado é que não há desperdício de tempo e o processador pode acomodar quantos threads forem necessários. No entanto, o desempenho de um único thread em um processador de thread único pode não ser melhorado tanto quanto em um processador multithread.
SIMD and Hardware Multithreading
SIMD and Hardware Multithreading
  • 2020.05.23
  • www.youtube.com
This video introduces SIMD, Vector Processing and Hardware Multithreading
 

8. Arquitetura do Processador Multicore



8. Arquitetura do Processador Multicore

Este vídeo explica a arquitetura dos processadores multicore e seus benefícios, como vários núcleos operando de forma independente e compartilhando alguns componentes, enquanto cada núcleo possui seu próprio pipeline e cache de dados. A importância da hierarquia de cache na redução da lacuna de velocidade entre o microprocessador e o acesso à memória é destacada usando vários níveis de caches que exploram a localidade temporal e espacial. O vídeo também aborda o design do sistema no chip, que combina diferentes unidades de função e interfaces em um único chip para reduzir o custo e o fator de forma. No geral, o vídeo fornece uma introdução útil à complexidade e compensações envolvidas no projeto de processadores multicore.

  • 00:00:00 Nesta seção, aprenderemos sobre os processadores multicore e suas vantagens em relação aos processadores single-core. Os processadores multicore têm vários núcleos, que operam independentemente e compartilham alguns componentes, como busca de instruções, decodificação e escalonadores de ponto flutuante. No entanto, cada núcleo tem seu próprio pipeline e seu próprio cache de dados de nível 1. Os processadores multicore requerem protocolos de coerência de cache para garantir que os dados armazenados em cada cache sejam consistentes com os dados na memória principal. System-on-chip é outra opção de design em que vários elementos são combinados em um único dispositivo no mesmo chip para reduzir custos e fator de forma. Ele possui várias unidades de função dedicadas diferentes e interfaces conectadas ao restante do chip por meio de uma interconexão não embarcada.

  • 00:05:00 Nesta seção, o palestrante explica o conceito de hierarquia de cache em uma arquitetura de processador multicore. A principal razão para usar o cache é preencher a lacuna de velocidade entre o microprocessador e o acesso à memória, que são executados em diferentes frequências e possuem diferentes capacidades de armazenamento. Os caches de nível 1, nível 2 e nível 3 são usados para preencher a lacuna e exploram a localidade temporal e espacial de acessar um pequeno número de instruções ou dados em um curto período ou acessar locais próximos, respectivamente. As caches são organizadas por meio de blocos, que são movidos entre os níveis de memória, permitindo que o processador aproveite a localidade temporal e espacial.
Multicore Processor Architecture
Multicore Processor Architecture
  • 2020.05.23
  • www.youtube.com
A brief introduction of multicore processor architecture
 

9. Arquitetura da GPU



9. Arquitetura da GPU

A unidade de processamento acelerado (APU) é um processador heterogêneo com núcleos de baixa potência e unidades de GPU no mesmo chip. As GPUs possuem um grande número de núcleos shader que podem ser programados com instruções, e seus caches geralmente não são coerentes, tornando seu design mais simples e permitindo um desempenho muito maior quando muitos núcleos estão operando ao mesmo tempo. A AMD e a Nvidia utilizam pequenas unidades de computação para suportar a operação em vários dados ao mesmo tempo e possuem grandes arquivos de registro para suportar a troca rápida de contexto. O palestrante também explica como gerenciar o fluxo de controle na arquitetura de GPU, especialmente ao lidar com instruções de ramificação que podem produzir resultados inválidos, mas os programadores não precisam se preocupar muito com esses problemas porque os fornecedores de processadores já fornecem lógica de controle no hardware. No geral, as GPUs são processadores populares para cargas de trabalho complexas no mercado moderno, especialmente no campo de IA e aprendizado de máquina.

  • 00:00:00 Nesta seção, aprendemos sobre a unidade de processamento acelerado (APU), que é um processador heterogêneo típico que consiste em núcleos de baixa potência usados para computação de uso geral, gerenciamento e configuração do sistema e unidades de GPU, tudo no mesmo chip. A APU possui um típico núcleo x86 com dois níveis de cache, enquanto os núcleos da GPU são diferentes e não x86, com menor armazenamento local de dados considerado memória privada. A propriedade da memória é visível em um diagrama, mostrando os locais, a acessibilidade e o tamanho da memória, com a memória privada menor que a memória local e muito menor que a memória global. Os atuais processadores de laptop da Intel ou da AMD normalmente têm um pequeno número de núcleos de uso geral, memória integrada e uma unidade de processamento gráfico no chip.

  • 00:05:00 Nesta seção, aprendemos sobre a arquitetura da GPU e como ela é usada no campo de IA e aprendizado de máquina. As GPUs possuem um grande número de processadores, chamados de núcleos shader, que podem ser programados com instruções. Eles podem acessar a memória GPU de alta velocidade que é diferente do subsistema de memória de um processador de uso geral, e seus caches geralmente não são coerentes. As GPUs não usam o protocolo de coerência de cache para garantir a consistência, o que torna o design mais simples e permite um desempenho muito maior quando muitos núcleos estão operando ao mesmo tempo. No geral, as GPUs são um processador popular para cargas de trabalho complexas no mercado moderno.

  • 00:10:00 Nesta seção, aprendemos como a AMD e a Nvidia utilizam pequenas unidades de computação que possuem hardware cmd para suportar a operação em vários dados ao mesmo tempo. Ambos os fornecedores têm 16 cmds de largura e podem agrupar os itens de trabalho em grupos maiores e mapeá-los para lotes diferentes, dependendo do chip e dos parâmetros de configuração. Além disso, eles têm grandes arquivos de registro para suportar a troca rápida de contexto, e ambos os fornecedores têm uma combinação de cache automático de nível um e bloco de rascunho gerenciado pelo usuário, que é fortemente apoiado em alta largura de banda para suportar operações rápidas em suas respectivas memórias privadas. Por fim, abordamos brevemente o fluxo de controle e o conceito de execução de vários dados com uma instrução, e como as instruções de desvio causam algum desvio na execução dos caminhos, exigindo uma maneira de minimizar a quantidade de computação realizada em dados inválidos.

  • 00:15:00 Nesta seção, o palestrante explica como gerenciar o fluxo de controle na arquitetura da GPU, especialmente ao lidar com instruções de ramificação que podem produzir resultados inválidos. Para lidar com esse problema, as pistas cmd podem ser mascaradas para descartar alguns cálculos, embora isso possa prejudicar o desempenho. Outra questão que precisamos abordar ao usar a tecnologia de threads múltiplos de instrução única (SIMT) é a divergência entre os threads de software, que podem desperdiçar ciclos de computação se não forem bem gerenciados. Felizmente, os programadores OpenCL não precisam se preocupar muito com esses problemas porque os fornecedores de processadores já fornecem lógica de controle no hardware.
GPU Architecture
GPU Architecture
  • 2020.05.23
  • www.youtube.com
This video introduces the internals of a Graphics Processing Unit (GPU), which can be an accelerator for general purpose computing, in addition to graphics p...
 

10. Internos do FPGA


10. Internos do FPGA

Este vídeo discute a arquitetura e os recursos de field-programmable gate arrays (FPGAs). Os FPGAs possuem lógica programável, permitindo que sejam reprogramados para acomodar novas funcionalidades, e tenham acesso direto aos dados por meio de grandes quantidades de entradas e saídas (I/Os). A estrutura da tabela de pesquisa em FPGAs consiste em vários níveis de multiplexadores que podem ser programados para definir funções lógicas. Os FPGAs usam registradores programáveis que podem ser usados para contadores, registradores de deslocamento, máquinas de estado e funções DSP. Cada bloco retangular no chip representa um Logic Array Block (LAB), com cada LAB contendo dez Adaptive Logic Modules (ALMs). Os FPGAs são usados em setores como dispositivos de consumo, automotivo, instrumentação médica e comunicação e transmissão.

  • 00:00:00 Nesta seção, são apresentados os fundamentos dos FPGAs, incluindo sua lógica programável que pode ser reprogramada para acomodar novas funcionalidades e seu acesso direto aos dados por meio de grandes quantidades de I/Os. As vantagens dos FPGAs são sua conexão conveniente com componentes de memória e coprocessadores, funcionalidades substituíveis sem a necessidade de substituir hardware e sua onipresença em setores como dispositivos de consumo, automotivo, instrumentação médica e comunicação e transmissão. A arquitetura dos FPGAs inclui a tabela de consulta, que pode ser programada para definir funções lógicas, e outras partes importantes como registradores carry-in e módulos de lógica adaptativa que serão discutidos nas próximas seções.

  • 00:05:00 Nesta seção do vídeo, o apresentador explica a estrutura de uma tabela de consulta em FPGAs, que consiste em vários níveis de multiplexadores com entradas selecionáveis. As entradas para a tabela de pesquisa podem ser usadas para construir uma função lógica combinacional arbitrária. O vídeo discute os registradores programáveis, que são elementos de armazenamento em FPGAs usados para contadores, registradores de deslocamento, máquinas de estado e funções DSP. Esses registradores têm um sinal de clock normalmente acionado por um clock global e podem retroalimentar a tabela de consulta. Além disso, o vídeo explica como os elementos lógicos e os módulos de lógica adaptativa são conectados por meio de sinais em cadeia
    e carry bits, e como a entrada para registradores pode vir de elementos lógicos anteriores.

  • 00:10:00 Nesta seção, aprendemos como organizar os elementos lógicos dentro de um chip FPGA. Cada bloco retangular no chip representa um Logic Array Block (LAB), com cada LAB contendo dez Adaptive Logic Modules (ALMs). Cada ALM consiste em unidades aritméticas, interconexão local e conexões de registro, bem como recursos dedicados e uma tabela de consulta adaptável para organização flexível de entradas e geração de saídas específicas. Além disso, temos interconexões de linha e coluna que podem conectar LABs específicos e escalas de roteamento linearmente dependendo da densidade do dispositivo. Por fim, temos blocos de memória incorporados que suportam diferentes tipos de estruturas de memória, como RAM de porta única ou dupla, memória somente leitura ou pequenas fatias de estruturas de memória chamadas eMLABs.

  • 00:15:00 Nesta seção, aprendemos sobre as diferentes funcionalidades dos FPGAs, incluindo blocos de processamento de sinal digital (DSP) e componentes de entrada/saída (IO). Os blocos DSP são úteis para implementar funções de processamento de sinal, como transformações FFT e operações de multiplicação e acumulação de alto desempenho. Os FPGAs também podem se comunicar com vários componentes IO, permitindo habilitação, controle e terminação de saída. A lógica do elemento IO inclui pinos bidirecionais e controle de sinal de habilitação de saída, e o caminho de saída gera valores A e B através do sinal de clock. Por outro lado, se o controle de saída estiver desabilitado, os sinais de entrada passam pelo registrador de entrada.

  • 00:20:00 Nesta seção sobre componentes internos do FPGA, a importância dos sinais de clock é destacada junto com o uso de pinos de clock de entrada dedicados para dar suporte às operações do FPGA. Também são discutidos transceptores de alta velocidade, úteis para implementar protocolos de sinais mais complexos em FPGAs, sem a necessidade de processamento e condicionamento de sinais complexos. O uso de PLLs para gerar diferentes sinais de clock para uso em todo o dispositivo com inclinação mínima também é explicado, junto com o uso da tecnologia de célula SRAM e tabelas de consulta para configurar bits programáveis que controlam a conectividade dos sinais de entrada e saída. O vídeo também aborda os métodos usados para programar FPGAs usando W prom externo, Cpl D ou uma CPU para controlar sequências de programação e o uso de uma conexão JTAG de hardware especial para diagnóstico e depuração adicionais.

  • 00:25:00 Nesta seção, o design e os recursos de um FPGA (Field-Programmable Gate Array) são discutidos. A maior parte da área em um FPGA são os blocos de matriz lógica que podem ser conectados por meio de interconexões de linha e coluna. Outros blocos incluem PR, transceptores e um controlador de memória que pode ser conectado a diferentes componentes de memória. Uma área PJ 10g X FPGA é usada como exemplo com 1 milhão de elementos lógicos, 1,7 milhão de registradores, 54.000 blocos de memória com 22 bits cada, 1.518 blocos DSP, transceptores de 367,4 gigabits por segundo, dois blocos PCIe rígidos, 492 pinos IO gerais e 12 controladores de memória. A vantagem dos FPGAs é a alta densidade para criar funções complexas, integração de múltiplas funções, acesso a diferentes padrões e recursos de E/S e acesso direto aos dados em um único chip.
FPGA Internals
FPGA Internals
  • 2020.04.18
  • www.youtube.com
The internal architecture of FPGA
 

11. Memória OpenCL em um sistema GPU



11. Memória OpenCL em um sistema GPU

O instrutor explica o mapeamento da memória OpenCL para GPU AMD e os diferentes níveis de memória em um sistema GPU. O dispositivo de computação possui um processador de comando que gerencia as diretivas para as unidades de computação, que funcionam como núcleos com várias pistas SIMD, arquivos de registro privados e memória privada. O programa do kernel destina-se a fornecer trabalhos autônomos que permitem que todos os núcleos disponíveis sejam utilizados e diminuam a latência de acesso à memória. O palestrante também menciona o conceito de intensidade aritmética, que se refere à relação entre a computação e o movimento do eixo da memória, e como ela deve ser alta para evitar que a largura de banda da memória da GPU seja o fator limitante.

  • 00:00:00 Nesta seção, o palestrante discute o OpenCL em relação à arquitetura de hardware de diferentes processadores, focando especificamente na GPU AMD. O diagrama mostra a memória global, a memória constante e a memória local, com o kernel à esquerda representando o kernel OpenCL usado ao projetar um programa paralelo de dados. Cada grupo de trabalho executa um subconjunto da computação com base nos dados, com a memória local sendo local para o grupo de trabalho e compartilhada com as unidades de execução dentro do processador. Os itens de trabalho dentro do grupo de trabalho são a computação real executada, cada um com seu próprio conjunto de dados.

  • 00:05:00 Nesta seção, o instrutor discute como a memória OpenCL é mapeada para GPU AMD e os diferentes níveis de memória em um sistema GPU. O dispositivo de computação possui um processador de comando que agenda instruções para as unidades de computação, que possuem cache de nível 1 e compartilham algum cache de nível 2 e estão conectadas à memória global. A unidade computacional funciona como um núcleo, com múltiplas pistas SIMD e arquivos de registradores privados, chamados GPRs, que constituem a memória privada. Espera-se que o programa do kernel forneça partes de trabalho independentes, que devem ser o máximo possível para ocupar todos os núcleos disponíveis, e essas partes devem permitir a troca de contexto de hardware para minimizar a latência de acesso à memória. O kernel também deve ter alta intensidade aritmética para fazer uso eficiente do hardware.

  • 00:10:00 Nesta seção, o palestrante discute o conceito de intensidade romântica que é essencialmente a relação entre a computação e o movimento do eixo da memória. O objetivo é ter operações matemáticas para acessos à memória o mais alto possível para evitar ser limitado pela largura de banda da memória.
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. Exemplo OpenCL: Multiplicação de Matrizes



12. Exemplo OpenCL: Multiplicação de Matrizes

Este vídeo apresenta a multiplicação de matrizes como um exemplo de programação OpenCL. O palestrante demonstra como o código C é escrito para criar loops independentes que podem atravessar linhas e colunas da matriz. Itens de trabalho são discutidos e como eles podem ser mapeados para elementos de matriz em OpenCL. Uma implementação do kernel é explicada, abrangendo os argumentos da função do kernel, como ela é chamada e seu corpo. O palestrante mostra como a matriz de entrada é armazenada em uma matriz unidimensional usando números de linha e índice para calcular índices. Por fim, a função kernel calcula o produto escalar para produzir o elemento na matriz de saída. A abordagem linear para armazenar matrizes na memória física é enfatizada.

  • 00:00:00 Nesta seção, aprendemos sobre a multiplicação de matrizes como um exemplo de programação OpenCL. A multiplicação de matrizes é um exemplo clássico de computação avançada que tem sido usado em muitas aplicações diferentes. A implementação requer loops aninhados, com a exigência de que o número de colunas da matriz A seja igual ao número de linhas da matriz B. Isso ocorre porque cada elemento resultante na matriz C é o produto escalar de um vetor linha de A com um vetor de coluna de B. Vemos como o código C é escrito para implementar a operação e como os loops funcionam independentemente, permitindo-nos passar por cada linha ou coluna da matriz C resultante de maneira aleatória.

  • 00:05:00 Nesta seção, o conceito de itens de trabalho é apresentado e é explicado como os itens de trabalho podem ser mapeados para elementos de matriz no OpenCL. Os itens de trabalho podem ser criados para cada elemento de saída de uma matriz a ser calculado independentemente e, portanto, podem ser mapeados para itens de trabalho de intervalo bidimensionais. A implementação do kernel para a multiplicação de matrizes em OpenCL também é discutida, onde são explicados os argumentos para a função do kernel e como chamá-la a partir da função principal, e o corpo da função do kernel é apresentado. A função kernel calcula o produto escalar de um vetor linha e um vetor coluna para calcular cada elemento da matriz de saída.

  • 00:10:00 Nesta seção, o palestrante explica o processo de multiplicação de matrizes usando a linguagem de programação OpenCL. A ideia principal é armazenar a matriz de entrada bidimensional em uma matriz de dimensão única usando o número da linha e o número do índice para calcular o índice correto para encontrar o elemento correto para realizar a operação de produto escalar. A função kernel inicializa a variável soma com 0 e itera através do vetor linha de A e vetor coluna de B para calcular o produto escalar, atribuindo o resultado ao elemento correspondente em C. Essas etapas ilustram como usar números de linha e coluna para calcular índices de forma linear, o que é essencial para armazenar a matriz na memória 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. Estrutura de um programa OpenCL (parte1)



13. Estrutura de um programa OpenCL (parte1)

No vídeo "Estrutura de um programa OpenCL (parte 1)", é explicado o processo de construção de um aplicativo OpenCL. O programa deve primeiro consultar a plataforma OpenCL para entender seus recursos e criar um contexto OpenCL e uma fila de comandos. Os buffers são então criados para troca de dados entre o host e a memória do dispositivo, e o programa do kernel é compilado em um binário para execução no dispositivo. O vídeo explica como criar buffers somente leitura e somente gravação, alocar espaço para matrizes de saída e copiar resultados de volta para o host. A importância de verificar as chamadas de API para uma execução bem-sucedida é enfatizada.

  • 00:00:00 Nesta seção, o palestrante explica as etapas para criar um aplicativo OpenCL. Primeiro, o programa precisa consultar a plataforma OpenCL para entender os recursos disponíveis na plataforma e, em seguida, criar um contexto OpenCL e uma fila de comandos, o que é essencial para operações de buffer e inicialização do kernel. Os buffers são então criados para trocar dados entre o host e a memória do dispositivo. Depois disso, o programa do kernel precisa ser compilado em um binário que pode ser executado no dispositivo acelerador em um FPGA ou GPU. O processo de compilação difere dependendo do dispositivo.

  • 00:05:00 Nesta seção, o vídeo discute como configurar o ambiente para criar a plataforma e o dispositivo, criar um contexto e criar filas de comandos para programação OpenCL. Isso envolve obter o ID da plataforma, que permite ao programador determinar o número de plataformas disponíveis e alocar espaço para armazenamento. O vídeo continua explicando como escolher os dispositivos dentro da plataforma, obter informações sobre o dispositivo escolhido, definir os argumentos adequados e passar os valores desses argumentos para a função kernel para instanciar o kernel. Por fim, eles mostram como copiar os resultados de volta do dispositivo para a memória do host assim que o kernel estiver concluído.

  • 00:10:00 Nesta seção, o vídeo explica como criar um contexto OpenCL e a importância do objeto de contexto em unir todos os recursos necessários para operações OpenCL, como filas de comandos e buffers. A transcrição descreve como criar buffers somente leitura e somente gravação e como copiar dados entre o host e o dispositivo usando CL ink e CL em comandos Q write buffer. O exemplo usado é a multiplicação de matrizes, onde as matrizes A e B são entradas e a matriz C é uma saída. O vídeo enfatiza a importância de verificar chamadas de API bem-sucedidas.

  • 00:15:00 Nesta seção, o palestrante explica como alocar espaço para a Matriz C, que é a matriz de saída. Eles dizem que o buffer C é declarado como memória CL, o que permite ao dispositivo gravar os resultados nele. No entanto, isso não proíbe a leitura desse buffer do lado do host, que é necessário para recuperar os resultados do dispositivo e copiar a matriz resultante para algum lugar no host. O alto-falante mostra a definição completa da API do buffer, que usa cinco argumentos: contexto, sinalizadores, tamanho, ponteiro do host e valor de retorno.
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. Estrutura de um programa OpenCL (parte2)



14. Estrutura de um programa OpenCL (parte2)

A terceira etapa na programação OpenCL envolve a compilação do kernel, que é diferente para dispositivos FPGA, pois é feita offline. O programa CL create com source e C TX é usado para criar um programa, seguido pelo programa CL build para compilar o programa em binário. A função correta do kernel é selecionada usando o ponto de entrada apropriado e os argumentos do kernel devem ser inicializados usando CL set kernel argument com o ponteiro correto. O orador entra em detalhes sobre como configurar os argumentos corretamente na multiplicação de matrizes. Em seguida, eles discutem a configuração de tamanhos de grupos de trabalho locais e globais, a execução do kernel e a obtenção dos resultados usando o CL na API de buffer de fila. Por fim, o palestrante menciona brevemente os eventos na programação OpenCL.

  • 00:00:00 Nesta seção, é discutido o terceiro passo em um programa OpenCL, que envolve a compilação do kernel. Este processo é um pouco diferente para dispositivos FPGA, pois a compilação é feita offline. Supondo que o código-fonte do programa seja armazenado em um buffer de caracteres, o programa CL create com source e C TX é usado para criar um programa, e o programa CL build é usado para compilar o programa em binário. Em seguida, a função de kernel correta é selecionada a partir do código-fonte, criando um kernel usando o ponto de entrada apropriado para a função de kernel específica escolhida. Depois que o kernel é criado, os argumentos do kernel devem ser inicializados corretamente usando CL set kernel argument, com um ponteiro apontando para o valor real. Por exemplo, na multiplicação de matrizes, sete argumentos devem ser configurados adequadamente, incluindo o buffer de destino, o tamanho das matrizes e as duas matrizes de entrada.

  • 00:05:00 Nesta seção, o palestrante fala sobre a inicialização de vários argumentos do kernel e destaca a importância de configurar corretamente os índices desses argumentos para evitar erros. Eles então explicam como definir tamanhos de grupos de trabalho locais e globais, especificando o número de itens de trabalho em um grupo e o número de grupos de trabalho. Por fim, eles descrevem as etapas para executar o kernel, incluindo a chamada da API OpenCL e a obtenção dos resultados do dispositivo para a memória do host usando a API CL in queue buffer. O palestrante também menciona brevemente os eventos e como eles podem ser usados na programação OpenCL, mas isso será discutido mais adiante em palestras 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. Demonstração de multiplicação de matriz OpenCL



15. Demonstração de multiplicação de matriz OpenCL

O vídeo "OpenCL Matrix Multiplication Demo" explica o processo de execução de um exemplo de multiplicação de matrizes usando a estrutura OpenCL. Ele inclui vários arquivos de código-fonte, como um programa C principal para o lado do host, programa do kernel e um makefile. O vídeo cobre diferentes aspectos da estrutura OpenCL, obtendo IDs de plataforma e dispositivo, criando um contexto OpenCL, programa e objetos de kernel, gerenciamento de buffer para o host e criação e inicialização de buffers no dispositivo. O apresentador também mostra um kernel de amostra que executa operações de produto ponto e uma demonstração do resultado final em um mecanismo de computação AMD Radeon pro 575.

  • 00:00:00 Nesta seção, o palestrante explica como executar um exemplo de multiplicação de matrizes por meio do OpenCL. O exemplo consiste em vários arquivos de código-fonte, incluindo um programa C principal como programa do lado do host, um programa de kernel chamado my kernel CL e um makefile para ajudar a compilar o projeto. O programa principal inclui bibliotecas padrão, definições de macro para estrutura OpenCL e declarações para matrizes de entrada (matriz A e matriz B), bem como nome do dispositivo, identificadores de plataforma e números de dispositivos. O palestrante também descreve vários aspectos da estrutura OpenCL, como contexto, programa, kernel e leitura e compilação do código-fonte. Além disso, o palestrante explica a importância das IDs de plataforma e dispositivo, bem como as dimensões da matriz no código.

  • 00:05:00 Nesta seção, o palestrante discute o processo de obtenção de IDs de plataforma e dispositivo e criação do contexto OpenCL para a demonstração de multiplicação de matrizes. Eles explicam como a contagem da plataforma é retornada e a matriz é alocada para armazenar os IDs da plataforma. Eles também mostram como obter os IDs de dispositivo para um tipo específico escolhido e consultar seu nome. O vídeo demonstra como criar uma fila de comandos para cada dispositivo e como compilar o programa OpenCL. Eles explicam melhor como usar o aplicativo aberto para abrir o arquivo de código-fonte do kernel e compilar o programa.

  • 00:10:00 Nesta seção, o vídeo explica como criar um objeto de programa a partir do código-fonte do kernel OpenCL. Este processo é diferente em diferentes plataformas. No Mac OS com suporte nativo a OpenCL, pode-se criar um objeto de programa usando o código-fonte. No Altera FPGA OpenCL SDK, no entanto, criar um objeto de programa envolve compilar o kernel e criá-lo a partir do resultado binário dessa compilação usando a API específica da Altera. Depois que o objeto do programa é criado, o vídeo mostra como construir o programa do kernel e criar o objeto do kernel. Finalmente, o vídeo vai para o gerenciamento de buffer no lado do host, onde um buffer é alocado para armazenar a matriz C resultante.

  • 00:15:00 Nesta seção, o apresentador explica como criar e inicializar buffers no lado do dispositivo para multiplicação de matrizes usando OpenCL. Eles continuam mostrando como definir os argumentos do kernel corretamente, incluindo a configuração de tamanhos de grupos de trabalho globais e locais. A importância de verificar o valor de retorno do CL também é destacada. O apresentador então demonstra como ler os resultados na memória do host, liberando os recursos alocados no host e no OpenCL. Por fim, eles mostram um kernel de amostra, que usa get global ID para percorrer a largura de uma matriz, executar operações de produto escalar e armazenar os resultados no elemento correspondente na matriz C.

  • 00:20:00 Nesta seção, o palestrante discute a construção do programa C principal e do programa Mike Rinder CL. Para construir o programa do lado do host, os usuários precisam compilar um único arquivo de programa C e, para o kernel, pode-se usar o compilador da GPU para compilar o Micra conhecido como CL para um binário da GPU. Depois de criar o programa no host e no dispositivo, os usuários têm um executável chamado "principal", junto com diferentes binários disponíveis para diferentes versões de GPU. Ao executar este arquivo, o palestrante mostra uma plataforma OpenCL com um mecanismo de computação AMD Radeon pro 575 que possui um valor inicial da matriz C com todos os elementos contendo oito pontos.
OpenCL Matrix Multiplication Demo
OpenCL Matrix Multiplication Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Matrix Multiplication.
Razão: