OpenCL na negociação - página 9

 

EECE.6540 Computação Heterogênea (Universidade de Massachusetts Lowell) - 46. Conceitos básicos de FPGA



46. Conceitos básicos de FPGA

Este vídeo aborda os conceitos básicos de field programmable gate arrays (FPGAs). Ao contrário das CPUs, os FPGAs podem ser programados para atender a recursos de hardware específicos, o que significa que são altamente personalizáveis. O vídeo discute a importância da latência no projeto do circuito e como ela pode ser balanceada com a maximização do f max. Ele apresenta o conceito de projeto de pipeline para aumentar a frequência na qual uma computação pode ser executada, bem como discute caminhos de dados e caminhos de controle em um circuito. Por fim, o vídeo discute a ocupação do circuito em um FPGA e como a diminuição das bolhas e o aumento da ocupação podem aumentar o f max.

  • 00:00:00 Nesta seção, aprendemos sobre os conceitos básicos de matrizes de portas programáveis em campo (FPGAs) e como elas diferem de outras arquiteturas de processadores. Ao contrário das CPUs, os FPGAs não possuem um caminho de dados fixo e podem ser programados para atender a recursos de hardware específicos para acomodar diferentes números de registradores, lógica computacional e suas conexões, tornando-os altamente personalizáveis. Os FPGAs contêm vários componentes, como lógica adaptativa, blocos de RAM, blocos DSP e switches de roteamento programáveis, que podem ser conectados para implementar diferentes designs. Além disso, a frequência máxima de operação de um FPGA é determinada pelo atraso de propagação física da lógica combinacional, que afeta a latência e a velocidade de operação do circuito.

  • 00:05:00 Nesta seção, é explicado o conceito de latência e sua importância no projeto de circuitos. A latência é o tempo que um circuito leva para concluir uma ou mais operações e pode ser medida em tempo ou ciclos de clock. A redução da latência geralmente é o objetivo, mas deve ser cuidadosamente equilibrada com a maximização do f máx. É fornecido um exemplo de um projeto otimizado para latência e outro otimizado para f max por meio do uso de pipeline. A importância dos registradores de pipeline para quebrar caminhos críticos longos e melhorar a velocidade é enfatizada.

  • 00:10:00 Nesta seção, o vídeo explica o conceito de projeto de pipeline e como ele aumenta a frequência na qual um cálculo pode ser executado. Ao usar um registrador de pipeline, o atraso pode ser reduzido, permitindo velocidades de clock mais altas e um aumento na taxa de transferência. O vídeo apresenta a ideia de caminho de dados e caminho de controle em um circuito, onde o caminho de dados é a cadeia de registradores e a lógica combinacional que realiza a computação, e o caminho de controle é tudo o mais fora do caminho de dados que controla a operação do circuito. . Várias lógicas são adicionadas ao caminho de controle para controle de fluxo de handshaking, controle de loop e controle de ramificação, entre outros, e a ocupação é usada para definir a taxa de inicialização do caminho de dados em um circuito.

  • 00:15:00 Nesta seção, o palestrante explica o conceito de ocupação do circuito em um FPGA. O circuito possui vários registradores, sendo um deles um registrador válido que determina se os dados de entrada são válidos ou não. O objetivo é diminuir as bolhas no circuito para aumentar a ocupação minimizando as bolhas em todo o circuito. Cada ciclo é contado para ver como os recursos estão sendo usados, e as porções desocupadas no circuito são chamadas de bolhas. Ao diminuir as bolhas e aumentar a ocupação, o f max pode ser aumentado.
Basic FPGA concepts
Basic FPGA concepts
  • 2021.04.07
  • www.youtube.com
This video introduces basic concepts of FPGA and design for FPGA
 

47. Análise de projeto (I): analise as primeiras imagens do FPGA



47. Análise de projeto (I): analise as primeiras imagens do FPGA

Esta seção do vídeo se concentra no processo de análise de imagens iniciais de FPGA para um projeto DPC++. O palestrante explica as etapas envolvidas, como compilar o programa, gerar o binário do FPGA e executar a criação de perfil. O vídeo inclui uma demonstração de como gerar relatórios e interpretar os vários painéis de informações fornecidos nos relatórios. O palestrante também analisa as primeiras imagens do FPGA de um módulo b2 e discute os vários blocos lógicos, loops, unidade de carga e fator de desenrolamento. Eles também discutem como o projeto de uma função do kernel pode impactar significativamente o projeto interno do FPGA e fornecem exemplos de como os loops internos e externos podem ser desenrolados para aumentar a taxa de transferência. Os exemplos ilustram a flexibilidade da programação em linguagem de alto nível para influenciar os recursos de hardware do FPGA.

  • 00:00:00 Nesta seção do vídeo, o palestrante discute o processo de análise de um projeto DPC++, com foco específico na análise de imagens iniciais de FPGA. Isso envolve várias etapas, como compilar o programa em um emulador de FPGA para garantir a correção funcional, gerar o binário do FPGA, executá-lo em uma placa de recurso e executar a criação de perfil para determinar o desempenho do tempo de execução. A segunda etapa envolve a geração de relatórios e a procura de gargalos antes de revisar o projeto, se necessário. O vídeo inclui uma demonstração de como gerar relatórios e analisá-los em um navegador e explica como interpretar os vários painéis de informações e resumos fornecidos nos relatórios.

  • 00:05:00 Nesta seção, o palestrante apresenta uma visão geral da ferramenta de análise de design e seus recursos. Eles explicam como o painel de utilização de recursos exibe informações sobre os recursos que serão usados pelo projeto e como o painel de visualizadores do sistema permite que os usuários visualizem diferentes componentes do projeto, como componentes de memória e pipes. O visualizador gráfico dentro do painel de visualizadores do sistema mostra uma lista de componentes usados no projeto e como eles estão interconectados. O palestrante também demonstra como os usuários podem ampliar módulos individuais para visualizar seus segmentos correspondentes no código-fonte.

  • 00:10:00 Nesta seção, o palestrante analisa as primeiras imagens do FPGA de um módulo b2 e discute os vários blocos lógicos e loops que compõem o projeto. Eles também explicam o uso da unidade de carregamento para carregar dados do componente de memória e o fator de desenrolamento para aumentar a eficiência das operações de loop. O palestrante também compara projetos paralelos 4 e de tarefa única e recomenda o uso de tarefa única para projetos de FPGA para otimizar o acesso à memória.

  • 00:15:00 Nesta seção, o palestrante discute como o design de uma função do kernel pode impactar significativamente o design interno do FPGA. O palestrante fornece exemplos de como os loops internos e externos podem ser desenrolados para fazer uso dos recursos de hardware do FPGA, aumentando assim a taxa de transferência. Os exemplos ilustram a flexibilidade da programação em linguagem de alto nível em influenciar os recursos de hardware do FPGA.
Design Analysis (I): Analyze FPGA Early Images
Design Analysis (I): Analyze FPGA Early Images
  • 2021.04.07
  • www.youtube.com
This video introduce the design workflow and how to analyze the early image using DPC++ compiler report.
 

48. Análise de Projeto DPC++ FPGA (II): Criação de Perfil de Tempo de Execução



48. Análise de Projeto DPC++ FPGA (II): Criação de Perfil de Tempo de Execução

Neste vídeo, o apresentador discute o processo de análise do desempenho do tempo de execução de um programa usando ferramentas que coletam dados de desempenho adicionando registros de instrumentos de criação de perfil aos fluxos de bits do FPGA. Eles demonstram como compilar para criação de perfil e interpretar os resultados coletivos de criação de perfil usando o criador de perfil dinâmico Intel FPGA com contadores de desempenho adicionados pelo usuário. Eles mostram como o criador de perfil V2 exibe funções de kernel e executáveis usados para analisar resultados de criação de perfil de tempo de execução e como identificar gargalos de partição e otimizá-los. O exemplo usado é um kernel de modificação de matriz que tinha muitos acessos à memória global, que foi otimizado usando memória local para reduzir a comunicação com a memória global e melhorar a eficiência do projeto.

  • 00:00:00 Nesta seção, o apresentador discute a análise do desempenho do tempo de execução de um programa. Eles explicam como usar ferramentas para coletar dados de desempenho adicionando registros de instrumentos de criação de perfil aos fluxos de bits do FPGA. O criador de perfil dinâmico Intel FPGA é usado com contadores de desempenho adicionados pelo usuário para coletar dados de desempenho do kernel. Os dados de desempenho são armazenados em um arquivo chamado profile.mall no final da execução, e um arquivo json é gerado para permitir que o Intel v2 profiler leia os arquivos. Ambos os arquivos são necessários ao carregar a pasta de resultados no kit de ferramentas Intel Retune. Importar os dados do diretório é importante ao carregar dados para v2.

  • 00:05:00 Nesta seção, os apresentadores demonstram como compilar para criação de perfil e interpretar os resultados coletivos de criação de perfil. Eles mostram como o criador de perfil V2 exibe funções de kernel e executáveis usados para analisar resultados de criação de perfil de tempo de execução. O painel mostra as funções de operação de memória e operações de loop, seu tempo, porcentagem de parada, ocupação, tempo ocioso, porcentagem de atividade, tamanho da transferência de dados e largura de banda média. A parte inferior do painel mostra com mais detalhes a utilização do FPGA e outras métricas para ocupação global da largura de banda da memória. Ao mostrar as estatísticas detalhadas, os designers podem entender os kernels individuais e suas funções, o que os ajuda a otimizar e melhorar seus projetos.

  • 00:10:00 Nesta seção do vídeo, o palestrante discute como identificar gargalos de partição e otimizá-los. O exemplo usado é um kernel de modificação de matriz que possui muitos acessos à memória global, resultando em 15,57 GB de transferência de dados. O design do kernel é vinculado à memória e a solução é otimizar o acesso à memória usando a memória local para reduzir a comunicação com a memória global e melhorar a eficiência do design. Essa otimização será discutida na próxima aula.
DPC++ FPGA Design Analysis (II): Runtime Profiling
DPC++ FPGA Design Analysis (II): Runtime Profiling
  • 2021.04.07
  • www.youtube.com
This video introduces DPC++ profiling and how to analyze run-time profiling reports using Intel VTune tool.
 

EECE.6540 Computação heterogênea (Universidade de Massachusetts Lowell) - 49. Exemplos de OpenCL



49. Exemplos de OpenCL (I)

O vídeo do YouTube "OpenCL Example (I)" aborda a implementação da multiplicação de matrizes usando loops aninhados na programação C e sua implementação como um kernel OpenCL. O palestrante explica como usar dois níveis de loops aninhados para o cálculo do produto escalar do elemento resultante na matriz e como cada elemento de saída da matriz C é tratado como um item de trabalho separado no OpenCL. O vídeo também aborda as etapas necessárias para preparar o kernel OpenCL para execução e recuperar a matriz resultante de um dispositivo para um host, bem como definir tamanhos de grupos de trabalho e executar o kernel com argumentos do kernel modificados. Além disso, é fornecido um código de amostra para multiplicação de matrizes, e o palestrante demonstra o processo de obtenção de IDs de dispositivo e plataforma em um Mac OS e a criação de um objeto de programa em diferentes plataformas. Por fim, o vídeo explica o gerenciamento de buffer, rastreando os recursos alocados no lado do host e os recursos OpenCL usados e fornece um exemplo de kernel de multiplicação simples.

Este vídeo aborda vários exemplos de uso do OpenCL, incluindo multiplicação de matrizes, rotação de imagens e filtragem de imagens. Para a rotação da imagem, o palestrante explica como resolver o problema usando decomposição de entrada e demonstra a função kernel usada para identificar a localização original e nova de cada pixel. Para filtragem de imagem, o palestrante discute o conceito de criação de objetos de imagem no lado do dispositivo e o uso do amostrador OpenCL para definir como acessar a imagem. Eles também apresentam uma implementação de amostra da função de convolução de imagem com dois loops for aninhados. O vídeo termina com uma demonstração do uso do OpenCL para realizar um filtro de convolução em uma imagem e verificar os resultados.

  • 00:00:00 Nesta seção, o palestrante apresenta a multiplicação de matrizes, um exemplo clássico de computação, e explica como ela pode ser implementada por loops aninhados na programação C. Eles também explicam o cálculo do produto escalar do elemento resultante na matriz, que é o produto de uma linha da matriz A e uma coluna da matriz B. A palestra explica que os dois níveis de loops aninhados podem ser executados independentemente e podem ser executados de forma aleatória.

  • 00:05:00 Nesta seção, o conceito de item de trabalho e como ele pode ser aplicado para implementar a multiplicação de matrizes no kernel OpenCL é discutido. Cada elemento de saída da matriz C é tratado como um item de trabalho separado e, com a ajuda de elementos de processamento FPGA ou GPU, uma faixa bidimensional de itens de trabalho pode ser mapeada para outros loops for na implementação do hardware. Para implementar a multiplicação de matrizes, é definida uma função kernel chamada "multiplicação simples" com uma lista de argumentos, que requer todas as matrizes de entrada necessárias e suas dimensões. O corpo da função kernel usa IDs globais para calcular a posição bidimensional do item de trabalho e inicializa a soma para calcular o elemento resultante da matriz C.

  • 00:10:00 Nesta seção, o palestrante explica a função kernel para multiplicação de matrizes usando a estrutura de programação OpenCL. A função kernel utiliza uma operação de produto escalar e um loop for para percorrer os elementos do vetor linha de a e o vetor coluna de B. Os índices para a matriz de entrada bidimensional são calculados usando os números das linhas e os números das colunas para encontrar o elemento certo no vetor linha e no vetor coluna. Uma vez calculado o produto escalar, o elemento resultante é atribuído ao elemento correspondente em C. Também é discutido o ambiente de computação, que é dependente da plataforma e envolve o entendimento dos recursos disponíveis e parâmetros importantes na plataforma.

  • 00:15:00 Nesta seção, o palestrante descreve as etapas necessárias para preparar um kernel OpenCL para funcionar, começando com a criação de um contexto e uma fila de comandos para instanciar kernels. Em seguida, os dados de entrada são preparados alocando buffers no lado do host, copiando os dados da memória do host para a memória do dispositivo e despachando o kernel. O programa então espera a conclusão do kernel para coletar os resultados lendo a memória do dispositivo. A aplicação openCL tem duas camadas: a camada de plataforma e a camada de tempo de execução, e o programa do kernel deve ser compilado em um binário que pode ser executado no dispositivo acelerador, seja um FPGA ou GPU. Essas etapas diferem dependendo do dispositivo, e a compilação de um binário PG pode levar horas, enquanto a compilação da GPU costuma ser rápida.

  • 00:20:00 Nesta seção, o vídeo discute como configurar o ambiente para programação OpenCL. A primeira etapa envolve a obtenção do ID da plataforma, que é feito com a função CL get platform IDs que retorna o número de plataformas disponíveis no sistema. A seguir, o vídeo explica como obter um dispositivo específico dentro da plataforma com base na preferência do usuário e como criar um contexto OpenCL, que é o encapsulamento de todos os recursos, como filas de comandos e buffers. O tutorial recomenda verificar o valor de retorno para garantir o sucesso da operação.

  • 00:25:00 Nesta seção, o vídeo explica como criar e mover dados das matrizes de entrada B e C e da matriz de saída C, declarando buffers e usando funções OpenCL API. Eles assumem que as matrizes A, B e C já foram declaradas como arrays do tipo float e armazenam os dados no espaço de endereço linear na memória física. O vídeo demonstra como usar a função CL create buffer para declarar buffers para as matrizes A e B, e a função CL Inc you write buffer para copiar os dados iniciais das matrizes A e B para os buffers criados, que residem no dispositivo. A próxima etapa é alocar espaço para a matriz C, que é declarada como um buffer somente para gravação da memória CL, pois o dispositivo grava os resultados do cálculo nela.

  • 00:30:00 Nesta seção do vídeo do YouTube "Exemplos OpenCL (I)", o palestrante explica o processo de recuperação de resultados de um dispositivo e cópia da matriz resultante do buffer C para um host. A definição da API C é mostrada, com uma explicação dos cinco argumentos para criar um buffer, incluindo contexto, sinalizadores, tamanho, ponteiro do host e valor de retorno. O palestrante então explica a terceira grande etapa do programa OpenCL, que é a compilação do kernel, usando um processo de compilação simples para dispositivos FPGA. O processo envolve a criação e construção de um programa e a seleção da função de kernel correta a partir do código-fonte. Por fim, o palestrante discute como inicializar os argumentos do kernel antes de executar o programa do kernel, usando a API OpenCL do argumento do kernel do conjunto CL.

  • 00:35:00 Nesta seção, o palestrante discute o processo de inicialização dos argumentos do kernel, definição de tamanhos de grupo de trabalho, execução do kernel e obtenção de resultados em um programa OpenCL. O usuário deve usar a API 'CL create kernel' e especificar o tamanho e o valor do argumento do kernel, usando um ponteiro para o valor real. O palestrante enfatiza a importância de definir índices de argumento com precisão e modificá-los para cada linha ao copiar e colar. Os tamanhos de grupo de trabalho local e global devem ser definidos para o número de itens de trabalho e grupos de trabalho. Por fim, o buffer CL associado é usado para ler o buffer de saída na memória do host, indicando os requisitos de sincronização para execução adequada.

  • 00:40:00 Nesta seção, o palestrante apresenta um exemplo de multiplicação de matrizes usando OpenCL. O código-fonte para o exemplo de multiplicação de matrizes consiste em vários arquivos, incluindo o programa do lado do host, o programa do kernel e um makefile para ajudar a compilar o projeto. O programa do lado do host é escrito em C e inclui bibliotecas padrão e arquivos de cabeçalho específicos para a estrutura OpenCL. O exemplo inclui matrizes de entrada e declarações para variáveis, incluindo o número de plataformas e dispositivos, o contexto, o programa OpenCL e o kernel OpenCL. O palestrante também explica como compilar o código-fonte do kernel e descreve os tamanhos das matrizes de entrada e a matriz de saída resultante.

  • 00:45:00 Nesta seção do vídeo, o apresentador demonstra como obter IDs de dispositivos e plataformas para OpenCL em um Mac OS. Ao chamar várias funções OpenCL, como obter ID da plataforma e criar filas de comandos, o locutor cria um contexto OpenCL e compila o programa. Eles também explicam que o código mostrado é compatível com Mac OS e OpenCL SDK e relatará um erro se for executado em uma plataforma diferente.

  • 00:50:00 Nesta seção, o vídeo demonstra como criar um objeto de programa usando OpenCL em diferentes plataformas. No Mac OS, o objeto do programa é criado a partir de um arquivo de código-fonte do kernel, enquanto no Altera FPGA OpenCL SDK, ele é criado a partir de um arquivo binário gerado por meio de compilação. Depois que o objeto do programa é criado, o programa do kernel pode ser construído e a função específica do kernel pode ser selecionada a partir desse objeto do programa. No final desta seção, os objetos e funções necessários estão prontos para a próxima seção do programa.

  • 00:55:00 Nesta seção, o vídeo discute o processo de gerenciamento de buffer, incluindo alocar um buffer para armazenar os resultados da matriz e usar CL create buffer para criar buffers no lado do dispositivo. O vídeo também destaca a importância de verificar o valor de retorno do CL em Q e o range coronel para garantir o sucesso da execução, principalmente ao utilizar FPGAs. Além disso, o vídeo explica o processo de verificação dos resultados imprimindo os recursos alocados no lado do host e os recursos do OpenCL usados, além de fornecer um exemplo de kernel de multiplicação simples em que sete argumentos são usados para executar a operação de produto escalar por meio de iterações.

  • 01:00:00 Nesta seção do vídeo, o palestrante explica dois exemplos de uso do OpenCL. A primeira é a multiplicação de matrizes. O programa processa duas matrizes e multiplica seus elementos correspondentes para armazenar o resultado em uma terceira matriz. O segundo exemplo é a rotação da imagem, onde o programa gira os pixels de uma imagem com base em certas fórmulas. Essas fórmulas levam em consideração as coordenadas originais e novas de cada pixel e o ângulo de rotação.

  • 01:05:00 Nesta seção, o palestrante discute como dividir um problema de rotação de imagem em problemas menores usando decomposição de entrada. Eles explicam que as informações de pixel da imagem serão copiadas para um novo local por meio de cálculos independentes das dimensões x e y. Grupos de trabalho são atribuídos para calcular a nova localização de cada pixel usando seu ID global. O palestrante também detalha como determinar grupos e dimensões de itens de trabalho e a função de kernel necessária para concluir esta operação. O objetivo é criar um método mais eficiente e escalável para cálculos de rotação de imagens.

  • 01:10:00 Nesta seção, o apresentador do vídeo explica como usar o OpenCL para girar uma imagem. A função kernel é usada para identificar a localização original de um pixel, calcular a nova localização do pixel usando parâmetros de rotação, verificar a verificação de limites para garantir que as novas coordenadas estejam dentro do tamanho da imagem original e copiar as informações do pixel da localização original para o novo local. O código também inclui ligações C++ para OpenCL API e etapas para consultar plataformas, adquirir dispositivos e declarar buffers para mover dados da memória do host para o buffer do dispositivo. O buffer somente leitura também é criado para garantir a segurança dos dados originais.

  • 01:15:00 Nesta seção, o palestrante explica as etapas necessárias para realizar uma rotação de imagem usando o OpenCL. Primeiro, a imagem original deve ser copiada para um buffer de imagem. Em seguida, o kernel é compilado e executado inicializando o buffer de destino e definindo os argumentos corretos do kernel, incluindo as dimensões da imagem original e os parâmetros de rotação. O kernel é executado com o tamanho do grupo de trabalho global e o tamanho do grupo de trabalho local. Por fim, o resultado é lido de volta para o host usando o buffer de leitura em Q. O palestrante também demonstra o código-fonte de exemplo para rotação de imagem, que inclui arquivos de cabeçalho, funções de utilitário, IDs de plataforma e dispositivo, filas de comando, objetos de programa e kernel e buffers de entrada/saída para as imagens originais e rotacionadas.

  • 01:20:00 Nesta seção, o vídeo aborda o processo de rotação de uma imagem usando o OpenCL. O host lê a imagem no formato BMP e a converte em uma matriz de números de ponto flutuante armazenados no buffer de imagem de entrada. O buffer de saída no host é criado e inicializado com números aleatórios. A plataforma é consultada para localizar os dispositivos na plataforma e criar um contexto e uma fila de comandos. O programa e os objetos do kernel são criados e os buffers do lado do dispositivo são criados para armazenar a imagem original e girada. A imagem original é copiada para o buffer no lado do dispositivo e os argumentos do kernel são definidos. O kernel é executado instanciando-o com os tamanhos de grupo de trabalho global e local. O valor de retorno é verificado para garantir que o kernel foi executado com sucesso.

  • 01:25:00 Nesta seção, o palestrante dá uma visão geral da rotação da imagem usando o OpenCL. Depois de concluir o kernel, os dados de saída são lidos de volta para o host usando o ponteiro para a memória global no lado do dispositivo e um buffer do host é fornecido para armazenar a imagem. A formatação BMP está envolvida no processo, e uma função utilitária chamada write BMP float é usada para criar um novo arquivo BMP que mostra o resultado. A função do kernel é descrita em detalhes, onde os ponteiros do buffer de destino e de origem são passados junto com as dimensões da imagem e os parâmetros de rotação. A fórmula para calcular as novas coordenadas de cada pixel é usada e uma verificação de limite é aplicada antes de copiar as informações do pixel do local original para o novo local. O processo é demonstrado com um exemplo de rotação de uma imagem de gato em 45 graus.

  • 01:30:00 Nesta seção, o palestrante explica o conceito de filtragem de imagem usando OpenCL. Ele descreve o processo de usar um filtro 3x3 para multiplicar e somar os valores dos pixels vizinhos para obter o novo valor de pixel filtrado. Ele também enfatiza a necessidade de cuidado ao lidar com pixels próximos ao limite que possuem menos pixels vizinhos para aplicar o filtro. O palestrante então demonstra diferentes tipos de filtros de imagem que podem ser aplicados a uma imagem original usando o OpenCL. Em seguida, ele apresenta um exemplo de implementação da função de convolução da imagem com dois loops for aninhados que passam por todos os pixels da imagem e um terceiro loop que passa pelos elementos do filtro.

  • 01:35:00 Nesta seção, o palestrante fala sobre a estrutura de dados de imagem em OpenGL, que é um tipo opaco que é mantido como uma estrutura multidimensional e usado para tipos de dados de imagem. Ao contrário dos tipos inteiros ou de ponteiro, as imagens não podem ser visualizadas diretamente por meio de pontos em um dispositivo e seus valores de pixel podem ser especificados como valores flutuantes ou inteiros. A criação de objetos de imagem no lado do dispositivo permite que as unidades de computação OpenCL leiam e gravem novos pixels nos objetos de imagem e é benéfico para sequências de instruções longas e otimizadas específicas para processamento de dados de imagem ou processadores gráficos. O palestrante também explica como criar um buffer de imagem de origem, um objeto de imagem de saída e um filtro copiando dados de imagem e filtro para o dispositivo usando APIs como CL Write Image e CL Create Buffer.

  • 01:40:00 Nesta seção, o apresentador apresenta o conceito de amostrador OpenCL, que é um objeto usado para descrever como acessar uma imagem. O sampler é criado usando a função da API que toma o contexto como argumento e define se as coordenadas serão normalizadas ou não. Também é definido o modo de endereçamento, que trata de como as coordenadas da imagem são tratadas quando estão fora do alcance. O modo de filtragem especifica o filtro que precisa ser aplicado quando as coordenadas ficam entre os pixels. Uma função de kernel chamada convolução também é introduzida, que recebe objetos de imagem 2D de entrada e saída, um filtro flutuante constante para armazenar valores de filtro e o objeto amostrador. A função kernel lê itens de dados do objeto de imagem e retorna um vetor de quatro números de ponto flutuante para realizar aritmética nos dados da imagem.

  • 01:45:00 Nesta seção, o palestrante explica como realizar operações em vetores de ponto flutuante usando um vetor de ponto flutuante de quatro elementos. Eles passam pelo processo de inicialização do índice do filtro, declarando variáveis para coordenadas de dois elementos, iterando pelas linhas do filtro e calculando as coordenadas em duas dimensões. O pixel é lido do objeto de imagem usando a função read image F e multiplicado pelo valor do pixel do filtro, com o valor atualizado armazenado na imagem de saída. Por fim, a imagem é lida usando uma tinta CL que você lê a função de imagem.

  • 01:50:00 Nesta seção, é discutido o código para Exemplos OpenCL (I), que fornece filtros para uso no processamento de imagens. O programa atribui tamanhos e valores diferentes a cada tipo de filtro e usa funções auxiliares para inicializar os valores do filtro e ler dados de imagem BMP de um arquivo. A descoberta de plataforma e dispositivo é realizada antes de criar as imagens de entrada e saída, bem como o buffer de filtro. Uma vez inicializado, o amostrador configura como os pixels que saem do limite serão processados antes de executar o kernel com os parâmetros de filtro apropriados. O tamanho global é definido como o número de colunas e linhas na imagem.

  • 01:55:00 Nesta seção, o palestrante demonstra um exemplo de uso do OpenCL para realizar um filtro de convolução em uma imagem. O processo envolve a configuração de um kernel que processa a imagem inteira e usa um tamanho local de 8 por 8 itens de trabalho em um grupo em uma dimensão de dados. A imagem de saída é armazenada no lado do dispositivo e pode ser lida de volta para o host usando CL read image. Os resultados são então comparados a uma imagem de referência filtrada que foi gerada pela execução do filtro no lado do host. As duas imagens são visualmente idênticas, verificando os resultados. Por fim, os recursos do lado do host e do dispositivo são liberados.
OpenCL Examples (I)
OpenCL Examples (I)
  • 2017.09.29
  • www.youtube.com
Lectures on OpenCL Examples (I)
 

Uma comparação de SYCL, OpenCL, CUDA e OpenMP para classificação de vetores de suporte massivamente paralelos ( WOCL / SYCLcon 2022 )



Uma comparação de SYCL, OpenCL, CUDA e OpenMP para classificação de vetores de suporte massivamente paralelos

O vídeo compara o desempenho de SYCL, OpenCL, CUDA e OpenMP em diferentes plataformas de hardware para classificação massivamente paralela de máquinas de vetores de suporte. O palestrante explica a paralelização da multiplicação matriz-vetor com uma implementação chamada Parallel Fibonacci, que suporta execução multigpu, mas apenas classificação binária e cálculos densos. O hardware usado para teste inclui GPUs Nvidia A100 e RTX 380, GPU AMD Radeon Pro 7 e CPU Intel Core E9-10-09020X. Os resultados mostram que CUDA é o back-end mais rápido para GPUs Nvidia, enquanto OpenCL é o back-end mais rápido para CPUs. O SYCL é fácil de usar, enquanto o Hipsicle é mais rápido que o DPC ++ e o OpenCL para uso barato. Além disso, o palestrante discute trabalhos futuros, como investigar o desempenho em FPGAs, adicionar suporte para sistemas distribuídos via MPIs e usar cálculos de precisão mista e hardware especial de aprendizado de máquina, como os núcleos tensores da NVIDIA.

  • 00:00:00 Nesta seção do vídeo, o palestrante apresenta uma comparação de diferentes linguagens de programação paralela, incluindo SYCL, OpenCL, CUDA e OpenMP, com foco em seu uso para classificação de máquina de vetor de suporte massivamente paralela (SVM) em hardware de vários fornecedores. O palestrante apresenta a máquina de vetores de suporte e descreve seu uso no aprendizado de máquina supervisionado para classificação binária. No entanto, as máquinas convencionais de vetores de suporte têm um problema, pois resolvem um problema de programação quadrática convexa de maneira sequencial. Para resolver esse problema, o palestrante usa a formulação da máquina de vetores de suporte de mínimos quadrados, que reduz o problema à resolução de um sistema de equações lineares. O palestrante também discute os detalhes de implementação de sua biblioteca, chamada Parallel Fibonacci.

  • 00:05:00 Nesta seção, o palestrante explica a PLSS VM que é escrita em C++ moderno. Usando um único parâmetro de modelo, é possível alternar entre os tipos de ponto flutuante de precisão simples e dupla. O palestrante também fala sobre a paralelização da multiplicação matriz-vetor no algoritmo CG, pois é a parte computacionalmente mais extensa do algoritmo. Eles implementaram quatro back-ends diferentes (OpenMP, CUDA, OpenCL, Signal) e suportaram a execução multigpu. No entanto, atualmente, apenas classificação binária e cálculos densos são suportados, e eles não suportam classificação multiclasse pronta para uso. Além disso, o back-end do OpenMP diverge muito de outras implementações e, para os back-ends da GPU (CUDA, OpenCL e SYCL), eles implementaram um CG e o usam para todos os três back-ends para reduzir a duplicação de código e possíveis bugs.

  • 00:10:00 Nesta seção do vídeo são explicados o hardware utilizado e a metodologia para os testes. O foco está em quatro plataformas diferentes, ou seja, as GPUs Nvidia A100 e RTX 380, GPU AMD Radeon Pro 7 e CPU Intel Core E9-10-09020X, e os resultados para eles são discutidos. O dimensionamento de N-pontos para as GPUs Nvidia A100 e RTX 380 e o dimensionamento de pontos de dados e recursos para a GPU AMD Radeon Pro 7 são examinados, e descobriu-se que os tempos de execução aumentam de maneira semelhante com o número de pontos de dados em ambos NVIDIA GPU. Entre eles, Cuda é considerado o back-end mais rápido seguido por OpenCL, e o modelo roofline gerado com computação N-site mostrou que as formulações hierárquicas do kernel tendem a ser mais limitadas à memória do que suas contrapartes ND-range. No geral, os tempos de execução da AMD são maiores do que os da NVIDIA.

  • 00:15:00 Nesta seção, o vídeo discute a comparação de desempenho de SYCL, OpenCL, CUDA e OpenMP em diferentes plataformas de hardware. As GPUs Nvidia não apresentaram aumento de tempo de execução e o back-end mais rápido foi o OpenCL. No entanto, a GPU AMD teve desempenho pior do que o esperado, possivelmente devido aos tamanhos de bloqueio não terem sido ajustados. A CPU Intel Core E9 teve comportamento semelhante às GPUs Nvidia, com OpenCL sendo o back-end mais rápido. O DPC++ foi o mais rápido, exceto para pequenos conjuntos de dados em que o OpenMP foi mais rápido. A formulação hierárquica do kernel DPC++ foi mais lenta do que sua contraparte independente em todas as plataformas de hardware, indicando potencial para otimização. Por fim, a sobrecarga de compilação de trapaça OpenCL foi mais rápida em GPUs Nvidia e mais lenta na GPU Intel Iris Xe Max, mas com cache integrado, a sobrecarga pode ser reduzida em execuções subsequentes.

  • 00:20:00 Nesta seção da transcrição, o apresentador discute os resultados de seus testes em várias linguagens de programação paralela e estruturas para direcionar hardware de diferentes fornecedores, como NVIDIA, AMD e Intel. Eles observam que, se você precisar apenas direcionar GPUs NVIDIA, CUDA ainda é a melhor opção, pois teve o desempenho mais rápido em seus testes. Para visar apenas CPUs, o OpenMP é um bom começo, embora não tenha tido o melhor desempenho em seus testes. Se você precisar direcionar hardware de fornecedor diferente, OpenCL ou SYCL é recomendado, embora SYCL seja melhor se você estiver implementando um novo algoritmo do zero porque é mais fácil de usar. Hipsicle é a melhor opção para uso barato e mais rápido que DPC++ e OpenCL em GPUs, e eles planejam otimizar seu back-end OpenMP e investigar outras implementações de sinal como ComputeCPP no futuro.

  • 00:25:00 Nesta seção, o palestrante conclui o vídeo discutindo trabalhos futuros e melhorias na implementação da classificação de vetores de suporte usando várias estruturas de computação paralela. Eles planejam investigar o desempenho em diferentes hardwares, como FPGAs, adicionar suporte para sistemas distribuídos por meio de MPIs e explorar o impacto do uso de cálculos de precisão mista e hardware especial de aprendizado de máquina, como os núcleos tensores da NVIDIA. Eles acreditam que essas melhorias aumentarão a velocidade e a eficiência de sua implementação em conjuntos de dados maiores.
2022 Conference Program
2022 Conference Program
  • 2022.05.22
  • Tim Lewis
  • www.iwocl.org
OpenCL allows a programmer to offload a sequence of commands to a heterogeneous accelerator, such as a GPU. For embedded devices the overhead of building a command sequence can be expensive, and many applications require the same pipeline of commands to be repeatedly enqueued in a loop. For example, in computer vision where the same command...
 

Alcançando um C++ ainda mais rico em kernels OpenCL com o uso de libclcxx ( WOCL / SYCLcon 2022 )



Alcançando um C++ ainda mais rico em kernels OpenCL com o uso de libclcxx

O vídeo discute o uso de libclcxx para permitir a integração de bibliotecas C++ no desenvolvimento do kernel de código aberto. O projeto integra type traits, uma biblioteca essencial para metaprogramação em C++, com o objetivo de expor mais funcionalidades C++ aos desenvolvedores. O vídeo mostra como a biblioteca de características de tipo pode otimizar o desempenho dos kernels OpenCL por meio de sua capacidade de manipular o espaço de endereço e os tipos de vetor. O vídeo incentiva os desenvolvedores a experimentar a biblioteca e contribuir para reduzir os ciclos de desenvolvimento, obtendo a máxima compatibilidade com C++. A biblioteca fornece documentação de oxigênio em um estilo semelhante às páginas de referência C++, facilitando a navegação dos desenvolvedores pela nova funcionalidade.

  • 00:00:00 Nesta seção, Stulova de Anastasia discute o uso de lipclcxx para permitir o uso de bibliotecas C++ no desenvolvimento de kernel de código aberto. Embora a linguagem de kernel C++ para OpenCL tenha recursos de C++, ela carece de suporte de biblioteca, tornando importante abordar a limitação apresentada. Como resultado, o projeto jump clcxx foi criado, integrando lipcxcxx, com o objetivo de expor mais funcionalidades C++ para desenvolvedores de kernel de código aberto. Além disso, Tulva argumenta que typetraits são uma biblioteca essencial para facilitar totalmente a metaprogramação em C++ e estende o namespace std para fornecer especializações para traits existentes enquanto adiciona novos traits para tipo de vetor de célula aberta, entre outros. A nova biblioteca fornece documentação de oxigênio em um estilo semelhante às páginas de referência C++, tornando mais fácil para os desenvolvedores navegar pela nova funcionalidade.

  • 00:05:00 Nesta seção, o vídeo discute como o uso da biblioteca type trait pode melhorar o desempenho dos kernels OpenCL, especificamente em relação ao espaço de endereço e comércio de vetores. O vídeo fornece exemplos que demonstram como a biblioteca pode ser usada para criar uma função de modelo para diferentes tipos de ponteiro e como remover o espaço de endereço do tipo pode resolver problemas no ambiente OpenCL. Além disso, o vídeo mostra como a inclusão de negociações de tamanho de vetor pode tornar os cálculos mais eficientes e destaca como a implementação de algoritmos de redução pode ser adaptada para tipos de vetor. No geral, o uso de trocas de tipo em kernels OpenCL pode levar a uma programação C++ ainda mais rica.

  • 00:10:00 Nesta seção, o palestrante explica como definir a função de adicionar alarmes em kernels OpenCL usando o tamanho do vetor como condição. Eles esclarecem que para tamanhos de vetor diferentes, uma implementação diferente é escolhida e, se o tipo passado não for um tipo de vetor, um item do buffer será retornado. O palestrante também convida os desenvolvedores a experimentar e contribuir e obter a máxima compatibilidade com C++ para reduzir os ciclos de desenvolvimento. Eles solicitam feedback sobre recursos ou bugs ausentes e incentivam a participação em uma discussão sobre um problema existente na página do projeto.
Reaching Even Richer C++ in OpenCL Kernels with use of libclcxx
Reaching Even Richer C++ in OpenCL Kernels with use of libclcxx
  • 2022.05.22
  • www.youtube.com
Presented at: IWOCL / SYCLcon 2022.Additional Information and Slides: https://www.iwocl.org/iwocl-2022/programIWOCL NewsletterSignup to receive regular updat...
 

SYCL além do OpenCL: A arquitetura, estado atual e direção futura do hipSYCL ( IWOCL / SYCLcon 2020 )



SYCL além do OpenCL: A arquitetura, estado atual e direção futura do hipSYCL

O projeto hipSYCL é uma implementação de código aberto de SYCL que visa GPUs por meio do modelo de programação HIP em vez de OpenCL. Ele consiste em um componente compilador, interface foice e tempo de execução seguro. O compilador seguro identifica kernels, manipula a alocação de memória local e implementa um mecanismo de sinalização. A função dispatch cria itens específicos com base em kernels fornecidos pelo usuário, e funções otimizadas podem ser definidas com rock prim. A direção futura é permitir vários back-ends e remover restrições no modelo de compilação estático. O modelo de envio da operação está em transição para um envio em lote para maior rendimento da tarefa, e hipSYCL é interoperável no nível do código-fonte, permitindo misturar e combinar com hip e CUDA. Como um projeto de código aberto, os colaboradores são bem-vindos.

  • 00:00:00 Nesta seção, o palestrante discute a motivação por trás do projeto hipSYCL, que é uma implementação SYCL de código aberto voltada diretamente para GPUs por meio do modelo de programação HIP em vez de usar OpenCL. O objetivo é otimizar o código e facilitar o uso de criadores de perfil e depuradores fornecidos pelo fornecedor, evitando o atrito de adoção que pode ocorrer com outros modelos de programação. O palestrante também compara o hipSYCL com outras soluções disponíveis para interoperabilidade SYCL e CUDA, colocando o hipSYCL no final da escala de interoperabilidade CUDA devido ao uso do modelo de programação HIP.

  • 00:05:00 Nesta seção, o vídeo explica como o hipSYCL funciona e seus três componentes principais: um componente compilador, interface foice e tempo de execução seguro. O componente do compilador permite que o compilador entenda tanto CUDA quanto foice, possibilitando a interoperabilidade no nível do código-fonte. O runtime seguro cuida do gerenciamento de dados e agendamento de tarefas, enquanto a interface foice consiste em classes e funções no namespace foice. Além disso, o vídeo menciona que a foice é uma solução flexível que pode ser usada para construir implementações que cobrem todos os casos de uso possíveis. Para direcionar os aceleradores, é necessário um componente compilador dedicado, que identifica os kernels e os compila para o acelerador.

  • 00:10:00 Nesta seção do vídeo, o palestrante discute como funciona o compilador seguro no hipSYCL. Eles explicam que o compilador deve identificar os kernels e determinar qual código precisa ser emitido para o dispositivo, então lidar com como os kernels são alocados na memória local. O recurso de diagnóstico específico da doença falciforme também é mencionado como uma prioridade para desenvolvimento futuro. O palestrante explica que usar o componente do compilador seguro moderno é relativamente simples com o uso de um wrapper de compilador chamado Cycle CC, que oculta a complexidade envolvida, como invocação e vinculação do compilador corretamente e como definir caminhos de inclusão. Eles discutem como invocar kernels requer um pouco de malandragem e explicam como isso é feito. Além disso, o mecanismo de sinalização no momento usando Coroutines e eventos Hip é usado no hipSYCL para processamento dinâmico fora de ordem, mas a desvantagem disso é discutida.

  • 00:15:00 Nesta seção, o palestrante discute como a função dispatch é usada para criar um item específico com base no kernel fornecido pelo usuário e como paralelo para e seguro pode ser implementado instanciando a função dispatch com a função fornecida pelo usuário núcleo. No entanto, inicialmente, todo o código é passado como o código do host, onde o kernel fornecido pelo usuário é um host lambda e não pode ser invocado diretamente, então eles adicionam um atributo fictício chamado kernel HIP, que só será substituído por um clique adequado em o atributo assim que a análise inicial estiver concluída e o plug-in hipSYCL assumir o controle. Eles alcançam bom desempenho de memória para hipSYCL e CUDA e, usando hipSYCL, podem obter interoperabilidade entre hip e CUDA em um nível de código-fonte.

  • 00:20:00 Nesta seção, o palestrante discute como implementar uma redução otimizada usando rock prim com epsilon. Eles sugerem definir uma função otimizada com a plataforma segura macro zip cuda ou hips uma boa plataforma rockem, que é marcada como host e dispositivo. Se estiver compilando para a plataforma de destino, a função otimizada é chamada, enquanto uma função de fallback é chamada caso contrário. O palestrante explica que as bibliotecas otimizadas pelo fornecedor, como o rock prim, obtêm desempenho mais rápido porque têm mais conhecimento sobre o hardware de destino e, embora o hipSYCL ainda seja pré-conforme e falte alguns recursos, como imagens e interoperabilidade de estado aberto, ainda é utilizável para uso real -aplicações mundiais. No entanto, uma queda paralela arranjada no pacote de CPU é lenta devido a um problema com implementações de ciclo de biblioteca puro.

  • 00:25:00 Nesta seção, o palestrante discute as diferenças de desempenho usando a forma paralela básica ou a forma paralela hierárquica versus usando a forma paralela de nd range com hipSYCL em uma CPU. O último resulta em uma grande perda de desempenho porque requer o lançamento de tantas ameaças quantos itens de trabalho em cada grupo de trabalho. O palestrante então fala sobre a direção futura do hipSYCL, que é criar um novo tempo de execução que permita que back-ends arbitrários estejam ativos simultaneamente e remova as restrições em relação ao modelo de compilação estática. Eles também estão fazendo a transição para um mapeamento de ponta a ponta em que n usos cíclicos são mapeados para M filas de back-end para otimizar a utilização do hardware. Além disso, haverá uma separação estrita entre o novo tempo de execução e a interface SYCL existente para facilitar a manutenção e a experimentação.

  • 00:30:00 Nesta seção, o palestrante discute as melhorias que estão sendo feitas no modelo de envio de operação no hipSYCL. Eles estão fazendo a transição de um modelo de envio baseado em sinal para um modelo de envio em lote, no qual a sinalização para o tempo de execução de que as coisas foram concluídas ocorre apenas uma vez por lote de operações, permitindo maior rendimento da tarefa. O orador explica o processo em que as operações são submetidas e posteriormente processadas pelo construtor de baralhos, que as recolhe e encomenda. O agendador de deck atribui dicas de execução às operações, que vão para os executores de back-end para executar o kernel e determinar quais operações de sincronização são necessárias. A estimativa de custo dessa configuração volta para o planejador de deck para otimizar ainda mais ou enviar as operações como estão. O palestrante também fornece informações sobre como obter o hipSYCL por meio de seus repositórios de pacotes e scripts de instalação.

  • 00:35:00 Nesta seção, é explicado que hipSYCL é uma implementação de SICL para CPUs, GPUs de vídeo e GPUs AMD. Ele é construído com base em APIs de fornecedores de baixo nível e CUDA, o que o torna interoperável no nível do código-fonte. Isso permite que os desenvolvedores misturem e combinem com o moderno e o CUDA, tornando-o adequado para uma variedade de HPC e outros casos de uso que exigem acesso às mais recentes otimizações de hardware de baixo nível ou bibliotecas otimizadas pelo fornecedor. Além disso, permite a criação de caminhos de código altamente otimizados para hardware específico, e espera-se que o desempenho do kernel esteja no mesmo nível do hip ou CUDA regular. Como um projeto de código aberto, os colaboradores são sempre bem-vindos e os interessados podem aprender mais sobre ele na página do GitHub.
SYCL beyond OpenCL: The architecture, current state and future direction of hipSYCL
SYCL beyond OpenCL: The architecture, current state and future direction of hipSYCL
  • 2020.04.28
  • www.youtube.com
This video was presented at the online version of IWOCL / SYCLcon 2020.Authors: Aksel Alpay and Vincent Heuveline (Heidelberg University) Additional Informat...
 

SYCL: o futuro é aberto, paralelo e heterogêneo (Core C++ 2022 )



SYCL: o futuro é aberto, paralelo e heterogêneo

Neste vídeo sobre programação SYCL, o palestrante destaca a necessidade de subir o nível de abstração para aumentar a produtividade e atrair mais desenvolvedores, já que modelos complexos exigem maior poder computacional, o que é atendido por sistemas aceleradores. A importância da portabilidade de software e OneAPI é enfatizada, pois permite que os dispositivos funcionem em CPUs, GPUs e outros dispositivos. Os benefícios do SYCL, um modelo de programação aberto, paralelo e heterogêneo, também são discutidos, com o palestrante destacando os inúmeros recursos e ferramentas online disponíveis para otimizar o código e melhorar o desempenho. O palestrante incentiva os espectadores a visitar oneapi.io e seu canal no YouTube para obter recursos e suporte.

  • 00:00:00 Nesta seção, o palestrante discute a necessidade de subir o nível de abstração para aumentar a produtividade e atrair mais desenvolvedores. À medida que os modelos se tornam mais complexos, a demanda por poder de computação aumenta rapidamente. O palestrante menciona o gap ninja, que se refere à dificuldade de encontrar e contratar especialistas de nível inferior, como desenvolvedores de montagem ou Cuda. Subir o nível de abstração leva à perda de desempenho, e é por isso que os aceleradores de IA, como GPUs e GAUDI, são necessários para atender à crescente demanda por poder computacional.

  • 00:05:00 Nesta seção, o palestrante discute a necessidade de aceleradores para obter o desempenho mais rápido, mas observa que um acelerador não é suficiente para cobrir toda a gama de aplicações. São necessários sistemas heterogêneos, combinando CPUs e aceleradores, como aceleradores e CPUs do tipo ASIC. O palestrante enfatiza a importância da portabilidade de software e a capacidade do código rodar em qualquer máquina ou dispositivo, independente do hardware utilizado, sem a necessidade de recodificar, recompilar ou recompilar para cada plataforma ou sistema operacional. OneAPI é um esforço da indústria para simplificar as pilhas de software, unificando bibliotecas e ferramentas para garantir a portabilidade de software aberta, gratuita e entre dispositivos, o que significa que as pilhas de software podem funcionar em CPUs, GPUs e outros dispositivos. O OneAPI oferece um kit de ferramentas básico com tudo o que você precisa para começar.

  • 00:10:00 Nesta seção, o palestrante discute o poder de usar o kit de ferramentas baseado em OneAPI e o conceito do compilador Data Policy++, projetado para adicionar heterogeneidade às bibliotecas C++. Ao usar políticas predefinidas, você pode acessar facilmente a CPU ou GPU sem precisar saber muito sobre detalhes de nível inferior sobre OpenCL ou CUDA. O compilador fornece a capacidade de controlar e separar as memórias que estão por toda parte, lidar com códigos de exceção e criar computação paralela.

  • 00:15:00 Nesta seção do vídeo, o palestrante explica que, para ter bons recursos de computação heterogênea, três coisas são necessárias. A primeira é a capacidade de descobrir o dispositivo e obter informações sobre ele. É aqui que o alto-falante mostra um código simples que detecta e lista todos os dispositivos conectados ao sistema. O segundo requisito é a informação sobre o estado dos dispositivos em tempo real, o que permite a utilização e monitoramento de temperatura, além de permitir que os usuários alternem entre a CPU e a GPU. O terceiro requisito é a capacidade de trocar memória de forma eficiente e contínua entre o dispositivo e o host, o que é obtido por meio de duas maneiras principais no SYCL – buffers e memória de gráfico unificada.

  • 00:20:00 Nesta seção, o palestrante explica os benefícios do uso do SYCL, um modelo de programação aberto, paralelo e heterogêneo. Ao adicionar SYCL ao C++, pode-se escrever código que pode ser executado em vários dispositivos, incluindo GPUs, CPUs, ARM e FPGAs. O palestrante menciona que existem vários recursos online e exemplos de como fazer o SYCL funcionar com vários dispositivos. O Intel Advisor é uma ferramenta recomendada pelo palestrante, que pode ajudar a otimizar o código e oferece a opção de descarregar funções específicas para uma GPU. O palestrante destaca a importância do uso dessa ferramenta, que pode tornar a execução do código muito mais rápida e melhorar o desempenho geral do programa.

  • 00:25:00 Nesta seção, o palestrante promove o uso do SYCL como a maneira mais rápida de disponibilizar código em vários dispositivos por vários fornecedores e incentiva os espectadores a visitar o site oneapi.io e seu canal no YouTube para obter recursos e suporte. Ele também menciona a possibilidade do SYCL ser mais rápido que o CUDA em alguns exemplos, mas destaca a principal vantagem do SYCL sendo sua portabilidade, pois permite codificar para uma única plataforma que pode então rodar em vários dispositivos, liberando a necessidade de fazer múltiplos decisões de codificação para diferentes dispositivos. Além disso, o palestrante se oferece para responder a quaisquer perguntas e fornecer recursos, como notebooks Jupyter e acesso ao Intel Devcloud, para ajudar os usuários a começar a usar o SYCL.
Core C++ 2023
Core C++ 2023
  • Oleh Zasadnyy, GDG Lviv
  • corecpp.org
Core C++ 2023
 

Aceleração de GPU em Python



Aceleração de GPU em Python

O vídeo explica como obter aceleração de GPU na programação Python, aproveitando o poder das unidades de processamento gráfico, que podem fornecer uma aceleração de até 10x com paralelismo de dados. Os dois padrões para computação de GPU, OpenCL e CUDA, são brevemente apresentados, e o vídeo demonstra o uso de Pi OpenCL e CUDA para multiplicação de matrizes em Python. O palestrante explica o uso da memória global e do kernel para multiplicação de matrizes e também discute o algoritmo usado para computar um elemento no produto matriz-matriz. O código para aceleração de GPU em C e Python é discutido, com ênfase na compreensão de representações internas de matrizes e alocação de memória. Os exercícios da palestra fornecem uma base para uma exploração mais aprofundada da computação GPU.

  • 00:00:00 Nesta seção, o vídeo apresenta a computação de GPU como uma forma de obter paralelismo de dados e acelerar programas aproveitando o poder das unidades de processamento gráfico, que podem processar bilhões de operações de ponto flutuante por segundo e fornecer uma aceleração de um fator de 10. Os dois padrões para computação de GPU, OpenCL e CUDA, são brevemente apresentados, com exemplos de GPUs de ponta, como Kepler, Pascal e Volta da Nvidia. O aspecto massivamente paralelo da computação GPU é enfatizado como uma forma de manter a GPU ocupada, com o escalonamento de muitos threads frequentemente necessários. O vídeo também menciona as possíveis aplicações de aceleradores de hardware nas áreas científica e de engenharia.

  • 00:05:00 Nesta seção do vídeo, o palestrante discute a evolução da aceleração de GPU, desde o Kepler que teve um desempenho máximo de um teraflop até a geração atual que ultrapassa 7,9 teraflops. O modelo de programação da computação massivamente paralela segue uma abordagem de dados múltiplos de instrução única e os dados são divididos em blocos de threads e cada bloco executa pelo menos um thread. O palestrante aborda a linguagem de computação aberta, que é um padrão aberto para programação paralela e abrange a computação multicore e multithread, além da computação GPU.

  • 00:10:00 Nesta seção, o palestrante discute o uso de OpenCL e Pi OpenCL para aceleração de GPU em Python. OpenCL é um padrão geral originalmente suportado em placas gráficas NVIDIA, mas foi abandonado. No entanto, funciona bem em MacBooks, pois foi iniciado pela Apple. O Pi OpenCL simplifica a programação OpenCL reduzindo o código clichê e permitindo um foco mais fácil no kernel. Ele também suporta arrays NumPy, mas as estruturas de dados são mais limitadas devido ao paralelismo de dados. O palestrante demonstra o uso do Pi OpenCL para multiplicação de matrizes em duas matrizes inteiras para fins de teste.

  • 00:15:00 Nesta seção, o palestrante explica como GPUs podem ser usadas para multiplicação de matrizes em Python usando OpenCL. Eles começam importando as bibliotecas necessárias, incluindo OpenCL e NumPy. O palestrante também observa que a placa gráfica usada não suportava aritmética de 64 bits, então eles optaram pela aritmética de ponto flutuante de 32 bits. Eles então definem as matrizes, geram números inteiros aleatórios e mudam seu tipo para uma matriz de fluxo de 32 bits. O palestrante então explica o código clichê necessário para definir as contrapartes das matrizes no dispositivo e criar filas. Por fim, o palestrante define o kernel para multiplicação de matrizes, que é compilado quando o programa é executado, e demonstra como multiplicar matrizes na GPU.

  • 00:20:00 Nesta seção, o palestrante explica o conceito de "global" no contexto da aceleração de GPU na programação Python. Global indica que as matrizes residem na memória global da placa gráfica, fornecendo a cada thread acesso aos dados. As dimensões são passadas como inteiros curtos, com cada thread tendo um número de identificação exclusivo. O processo de multiplicação de matrizes se beneficia da aceleração da GPU, pois quase todas as partes podem ser feitas independentemente por meio da indexação de linhas e colunas da matriz. As matrizes são armazenadas em C, como uma longa matriz, e os ponteiros determinam suas localizações na memória.

  • 00:25:00 Nesta seção, o palestrante explica o algoritmo em C para calcular um elemento no produto matriz-matriz e o possível ganho de velocidade para a multiplicação matriz-matriz, que geralmente é uma operação cúbica nas dimensões das matrizes. No entanto, com o uso de GPUs e lançamentos de kernel, a operação pode ser simplificada para uma operação linear, levando a uma redução massiva de custos e resultando em ganhos de velocidade significativos. O palestrante também menciona que, embora a forma mais simples de realizar a operação seja por meio do Python e sem a necessidade de compilar explicitamente, os próprios algoritmos usados nos supercomputadores fazem uso de memórias compartilhadas nas GPUs e um processo de compilação que vai além do que é discutido no vídeo. O palestrante enfatiza a ideia de que o PiCUDA e o PiOpenCL permitem que os programadores desenvolvam código em um nível superior, sem ter que se preocupar com os processos de compilação e vinculação de nível inferior.

  • 00:30:00 Nesta seção, o vídeo fala sobre a instalação do CUDA para aceleração de GPU em Python. Para usar o CUDA, o usuário deve ter uma GPU NVIDIA e drivers instalados. A palestra percorre as instruções para verificar se o sistema está configurado corretamente, e o apresentador observa que a técnica é uma computação paralela altamente interativa. O palestrante explica que é possível obter um bom desempenho de um laptop de última geração com uma boa placa de vídeo. O curso então mostra a multiplicação de matrizes como um exemplo. O apresentador observa que normalmente é preciso ter um programa rodando na CPU, e a GPU acelera apenas as partes que são computacionalmente intensivas. Por fim, a palestra discute a alocação de memória para as matrizes correspondentes na GPU e a inicialização das matrizes resultantes, afirmando que as alocações com NumPy são melhores do que seriam com C. Além disso, não há necessidade de compilação neste estágio.

  • 00:35:00 Nesta seção, o código para aceleração de GPU em C é discutido. As matrizes em C são armazenadas de maneira sequencial, e o código explora esse fato. A sintaxe para lançar blocos de threads em uma estrutura bidimensional é usada para calcular explicitamente os threads. Um loop com colchetes explícitos é usado para evitar aritmética de ponteiro. A função assume as dimensões e ponteiros para os dados, que incluem as matrizes A e B para a entrada e a matriz de resultado C_gpu. A cópia da memória para o dispositivo deve terminar antes da impressão, e a cópia da memória do dispositivo para o host deve ser feita antes da impressão dos dados porque a impressão dentro das funções dentro das funções do kernel executadas pela GPU pode não ser possível. Por fim, a discussão termina afirmando que pyCUDA é mais recente que piOpenCL e PyCUDA.

  • 00:40:00 Nesta seção, o palestrante discute a aceleração de GPU em Python, que é voltada para CUDA, mas também tem esforços em andamento para rodar em outras GPUs. Ele cuida tanto da compilação quanto da execução, tornando as execuções subsequentes muito mais rápidas. É possível desenvolver núcleos de GPU em Python enquanto permanece no ambiente de script; no entanto, é preciso entender como as GPUs funcionam e como as matrizes são representadas internamente usando a sintaxe C. Os exercícios da palestra são abertos e podem fornecer uma base para um segundo projeto explorando a computação GPU. No geral, esta foi uma seção introdutória que teve como objetivo dar uma ideia de como programadores e desenvolvedores de software podem desenvolver funções que rodam na GPU.
GPU acceleration in Python
GPU acceleration in Python
  • 2022.02.10
  • www.youtube.com
This lecture introduces PyOpenCL and PyCUDA to define and run functions on General Purpose Graphics Processing Units (GPUs). The running example is a basic ...
 

Apresentação de lançamento do OpenCL 3.0 (IWOCL / SYCLcon 2020)



Apresentação de lançamento do OpenCL 3.0

O lançamento do OpenCL 3.0 é discutido neste vídeo, com foco em sua importância para a programação paralela de baixo nível na indústria. O OpenCL 3.0 não adiciona novas funcionalidades à API, mas fornece um realinhamento do ecossistema para permitir que o OpenCL alcance mais desenvolvedores e dispositivos. O apresentador também discute a adição de extensões para processadores leves DSP, o roteiro para funcionalidade futura e o crescente ecossistema de compiladores de linguagem de kernel de código aberto que podem gerar kernels espirituais para OpenCL Vulcan. O feedback dos usuários é encorajado para ajudar a finalizar a especificação enquanto o grupo de trabalho se prepara para a primeira onda de implementações nos próximos meses.

  • 00:00:00 Nesta seção, Neil Travis da NVIDIA e o grupo Khronos discutem o lançamento do OpenCL 3.0 e a importância do padrão para programação paralela de baixo nível na indústria. O OpenCL é amplamente usado por fornecedores de GPU e cada vez mais usado por aplicativos, mecanismos e bibliotecas. O lançamento do OpenCL 3.0 fornece um realinhamento do ecossistema em vez de adicionar novas funcionalidades à API com a intenção de permitir que o OpenCL alcance ainda mais desenvolvedores e dispositivos. O OpenCL 3.0 torna toda a funcionalidade 2x além do ponto opcional, permitindo que os fornecedores se concentrem no envio da funcionalidade de que precisam para seus clientes e redefine a oportunidade de elevar o nível da funcionalidade principal.

  • 00:05:00 Nesta seção, é explicado que o OpenCL 3.0 é uma nova especificação que vem com uma API unificada projetada para consultar todas as funcionalidades do OpenCL 2.x com extensões adicionadas para processadores leves DSP para transferir dados 2D e 3D entre global e memórias locais de forma flexível e assíncrona por meio de transações DMA (Direct Memory Access). Embora o OpenCL 3.0 não inclua a especificação OpenCL C++, outras implementações são encorajadas a usar o compilador front-end de código aberto C++ for OpenCL para gerar kernels Spir-V misturando o OpenCL C com grande parte do C++17. O roteiro para o OpenCL inclui o envio de novas funcionalidades como extensões primeiro para adoção na indústria, permitindo que elas amadureçam e sejam comprovadas antes de dobrá-las em futuras especificações básicas. O grupo de trabalho OpenCL também vê os perfis como uma ferramenta vital para equilibrar a flexibilidade de implementação com a portabilidade do aplicativo e evitar a fragmentação para os mercados-alvo.

  • 00:10:00 Nesta seção, o apresentador discute o crescente ecossistema de compiladores de linguagem de kernel de código aberto, que inclui clang e lvm, que podem gerar kernels de espírito para OpenCL Vulcan ou para posterior tradução em shaders para executar em outras APIs, como como metal. Isso permitiria aplicativos OpenCL em plataformas Apple sem a necessidade de usar drivers OpenCL. O apresentador também menciona o projeto OpenCL 12, que traduz os kernels spirit gerados por LLVM usando um pipeline de conversão de código aberto para DXi L, permitindo que os compiladores de linguagem inovem independentemente dos tempos de execução. A especificação do OpenCL 3 é provisória e o feedback dos usuários é encorajado para ajudar a finalizar a especificação enquanto o grupo de trabalho se prepara para a primeira onda de implementações nos próximos meses.
OpenCL 3.0 Launch Presentation
OpenCL 3.0 Launch Presentation
  • 2020.05.07
  • www.youtube.com
This video was presented as part of the panel discussion at the online version of IWOCL / SYCLcon 2020, and was presented by Neil Trevett, Khronos Group Pres...