OpenCL na negociação - página 6

 

16. Exemplo OpenCL: Rotação de Imagem



16. Exemplo OpenCL: Rotação de Imagem

Este vídeo discute a rotação da imagem e como ela pode ser implementada usando o OpenCL. Cada pixel em uma imagem tem coordenadas e representa uma escala de cores específica, e a rotação envolve mover os pixels para um novo local com base em uma fórmula que leva em consideração suas coordenadas originais e novas e o ângulo de rotação. O palestrante propõe atribuir cada item de trabalho para calcular a nova posição de um único pixel e usar a decomposição de entrada para dividir todo o espaço de trabalho global em grupos de trabalho menores, tornando a operação mais eficiente. O processo de transferência de uma imagem do buffer no dispositivo para o buffer no host também é explicado, com ênfase na verificação de erros e no cálculo do tempo decorrido.

  • 00:00:00 Nesta seção, o vídeo discute a rotação da imagem e a matemática por trás dela. Ele explica que cada pixel em uma imagem possui coordenadas e representa uma escala de cores específica. A rotação envolve mover os pixels para um novo local com base em uma fórmula que leva em consideração suas coordenadas originais e novas e o ângulo de rotação. O vídeo propõe a atribuição de cada item de trabalho para calcular a nova posição de um único pixel e usa decomposição de entrada para dividir todo o espaço de trabalho global em grupos de trabalho menores, tornando a operação mais eficiente.

  • 00:05:00 Nesta seção, o palestrante explica como a imagem é dividida em grupos de trabalho no OpenCL para implementar a rotação da imagem. A imagem é dividida em domínios horizontal e vertical, cada um com 16 grupos de trabalho assumindo que a largura e a altura da imagem são múltiplos de 16. O orador então introduz a função kernel usada para executar a rotação da imagem, que leva em argumentos como o original e dados de destino, dimensões da imagem e parâmetros de rotação. Dentro da função kernel, o alto-falante ilustra como a nova localização de cada pixel é calculada usando os parâmetros de rotação e como o conteúdo do pixel é copiado da localização original para a nova localização após a verificação de limites.

  • 00:10:00 Nesta seção, o palestrante explica como girar uma imagem usando o OpenCL. O processo envolve verificar as coordenadas e garantir que sejam valores positivos dentro das dimensões da imagem. As informações de pixel são então copiadas do local original para o novo local usando cálculos para determinar o local da memória física. O código de exemplo listado nesta seção mostra as diferenças entre esta implementação e a anterior de multiplicação de matrizes. A ligação C++ para a API OpenCL é usada para configurar o ambiente para consultar as plataformas, adquirir o dispositivo, criar uma fila de comandos e declarar buffers para mover dados. O kernel é compilado e os parâmetros são definidos para executar o kernel, que é concluído lendo os resultados de volta para o host.

  • 00:15:00 Nesta seção, o palestrante discute o processo de transferência de uma imagem do buffer no dispositivo para o buffer no host. O palestrante explica que esse processo envolve a leitura do buffer no dispositivo usando a função clEnqueueReadBuffer e a especificação do tamanho, deslocamento e ponteiro para o buffer no host. Além disso, o palestrante observa a importância de verificar erros durante esse processo usando uma instrução if e demonstra como calcular o tempo decorrido para essa parte do código usando a função clGetEventProfilingInfo.
OpenCL Example: Image Rotation
OpenCL Example: Image Rotation
  • 2020.06.05
  • www.youtube.com
This video explains the math behind the image rotation and the code implementation.
 

17. Demonstração de rotação de imagem de exemplo OpenCL



17. Demonstração de rotação de imagem de exemplo OpenCL

O tutorial "Exemplo OpenCL de demonstração de rotação de imagem" abrange o código-fonte da demonstração, que inclui diferentes pastas contendo código C e arquivos de imagem que o programa processará. O vídeo mostra a criação de buffers para imagens de entrada e saída, copiando a imagem original para o buffer do dispositivo, configurando os argumentos do kernel, executando o kernel com um tamanho global definido como a imagem inteira e lendo os dados de saída de volta para o host. A função kernel usa parâmetros de rotação para calcular as novas coordenadas de cada pixel e copiar as informações do pixel para o novo local com verificação de limite. O programa também inclui uma função para armazenar a imagem girada no formato BMP e liberar todos os recursos após a conclusão. A demonstração lê e calcula com êxito os pixels da imagem original para criar a imagem girada.

  • 00:00:00 Nesta seção, o apresentador dá uma visão geral do código-fonte para a demonstração de rotação de imagem que inclui diferentes pastas contendo os arquivos de código C principais e de suporte, bem como os arquivos de imagem que o programa processará. O código inclui arquivos de cabeçalho para plataformas Mac OS e Altera OpenCL, definições para buffers e parâmetros de kernel e utiliza funções de suporte para abrir arquivos de imagem e converter seus formatos. O código também inclui a criação do buffer de saída e a inicialização com números aleatórios. Por fim, o código cria uma fila de comandos, um objeto de programa e um objeto de kernel e especifica o nome da função do kernel.

  • 00:05:00 Nesta seção, o palestrante percorre o processo de criação de buffers para imagens de entrada e saída, copiando a imagem original para o buffer do dispositivo, configurando argumentos do kernel, executando o kernel com um tamanho global definido como a imagem inteira, e lendo os dados de saída de volta para o host. A função do kernel leva em conta os ponteiros do buffer de destino e de origem, as dimensões da imagem e os parâmetros de rotação para calcular as novas coordenadas de cada pixel e copiar as informações do pixel para o novo local com verificação de limites. O programa também inclui uma função para armazenar a imagem girada no formato BMP e liberar todos os recursos após a conclusão.

  • 00:10:00 Nesta seção, o palestrante demonstra um exemplo de demonstração de rotação de imagem OpenCL usando a plataforma Avatar FPGA que pega a imagem original de um gato e a gira no sentido horário em 45 graus, produzindo uma nova imagem do mesmo tamanho que é salva com um novo nome na pasta de rotação da imagem. A demonstração mostra que ele lê e calcula com êxito os pixels da imagem original para criar a imagem girada.
OpenCL Example Image Rotation Demo
OpenCL Example Image Rotation Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Image Rotation and demonstrates the results.
 

18. Exemplo OpenCL: Convolução de Imagem



18. Exemplo OpenCL: Convolução de Imagem

O vídeo "OpenCL Example: Image Convolution" explica a convolução de imagem, que modifica cada pixel em uma imagem usando informações de seus pixels vizinhos aplicando um filtro como um filtro de desfoque. O vídeo fornece uma implementação inicial da função de convolução de imagem e apresenta a estrutura de dados de "imagem" em OpenCL, que é projetada para tipos de dados de imagem, permitindo um processamento eficiente em processadores gráficos. O vídeo mostra como copiar dados de imagem e filtro para o dispositivo para trabalho de convolução de imagem usando OpenCL e o uso do objeto de amostra OpenCL para acessar a imagem. O vídeo também demonstra como obter o item de trabalho e iterar pelas linhas e colunas do filtro para obter informações de pixel do objeto de imagem, multiplicá-los com os pixels do filtro e acumulá-los na variável de soma. Por fim, o vídeo mostra como atualizar os valores de pixel usando um objeto de imagem OpenCL.

  • 00:00:00 Nesta seção, o vídeo aborda a convolução da imagem, que é uma operação que modifica o valor de cada pixel em uma imagem usando informações de seus pixels vizinhos. Isso é feito aplicando um filtro à imagem original, como um filtro de desfoque, que usa uma média ponderada dos pixels vizinhos para reduzir as diferenças entre seus valores. O vídeo demonstra como aplicar um filtro 3x3 a uma pequena região de uma imagem e usar multiplicação e soma de elementos para calcular o valor de cada novo pixel na imagem filtrada. No entanto, o vídeo observa que, ao aplicar essas operações de filtragem a uma imagem inteira, deve-se levar em consideração os pixels de limite que não possuem todos os oito pixels vizinhos. O vídeo também mostra vários exemplos de filtros, como desfoque e detecção de bordas, que podem ser aplicados a uma imagem para obter diferentes efeitos.

  • 00:05:00 Nesta seção do vídeo "OpenCL Example: Image Convolution", o palestrante fornece uma implementação inicial da função de convolução de imagem que passa por cada pixel de uma imagem e aplica um filtro a ela. Eles também introduzem uma nova estrutura de dados em OpenCL chamada "imagem", que é projetada especificamente para tipos de dados de imagem, permitindo longas sequências de instruções que podem ser processadas com mais eficiência em processadores gráficos. Os objetos de imagem podem ser criados com formatos, dimensões e outros parâmetros especificados. O vídeo demonstra como criar um buffer de imagem 2D no lado do dispositivo.

  • A seção 00:10:00 discute o processo de cópia de dados de imagem e filtro para o dispositivo para trabalho de convolução de imagem usando OpenCL. A seção também apresenta o objeto amostrador OpenCL que é usado para descrever como acessar uma imagem. O modo de endereçamento, o modo de filtragem e o uso de coordenadas normalizadas são especificados para o objeto amostrador. A seção também mostra a função do kernel e o uso das palavras-chave "somente leitura" e "constante" para especificar as propriedades do objeto, o que permite que o tempo de execução do OpenCL coloque os objetos de filtro na região constante específica na memória global.

  • 00:15:00 Nesta seção do exemplo de convolução de imagem OpenCL, o locutor passa pelas etapas de obtenção do item de trabalho usando get_global_id, calculando a meia largura do filtro, inicializando o índice do filtro, iterando pelas linhas e colunas do filtro , e usando a função read_image para obter as informações de pixel do objeto de imagem. A informação do pixel é então multiplicada com o pixel no filtro e acumulada na variável soma. Este processo é repetido para cada pixel no filtro e permite o uso de informações de pixels vizinhos na convolução da imagem.

  • 00:20:00 Nesta seção, o tutorial em vídeo demonstra como atualizar valores de pixel em uma convolução de imagem OpenCL usando um objeto de imagem. Depois de executar o kernel com sucesso, a próxima etapa é usar CL em Q read image para ler a imagem de volta. Essa função recebe o comando Q como primeiro argumento, o objeto de imagem de saída e um valor verdadeiro para indicar que a leitura deve ser bloqueada até a conclusão. Os parâmetros de origem e região usados para criar o objeto de imagem são fornecidos, junto com o buffer no lado do host onde os dados de imagem são armazenados.
OpenCL Example: Image Convolution
OpenCL Example: Image Convolution
  • 2020.06.07
  • www.youtube.com
This video introduces the principles of image convolution and how to implement it in OpenCL.
 

19. Demonstração: Exemplo de OpenCL - Convolução de imagem



19. Demonstração: Exemplo de OpenCL - Convolução de imagem

O vídeo explica um exemplo de convolução de imagem OpenCL, definindo diferentes filtros, como desfoque, nitidez, nitidez de borda, detecção e filtro de abraço. O apresentador demonstra a inicialização dos valores de filtro e a leitura de dados de imagem BMP do arquivo, criando objetos de imagem de entrada e saída e configurando argumentos do kernel para executar o kernel. O vídeo também ensina a criar o sampler, definir como processar pixels fora do limite, iniciar o kernel, armazenar os dados do pixel em um arquivo e criar os cabeçalhos necessários para o formato BMP. Por fim, verificando os resultados comparando os valores em dois buffers para criar uma imagem filtrada que deve corresponder ao resultado dourado com apenas um ligeiro desvio devido à computação flutuante.

  • 00:00:00 Nesta seção do vídeo, o apresentador percorre o código de um exemplo de convolução de imagem OpenCL. O código define diferentes filtros, incluindo desfoque, nitidez, nitidez de borda, detecção e filtro de abrangência. O apresentador demonstra como testar um filtro específico, neste caso, o filtro de detecção de borda. Eles também explicam como inicializar os valores do filtro e ler os dados da imagem BMP do arquivo, criar os objetos de imagem de entrada e saída e configurar os argumentos do kernel para executar o kernel. O vídeo também aborda como criar o amostrador e definir como processar os pixels que ficam fora do limite.

  • 00:05:00 Nesta seção, o apresentador demonstra um exemplo de convolução de imagem usando OpenCL. A apresentação mostra as etapas necessárias para executar o filtro no host, incluindo iniciar o kernel, armazenar os dados do pixel em um arquivo e criar os cabeçalhos necessários para o formato BMP e verificar os resultados comparando os valores em dois buffers. O objetivo deste exercício é criar uma imagem filtrada que corresponda ao resultado dourado com apenas um ligeiro desvio devido ao cálculo flutuante. No geral, a apresentação enfatiza como compilar, executar e verificar a saída da função do kernel OpenCL.
 

20. Aula 5 Modelo de Concorrência OpenCL



20. Aula 5 Modelo de Concorrência OpenCL

Esta palestra aborda o tempo de execução OpenCL e o modelo de simultaneidade, incluindo várias filas de comandos, modelo de enfileiramento, itens de trabalho de kernels OpenCL e grupos de trabalho. Os pontos de sincronização são usados para gerenciar a execução de comandos e os eventos de espera são usados para sincronizar os comandos em uma fila de comandos do lado do dispositivo. A palestra enfatiza a importância das operações assíncronas no OpenCL e explica o uso de eventos para especificar dependências entre comandos. O palestrante também discute o uso de funções de retorno de chamada para conclusão de eventos e destaca a importância da criação de perfil para ajuste de desempenho. Além disso, a palestra aborda o modelo de simultaneidade OpenCL para vários dispositivos em um sistema, incluindo o pipeline e os modelos de execução paralela. Por fim, o palestrante demonstra a implementação de um modelo de execução usando eventos de kernel, que permite a execução paralela de diferentes kernels.

O modelo de simultaneidade OpenCL permite que vários itens de trabalho sejam executados independentemente para melhorar o desempenho, usando grupos de trabalho com sincronização local para obter paralelismo na execução, mas muitos itens de trabalho podem causar contenção de recursos. Os itens de trabalho são responsáveis por manter seus próprios contadores de programa, e compreender as dimensões e tamanhos do problema é importante para projetar itens de trabalho que aproveitem os elementos de processamento da GPU. OpenCL usa barreiras de grupo de trabalho para sincronização avançada entre itens de trabalho, mas nenhum mecanismo suporta sincronização entre itens de trabalho em diferentes grupos de trabalho da mesma execução do kernel. Para sincronizar itens de trabalho dentro do mesmo grupo de trabalho, a API de barreira é usada, mas para sincronização em escala global, eventos e eventos de espera são usados. A função kernel usa ponteiros para objetos de memória nas memórias global e local, e a memória local acessível a todos os elementos de processamento pode ser usada para compartilhamento de dados dentro do grupo de trabalho. A palestra também aborda kernels nativos, que permitem usar funções C como kernels em um dispositivo sem depender de compiladores OpenCL, passar objetos de memória OpenCL para uma função de usuário usando a API nativa do kernel na fila e funções internas do kernel, como o extensão de estimativa de movimento para OpenCL, usada para processamento de imagem para estimar movimento entre quadros vizinhos em um vídeo.

  • 00:00:00 Nesta seção, aprendemos sobre o tempo de execução OpenCL e o modelo de simultaneidade, incluindo comandos OpenCL, modelo de enfileiramento, várias filas de comandos, itens de trabalho de kernels OpenCL e grupos de trabalho. O OpenCL é um modelo controlado por host paralelo de tarefas e os kernels são usados para executar tarefas paralelas. As filas de comando são thread-safe, pois vários threads de software podem estar em execução em um host e podem ou não operar na mesma fila de comando. As operações assíncronas são importantes no OpenCL, e a movimentação de dados e outras operações são executadas na fila em algum momento no futuro. A menor unidade que os hosts interagem com o dispositivo é o comando, e a conclusão de um comando é garantida apenas em um ponto de sincronização da fila de comandos. Essa sincronização ocorre entre comandos em uma fila de concessão de host e entre comandos em uma fila de comandos do lado do dispositivo.

  • 00:05:00 Nesta seção, a palestra se concentra no argumento de bloqueio de leitura no QAPI e como ele pode ser usado para configurar um ponto de sincronização. Definindo a leitura de bloqueio como true, essa API pode ser transformada em uma operação de leitura de bloqueio, que interromperá outras operações de memória até que a operação de leitura seja concluída. A palestra também explica o uso de eventos em QAPI para especificar dependências entre comandos, o que pode ser útil em operações complexas envolvendo vários comandos, transferências de dados e cálculos. Além disso, os eventos podem fornecer mais informações sobre um comando do que o próprio comando, pois os comandos enviados usando Co na fila são tratados de forma assíncrona e não podem retornar condições de erro ou dados de criação de perfil. No entanto, ao gerar um evento associado a um comando, as informações sobre o comando podem ser consultadas usando a API CL get event info.

  • 00:10:00 Nesta seção, o modelo de concorrência OpenCL é discutido, particularmente o uso de pontos de sincronização para gerenciar a execução de comandos. Uma maneira de sincronizar é o uso de eventos de espera, onde o host pode bloquear até que um evento específico aconteça, enquanto a API da fila possui vários eventos de espera para sincronização entre comandos. Já a operação de barreira é um comando especial utilizado para filas fora de ordem, onde se torna um ponto de sincronização. Os marcadores têm uma finalidade semelhante, mas não bloqueiam a execução, servindo como um evento de entrada implícito, com eventos de saída para notificar o status de conclusão dos comandos anteriores. Outras informações sobre um comando, como suas condições de erro, podem ser consultadas usando a API CIL get event info.

  • 00:15:00 Nesta seção, o palestrante discute as APIs de comando e evento do OpenCL, que são usadas para controlar o fluxo de dados entre o host e o dispositivo. Ele explica que a API de comando permite que os usuários enviem comandos para a fila de comandos, que pode executar várias operações, como execuções de kernel, leituras e gravações de buffer e mapeamentos de memória. Usando a API de evento, os usuários podem consultar o status de execução do comando enviado e aplicar a criação de perfil dentro do contexto. O palestrante também fala sobre a função callback de evento, que é acionada quando ocorre o status específico de execução de um comando em uma fila. A função de retorno de chamada pode ser usada para executar tarefas simples e fornecer dados de saída para o aplicativo OpenCL aproveitar. O palestrante enfatiza que a função de retorno de chamada deve ser concluída o mais rápido possível e não deve ser uma função de bloqueio.

  • 00:20:00 Nesta seção, o palestrante discute a configuração de funções de retorno de chamada para lidar com a conclusão do evento. Definir a função de retorno de chamada logo após declarar um evento de conclusão não é um local válido, pois ainda não há nenhum comando associado ao evento. Um evento válido só é criado depois que um comando é associado a ele, como quando um kernel é adicionado à fila de comandos. As funções de retorno de chamada devem ser thread-safe, rápidas de serem concluídas e não chamar rotinas de sistema caras. Também é importante habilitar a criação de perfil quando se trata de ajuste de desempenho, pois ajuda a determinar o status e o tempo de execução de um comando. O sinalizador clq profiling enable é usado para habilitar a criação de perfil.

  • 00:25:00 Nesta seção, o palestrante discute a API de criação de perfil OpenCL, que permite aos usuários obter informações sobre eventos na fila. Ao habilitar a criação de perfil, uma sugestão pode fornecer informações como horários de início e término para comandos, que podem ser usados para calcular o tempo de execução. O palestrante também explica os eventos do usuário, que não estão associados a um comando específico e podem ser usados de forma arbitrária. Ao criar um evento de usuário e ter um comando de leitura esperando por ele, a operação de leitura será bloqueada até que o evento de usuário seja concluído, permitindo um controle mais específico sobre a ordem dos comandos.

  • 00:30:00 Nesta seção, o palestrante explica como controlar a ordem de execução dos comandos e como obter melhor desempenho usando uma fila fora de ordem. Por padrão, os comandos em uma fila de comandos são executados em ordem, mas para obter flexibilidade e melhor desempenho, uma fila fora de ordem pode ser usada. O palestrante demonstra um exemplo concreto de configuração de uma fila fora de ordem com vários eventos e objetos de buffer. O exemplo inclui uma operação de gravação e uma operação de leitura com buffers sem bloqueio, somente gravação e somente leitura. Os eventos do usuário e o status do evento também são discutidos. No geral, a seção fornece uma compreensão abrangente para criar uma fila fora de ordem e otimizar a ordem de execução dos comandos para melhor desempenho.

  • 00:35:00 Nesta seção, o palestrante explica como copiar números de ponto flutuante do buffer de entrada do host para o buffer de memória do dispositivo usando a API OpenCL. O código inclui configurar a dimensão da unidade de execução, iniciar duas funções do kernel e aguardar os eventos de conclusão. A palestra também enfatiza que as duas funções do kernel são comandos separados e mostra como ler os dados de saída no lado do host, aguardar eventos e executar a limpeza. No geral, a seção demonstra o uso de quatro comandos OpenCL para copiar e processar dados entre um host e um dispositivo.

  • 00:40:00 Nesta seção, vemos como as filas de comandos e eventos controlam a execução de comandos OpenCL. Ao configurar dependências usando eventos, podemos garantir que os comandos sejam executados em uma ordem específica. Porém, se trocarmos a ordem dos comandos em uma fila fora de ordem, isso não afetará a execução dos comandos. Mas, se usarmos uma fila em ordem e trocarmos os comandos, isso pode levar a um impasse.
    Portanto, é crucial configurar dependências adequadamente e usar o tipo de fila apropriado para evitar possíveis problemas. Além disso, aprendemos sobre várias filas de comandos e como elas podem ser usadas para melhorar a simultaneidade em programas OpenCL.

  • 00:45:00 Nesta seção, o palestrante explica o modelo de simultaneidade OpenCL para vários dispositivos em um sistema. Cada dispositivo precisa de sua própria fila de comandos e também é possível ter várias filas de comandos para um único dispositivo, mas não é comumente usado. Geralmente, vários dispositivos que usam OpenCL usam dois modelos de execução diferentes - pipeline ou em paralelo. No modelo de pipeline, mesmo que dois ou mais dispositivos estejam presentes, um dispositivo aguarda o resultado de outro dispositivo, formando um pipeline. Por outro lado, no modelo paralelo, os dispositivos trabalham de forma independente em paralelo com seus buffers, executando de forma independente. A palestra também inclui um exemplo de múltiplas filas de comandos em um contexto na plataforma OpenCL, dois dispositivos com suas próprias filas de comandos e uma implementação em OpenCL.

  • 00:50:00 Nesta seção, aprenderemos sobre o pipeline e os modelos de execução paralela no OpenCL. No modelo de pipeline, os dados são compartilhados entre dois kernels, com o kernel 0 sendo executado primeiro e o kernel 1 aguardando sua conclusão antes de passar para a próxima computação. Vemos a implementação desse modelo usando eventos e chamadas de API. Em contraste, o modelo paralelo é usado quando não há dependências entre as tarefas e os kernels podem ser executados simultaneamente em diferentes dispositivos. O exemplo fornecido tem três dispositivos, os dispositivos GPU 0 e 1 e um dispositivo CPU 2, com filas de comandos separadas para cada um. O kernel 0 e o kernel 1 são iniciados separadamente para serem executados em paralelo e, uma vez concluídos, o kernel 2 da CPU pode ser iniciado.

  • 00:55:00 Nesta seção, o palestrante discute como construir um modelo de execução em OpenCL criando um evento de kernel, que permite a execução paralela de diferentes kernels. As duas primeiras chamadas de API são usadas para criar duas filas de GPU separadas para coronel 0 e coronel 1. Em seguida, a terceira chamada de API inicia um kernel de CPU, que aguarda a conclusão de ambos os kernels de GPU antes da execução. A abordagem discutida usa eventos para gerar dependências entre os kernels da CPU e da GPU, mas também permite que os kernels da GPU sejam executados em paralelo. O palestrante também explica os conceitos de itens de trabalho OpenCL, que definem uma cópia ou instância de computação e elementos de processamento, que são a menor unidade em um dispositivo de hardware.

  • 01:00:00 Nesta seção, o modelo de simultaneidade OpenCL é explicado, que se baseia em permitir que vários itens de trabalho sejam executados independentemente para aumentar o desempenho. Grupos de trabalho são um conjunto de itens de trabalho em um espaço de execução global que são mapeados para unidades de computação, permitindo a sincronização local como forma de atingir um certo grau de paralelismo na execução. No entanto, mapear muitos itens de trabalho para uma unidade de computação pode causar contenção de recursos, o que requer a emissão de trabalho suficiente para manter todos os elementos de processamento ocupados o tempo todo e concluir os grupos de trabalho em um lote.

  • 01:05:00 Nesta seção do vídeo, o palestrante discute o modelo de simultaneidade OpenCL e como os itens de trabalho podem ser agrupados em threads ou contextos de hardware. Os itens de trabalho são responsáveis por manter seus próprios contadores de programa ao mapear itens de trabalho e despachá-los da estrutura OpenCL. O palestrante explica que os itens de trabalho devem ser projetados para atender e aproveitar os elementos de processamento da GPU. É importante entender as dimensões do tamanho do problema e o elemento atual que está sendo trabalhado. O alto-falante fornece um conjunto de funções integradas que podem ser usadas para entender as dimensões do problema, tamanho global, tamanho local e, mais importante, obter o ID global e local como um índice para descobrir qual é o item de dados real que precisa ser trabalhado no item de trabalho atual. Um exemplo de kernel simples também é fornecido para explicar os diferentes aspectos do modelo de concorrência OpenCL.

  • 01:10:00 Nesta seção, o palestrante explica uma função de kernel que calcula o endereço a ser usado com o método get global ID para obter o número de ID em um espaço global para computação. A função do kernel então usa o endereço como um índice para uma matriz, multiplica o resultado por dois e atribui o produto a um buffer diferente. O palestrante continua explicando como o ID global na dimensão zero é usado para determinar o elemento a ser computado e como o ID global na dimensão um ajuda a determinar quantas linhas foram percorridas até agora. A ideia é garantir que cada item de trabalho seja computado em um único elemento e que não haja repetição de cálculos em nenhum elemento, economizando assim em ciclos de GPU ou CPU.

  • 01:15:00 Nesta seção, o vídeo discute como funciona a sincronização OpenCL e por que pode ser difícil garantir a ordenação baseada em hardware. OpenCL é uma estrutura de API de plataforma cruzada que não sabe onde o programa será executado, portanto não pode garantir a ordenação baseada em hardware. OpenCL roda em dispositivos que podem suportar multi-threading, mas não há nenhum sistema operacional rodando separadamente em tais dispositivos. Isso significa que não há mestre ou kernel do sistema operacional para remover threads de uma fila de execução. Como resultado, existe o risco de impasse ao usar semáforos ou mecanismos semelhantes. Para executar sincronização avançada entre itens de trabalho, o OpenCL usa uma barreira de grupo de trabalho. No entanto, o OpenCL não possui mecanismos para suportar a sincronização entre itens de trabalho em diferentes grupos de trabalho da mesma execução do kernel. Para suportar o compartilhamento de dados dentro do grupo de trabalho ou na mesma computação, a memória local acessível a todos os elementos de processamento pode ser usada.

  • 01:20:00 Nesta seção, aprendemos como usar a operação de barreira para sincronizar itens de trabalho dentro do mesmo grupo de trabalho no OpenCL. A API de barreira é usada como um ponto de sincronização e os itens de trabalho não podem continuar além da barreira até que todos os outros itens de trabalho no grupo de trabalho também tenham alcançado a barreira. Isso garante que todos os itens de trabalho no grupo tenham os mesmos dados antes de prosseguir. Usando a linha de sincronização global no OpenCL, pode-se usar evento e evento de espera para sincronizar em escala global, mas dentro do grupo de trabalho no nível de itens de trabalho, é necessário alavancar a operação de barreira para executar a sincronização.

  • 01:25:00 Nesta seção, aprendemos sobre a função do kernel no OpenCL e seus argumentos, que são ponteiros para objetos de memória nas memórias global e local. A memória local está presente em uma unidade de computação e é compartilhada pelos elementos de processamento nessa unidade de computação. A função kernel usa o ID global e o ID local para ler dados da memória global e atribuí-los ao elemento correspondente em um buffer local. Para sincronizar todos os itens de trabalho trabalhando na mesma instrução de atribuição, a barreira do grupo de trabalho e a ofensa à memória local são usadas como pontos de sincronização. Após a sincronização, a função kernel executa operações nos dados no buffer local e armazena o resultado no local correspondente no buffer de saída na memória global.

  • 01:30:00 Nesta seção, a palestra apresenta o conceito de kernels nativos em OpenCL, que permite usar funções C como kernels em um dispositivo sem depender de compiladores OpenCL. A API para invocar kernels nativos é apresentada junto com o mecanismo para passar argumentos para a função C usando um esquema chamado "unboxing". A palestra fornece um exemplo de passagem de argumentos, que envolve a passagem de números constantes e ponteiros para objetos de memória, incluindo buffers OpenCL, que são recuperados do ambiente OpenCL.

  • 01:35:00 Nesta seção, o palestrante explica como passar objetos de memória OpenCL para uma função de usuário usando a API do kernel nativo em fila. A API requer que o número de objetos de memória sendo passados e seus respectivos locais sejam especificados em uma lista. Isso inclui espaços reservados para objetos de memória e números constantes, que são diferenciados dos objetos de memória porque exigem passagem interativa. Os kernels integrados são específicos do dispositivo e utilizam recursos de hardware especiais, mas não são universais e podem não ter a mesma função em diferentes dispositivos.

  • 01:40:00 Nesta seção, aprendemos sobre as funções integradas do kernel, como a extensão interna de estimativa de movimento para OpenCL, que é usada para processamento de imagem para estimar o movimento entre quadros vizinhos em um vídeo. Essa extensão fornece aceleração de hardware ou incorpora funcionalidades de firmware e pode ser mais explorada no site da OpenCL.
Lecture 5 OpenCL Concurrency Model
Lecture 5 OpenCL Concurrency Model
  • 2018.10.13
  • www.youtube.com
OpenCL Runtime and Concurrency Model (please refer to Chapter 5 of textbook)
 

21. Conceito de Redução de Mapa



21. Conceito de Redução de Mapa

O conceito de MapReduce é explicado neste vídeo, que envolve a divisão de grandes problemas em subproblemas menores usando uma fase de mapeamento seguida por uma fase de redução. Essa abordagem é usada pelo Google para processar grandes quantidades de dados em seus computadores em data centers. O vídeo fornece um exemplo de como os processadores operam de forma independente, atribuindo aos processadores alguns dados para trabalhar, o que produz pares chave-valor após a conclusão. Os pares chave-valor são então processados por um grupo de diferentes processadores para obter o resultado final na fase de redução. Essa abordagem permite o processamento eficiente de grandes conjuntos de dados, distribuindo a carga de trabalho em várias máquinas.

  • 00:00:00 Nesta seção, o palestrante discute o conceito de MapReduce no contexto da decomposição de grandes problemas para obter problemas menores que possam ser resolvidos com eficiência. Eles identificam duas estratégias principais de decomposição, ou seja, dividir e conquistar e espalhar e reunir, que são usadas de forma intercambiável, dependendo das propriedades do problema ou das limitações de hardware. Eles explicam que a abordagem MapReduce, proposta pela primeira vez pelo Google em 2004, divide grandes problemas em subproblemas menores e os processa individualmente usando uma fase de mapeamento seguida por uma fase de redução. Eles ilustram como o conceito é usado pelo Google para processar grandes quantidades de dados em seus computadores em data centers, que atendem a consultas de mecanismos de pesquisa e páginas da web.

  • 00:05:00 Nesta seção, a abordagem MapReduce é explicada por meio de dois estágios: mapeamento e redução. O primeiro estágio envolve atribuir aos processadores alguns dados para trabalhar, o que resultará na produção de pares chave-valor após a conclusão. O segundo estágio, conhecido como reduções, envolve processadores que recebem pares chave-valor do primeiro estágio e realizam redução em valores correspondentes a um determinado "T". Essa abordagem é eficiente, pois os processadores podem operar de forma independente, uma vez que o problema original é particionado em subproblemas, tornando-o escalável para problemas de tamanhos diferentes. O vídeo dá um exemplo concreto de como essa abordagem pode ser aplicada usando uma entrada com seis blocos atribuídos a processadores, ilustrando o potencial de eficiência dessa abordagem.

  • 00:10:00 Nesta seção, o conceito de redução de mapa é fornecido e é explicado como os processadores executam a adição para combinar a entrada original em seis partes de tamanho igual para garantir o equilíbrio. Cada par chave-valor é produzido quase ao mesmo tempo durante o processo de mapeamento por diferentes processadores. A próxima etapa inclui o processamento desses pares de valores-chave por um grupo de diferentes processadores para obter o resultado final. Por fim, o estágio de redução combina esses pares de valores-chave e os processadores constroem a lista de alguns links com base no valor de uma única palavra-chave.

  • 00:15:00 Nesta seção, o palestrante explica o processo de mapeamento no MapReduce, que envolve a quebra de tarefas em subtarefas menores que podem ser executadas em paralelo. Isso é feito criando uma lista para cada palavra-chave que precisa ser analisada, com cada item da lista representando um valor associado a essa palavra-chave. Isso permite o processamento eficiente de grandes conjuntos de dados, distribuindo a carga de trabalho em várias máquinas.
Map Reduce Concept
Map Reduce Concept
  • 2020.06.14
  • www.youtube.com
This video introduce the basic concept of MapReduce
 

22. Exemplo de redução de mapa: WordCount e Weblink



22. Exemplo de redução de mapa: WordCount e Weblink

Este vídeo do YouTube demonstra como o MapReduce pode ser aplicado para contar as ocorrências de cada palavra em um grande arquivo de texto e analisar as relações de URL da página da web. O MapReduce permite que cada processador direcione palavras-chave específicas de forma independente no estágio de mapeamento, que envolve a divisão do documento em seções menores. O estágio de redução envolve agrupar pares chave-valor com base na palavra-chave e somar os valores para obter o número total de aparições de cada palavra. Para análise de páginas da web, o processo de mapeamento envolve a criação de pares chave-valor com a URL como a chave e uma lista de páginas da web vinculadas como os valores, e o estágio de redução constrói o mapa final para mostrar o relacionamento entre as páginas da web.

  • 00:00:00 Nesta seção, vemos um exemplo concreto de MapReduce em ação: contando as ocorrências de cada palavra em um grande arquivo de texto com centenas de milhares de palavras em inglês. É um caso de uso ideal para MapReduce porque as diferentes palavras-chave podem ser contadas independentemente, com cada processador visando palavras-chave específicas. O estágio de mapeamento envolve a divisão do documento em partes menores, com cada processador recebendo uma seção de tamanho semelhante para contar as ocorrências dos pares chave-valor de palavras interessantes. O estágio de redução envolve agrupar todos os pares chave-valor com base na palavra-chave e somar os valores para obter o número total de aparições de cada palavra. O exemplo demonstra a versatilidade do MapReduce, onde ele pode ser usado para contar acessos a páginas da Web, implementando a URL como uma palavra-chave ou analisando os relacionamentos de links da Web de diferentes sites.

  • 00:05:00 Nesta seção, o palestrante explica como o MapReduce pode ser usado para analisar um grande número de URLs de páginas da Web e seus links para construir um gráfico que mostre a relação entre eles. O processo de mapeamento envolve agrupar as tuplas em pedaços menores e atribuí-los a processadores de mapeamento para construir um par chave-valor com o URL como chave e uma lista de páginas da Web como os valores que serão vinculados a partir da chave. Então, no estágio de redução, várias chaves podem ser tratadas por diferentes processadores e o par chave-valor é usado para construir o mapa final e mostrar o relacionamento entre as páginas da web.
Map Reduce Example: WordCount and Weblink
Map Reduce Example: WordCount and Weblink
  • 2020.06.14
  • www.youtube.com
This video introduce MapReduce concept with two examples: word count and web link relationship.
 

23. Considerações sobre MapReduce no dispositivo OpenCL



23. Considerações sobre MapReduce no dispositivo OpenCL

A discussão neste vídeo do YouTube é centrada no uso de MapReduce em dispositivos OpenCL, com foco na estrutura de memória, organização do trabalho e redução local/global. O palestrante observa a vantagem de alavancar vários elementos de processamento em dispositivos OpenCL e enfatiza o uso de diferentes hierarquias de memória ao usar o MapReduce para processar grandes conjuntos de dados com eficiência. Eles também detalham as cinco etapas envolvidas no uso do MapReduce em dispositivos OpenCL, abrangendo o processo de mapeamento, redução local, sincronização de itens de trabalho, barreiras globais e produção do resultado final.

  • 00:00:00 Nesta seção, o foco está em como o MapReduce em dispositivos OpenCL difere dos ambientes de CPU tradicionais. A principal diferença está na estrutura da memória, que é hierárquica e consiste em memória privada, local e global, cada uma com tamanhos e visibilidade de dados diferentes. A memória privada é visível apenas para o próprio item de trabalho, enquanto a memória local é visível para todos os itens de trabalho na unidade de computação, mas não entre as unidades. A memória global, por outro lado, é visível para todos os itens de trabalho. Aproveitar o grande número de elementos de processamento em dispositivos OpenCL apresenta uma oportunidade, mas a estrutura de memória deve ser levada em consideração.

  • 00:05:00 Nesta seção, o palestrante discute o uso de MapReduce para executar operações em dispositivos OpenCL para resolver problemas como o conjunto de dados OAKLAND. Eles explicam a necessidade de usar diferentes itens de trabalho e atribuem cálculos a cada elemento da matriz a ser trabalhada. O uso da hierarquia de memória é importante, incluindo a memória primária e local, e o palestrante observa o benefício de usar a memória local para algumas das reduções em vez da memória global. Eles detalham como os grupos de trabalho são organizados e como as operações de mapeamento são executadas para cada bloco de dados atribuído a um item de trabalho. O uso de MapReduce dessa maneira pode ajudar a processar grandes conjuntos de dados de forma eficiente usando dispositivos OpenCL.

  • 00:10:00 Nesta seção, o palestrante discute o conceito de redução local e global no MapReduce em um dispositivo OpenCL. A redução local é feita em pares chave-valor produzidos por cada elemento de processamento, enquanto a redução global combina os resultados de vários grupos de trabalho na memória global. O desafio na implementação do MapReduce em dispositivos OpenCL é que o número de pares chave-valor produzidos pelo estágio de mapeamento é desconhecido e há uma necessidade de alocar espaços de memória para resultados intermediários adequadamente. Além disso, os resultados da interação local devem ser armazenados na memória local e diferentes hierarquias de memória devem ser consideradas.

  • 00:15:00 Nesta seção, o palestrante discute as cinco etapas para MapReduce em dispositivos OpenCL. A primeira etapa envolve o grupo de itens de trabalho realizando o processo de mapeamento e uma parte do estágio de redução local. A segunda etapa inclui a execução de uma barreira local para sincronizar os itens de trabalho antes de realizar as reduções. A terceira etapa é fazer com que o item de trabalho zero de ID local em cada grupo pré-processe os pares chave-valor produzidos por outros itens de trabalho. A quarta etapa envolve a execução de uma barreira global para evitar novas execuções até que todos os trabalhadores terminem. Finalmente, a quinta etapa envolve combinar os resultados de cada grupo de trabalho para produzir o resultado final, garantindo que todos os itens de trabalho tenham sido concluídos antes de fazê-lo.
Considerations of MapReduce on OpenCL device
Considerations of MapReduce on OpenCL device
  • 2020.06.14
  • www.youtube.com
This video introduces specifics of implementing MapReduce on OpenCL devices.
 

24. Exemplo de MapReduce: pesquisa de string com demonstração



24. Exemplo de MapReduce: pesquisa de string com demonstração

O vídeo demonstra vários aspectos da programação OpenCL e MapReduce, com foco na implementação da pesquisa de strings. O palestrante explica como declarar e alocar memória usando o qualificador local e aponta que a alocação dinâmica de memória não é permitida na função do kernel. Eles também introduzem tipos de dados vetoriais e demonstram como eles podem simplificar a adição de elementos e o acesso à memória. O foco principal está na implementação da pesquisa de string usando MapReduce, onde o texto de entrada é dividido em itens de trabalho e atribuído a uma função de mapa para pesquisar uma palavra-chave. Cada item de trabalho realiza esse processo enquanto compara os blocos de texto com um vetor padrão. Os resultados locais são obtidos por incremento atômico para evitar colisões, e o resultado final é obtido agregando os resultados de cada item de trabalho. O palestrante também fornece uma explicação detalhada da função do kernel, incluindo os argumentos necessários e como ela é inicializada.

  • 00:00:00 Nesta seção, o palestrante discute a alocação de memória local em OpenCL e demonstra como isso pode ser feito no contexto de uma função kernel de pesquisa de string. A memória local é declarada usando o qualificador "local" e apontada usando um colchete interno. O palestrante observa que a alocação dinâmica de memória não é permitida na função do kernel, portanto, a API de argumento set kernel é usada no programa host para alocar espaço de memória local. Além disso, o palestrante apresenta o tipo de dados vetoriais, que permite operações mais rápidas e fáceis em arrays com vários elementos do mesmo tipo.

  • 00:05:00 Nesta seção, o palestrante explica como usar o tipo de dados de vetor na função do kernel OpenCL para adição de elementos. O uso de vetores simplifica o processo de adição e atribuição, e a operação é aplicada a cada elemento do vetor. A inicialização de vetores também pode ser feita explicitamente com valores específicos ou repetindo um único valor para todos os elementos do vetor. O palestrante também discute como o acesso à memória compacta se beneficia do tipo vetorial, principalmente quando se trabalha com um array de caracteres, onde cada elemento é uma letra ou um byte.

  • 00:10:00 Nesta seção, o palestrante explica como usar o MapReduce para implementar a pesquisa de strings com uma demonstração. A pesquisa é realizada em um texto de entrada usando um padrão de caracteres de 16 caracteres. Eles explicam como a velocidade é utilizada usando as primeiras oito letras do vetor de mensagem e também demonstram como acessar os átomos em uma ordem diferente. Eles explicam como atribuem valores a partes do vetor de caracteres, fornecem exemplos e explicam como construir a função kernel que pesquisa o texto de entrada, incluindo os argumentos exigidos por essa função e como ela é inicializada. Finalmente, eles explicam como os resultados globais são obtidos e o que esses resultados significam.

  • 00:15:00 Nesta seção, o palestrante explica o processo de inicialização e o ponto de sincronização dentro da cerca de memória local para a pesquisa de string do exemplo MapReduce. Os caracteres no documento original são divididos em grupos, com cada grupo atribuído a um conjunto específico de letras para pesquisar a palavra-chave correspondente. O ID global e o caractere por item são usados para identificar o ponto de partida para o trabalho atribuído a cada grupo. No geral, esta seção fornece informações sobre os aspectos técnicos do MapReduce e sua aplicação na pesquisa de strings.

  • 00:20:00 Nesta seção, o palestrante descreve a implementação do MapReduce para realizar uma pesquisa de string usando uma demonstração. Os dados de entrada são divididos em itens de trabalho e cada item de trabalho é atribuído a uma função de mapa para pesquisar uma palavra-chave em um pedaço de texto. O palestrante demonstra como os pedaços de texto são carregados na memória e a janela de caracteres é movida para procurar a palavra-chave. Um vetor carregado com 16 caracteres é utilizado para comparação, e o resultado é armazenado em outro vetor para o chunk. Esse processo é repetido para cada item de trabalho e o resultado final é obtido agregando os resultados de cada item de trabalho.

  • 00:25:00 Nesta seção, o vídeo explica como a bateria é atribuída a um capítulo específico por meio da comparação dos vetores de texto correspondentes às palavras-chave inseridas pelo usuário com o vetor padrão. A operação de comparação compara cada elemento dos dois vetores, gerando 1 ou 0 para cada elemento. Se houver uma palavra-chave, o resultado da comparação determina o valor da bateria atribuída a esse capítulo específico. O bit significativo dos quatro primeiros elementos do vetor de verificação determina se há uma palavra-chave. Se a condição for verdadeira, o que significa que todos os bits significativos são 1, uma palavra-chave é encontrada e o resultado local é incrementado, o que indica que o programa encontrou uma correspondência.

  • 00:30:00 Nesta seção, o palestrante explica como funciona um exemplo de String Search MapReduce. O código consiste em vários grupos de trabalho onde cada grupo verifica palavras-chave específicas dentro do texto que foi particionado em blocos. O objetivo é descobrir se alguma das palavras-chave existe em cada bloco. Se o resultado for verdadeiro, o comentário é incrementado usando incremento atômico para evitar colisões. Depois que todas as palavras-chave são verificadas em um bloco, uma barreira é empregada para garantir que qualquer operação que acesse a memória global tenha sido concluída. O loop então desloca a janela para a direita para verificar o próximo conjunto de 16 letras e o processo é repetido para cada grupo de trabalho. Por fim, o contador de resultados local é adicionado ao resultado global usando adição atômica para evitar colisões.

  • 00:35:00 Nesta seção, o palestrante explica a implementação de um exemplo de MapReduce para pesquisa de strings com demonstração. A função do kernel é explicada, onde a memória local é inicializada, os contadores são redefinidos e o programa usa o Pope ID para calcular o deslocamento e carregar 16 bytes por vez no vetor de texto. A função então compara os resultados e realiza a redução global usando o primeiro de todos e a função de redução. O código de exemplo no GitHub é mostrado e o palestrante descreve os argumentos, como padrões, fator de texto, buffer de texto, caractere para um item, comprimento total do texto original e tamanho da imagem. Por fim, ele fala sobre como o tamanho global depende dos recursos disponíveis e da ciência formal envolvida no processo de encontrar a string desejada.

  • 00:40:00 Nesta seção, o palestrante explica o exemplo de utilização do MapReduce para pesquisar palavras específicas em um determinado arquivo de texto. O objetivo é contar a ocorrência de quatro palavras certas no arquivo de texto. O palestrante sugere a revisão do código-fonte e do tempo de execução para melhor entendimento do processo.
MapReduce Example: String Search with Demo
MapReduce Example: String Search with Demo
  • 2020.06.14
  • www.youtube.com
This video explains the implementation of string search on OpenCL device using MapReduce approach. Vector instructions and operations are briefly explained. ...
 

25. Exemplo OpenCL: Ordenação Radix



25. Exemplo OpenCL: Ordenação Radix

Neste vídeo, é apresentado o conceito de classificação radix, que envolve a divisão de um problema de classificação maior em subconjuntos menores com base na representação numérica em vez dos valores reais dos elementos que estão sendo classificados. O palestrante demonstra por meio de um exemplo de classificação de oito números, classificados por seu dígito menos significativo em representação hexadecimal. As funções OpenCL shuffle e shuffle2 são usadas para reorganizar os elementos de forma eficiente durante o processo de classificação. O vídeo também explica como executar uma operação aleatória usando OpenCL e como usar instruções aleatórias na função do kernel para ordenação radix. Além disso, o vídeo explora a função do kernel chamada radix sort eight sort eight, que efetivamente classifica arrays em OpenCL dividindo o vetor de entrada em zeros e uns baldes com base nos valores em seus dígitos binários.

  • 00:00:00 Nesta seção, o vídeo apresenta o conceito de classificação radix, que divide um grande problema de classificação em problemas menores, classificados por subconjuntos. O processo de classificação é realizado com base na representação numérica dos elementos, e não nos valores dos próprios elementos. O palestrante demonstra por meio de um exemplo de classificação de 8 números, onde a classificação é baseada no dígito menos significativo na representação hexadecimal. O processo de classificação é feito por meio de várias iterações, onde os números são colocados em baldes de acordo com os dígitos mais insignificantes e repetidos para dígitos adicionais até que os números sejam classificados em ordem crescente.

  • 00:05:00 Nesta seção do vídeo, o palestrante demonstra como aplicar classificação radix a um conjunto de números organizando-os primeiro em grupos com base em seu dígito mais significativo. Eles então repetem o processo usando o dígito menos significativo e continuam até que tenham examinado todos os dígitos de cada número. O palestrante observa que cada etapa da classificação radix é essencialmente um embaralhamento e o uso das funções aleatórias do OpenCL permite o rearranjo eficiente dos elementos durante o processo de classificação. Por fim, o palestrante fornece um exemplo de como uma máscara pode ser usada para especificar os índices dos elementos que precisam ser classificados e demonstra como aplicar esse conceito com dois vetores e uma matriz de máscara.

  • 00:10:00 Nesta seção, é explicado o uso da função shuffle e shuffle2 no OpenCL. A função shuffle cria um vetor de saída que desloca ou embaralha os valores originais dos vetores de entrada com base na máscara fornecida para criar um novo vetor de saída. A função shuffle2 é semelhante, mas usa dois vetores de entrada em vez de um. O tamanho e o tipo de dados da máscara devem corresponder ao fator de retorno e o tipo de dados deve ser um tipo inteiro sem sinal. Além disso, o fator retornado terá o mesmo tipo de dados e número de componentes do vetor de entrada, e apenas um número selecionado de bits nos componentes do vetor de máscara é significativo. O valor de K em shuffle2 depende do número de componentes no vetor de entrada.

  • 00:15:00 Nesta seção, o palestrante explica como realizar uma operação aleatória usando OpenCL. Eles fornecem um exemplo de operação aleatória que usa um vetor de entrada e uma máscara e gera um vetor com base nos valores selecionados do vetor de entrada pela máscara. Eles também explicam como usar os valores de máscara para determinar quais valores selecionar do vetor de entrada para construir o vetor de saída. O palestrante fornece um segundo exemplo que envolve dois vetores de entrada contendo letras e explica como usar a máscara para construir o vetor de saída com base nos valores selecionados dos vetores de entrada.

  • 00:20:00 Nesta seção, o vídeo discute o uso de instruções de shuffle na função kernel do exemplo OpenCL para ordenação radix. A função do kernel é denominada "teste aleatório" e recebe dois argumentos: um vetor de ponto flutuante e um vetor de 16 elementos de caractere. O vídeo mostra um exemplo de uso de um vetor inteiro como máscara para construir um vetor de saída contendo oito números de ponto flutuante usando um vetor de ponto flutuante de quatro elementos como entrada. O vídeo continua explicando como a classificação funciona na função kernel, observando o dígito binário menos significativo e usando-o para escolher os números ímpares para criar um novo vetor.

  • 00:25:00 Nesta seção do vídeo, o palestrante explica como construir uma máscara com base no dígito menos significativo dos elementos em um vetor para classificá-los usando o algoritmo de ordenação radix. Ao copiar os elementos para vetores designados e construir uma máscara com base no dígito menos significativo dos elementos, a função shuffle to pode ser usada para recuperar os valores dos vetores originais e designados e construir um novo vetor. Esse processo classifica os números básicos em dois grupos, 0 e 1, com base em seus dígitos binários.

  • 00:30:00 Nesta seção, aprendemos sobre a função do kernel chamada radix sort eight sort eight, que funciona dividindo o vetor de entrada em zeros e uns baldes com base nos valores em seus dígitos binários. A função kernel define uma estrutura de união usada como um buffer para classificar a matriz de dados usando dois contadores, contagem zero e uma contagem. O valor CMP um é usado para determinar qual dígito binário comparar os valores, e a função usa duas matrizes, máscaras e dados, correspondentes ao diagrama no vídeo, para armazenar os elementos classificados. O loop for tem oito iterações para trabalhar nos oito números a serem classificados, e J vai de zero a oito para determinar quantos elementos devem ir para os baldes zero e uns. Radix sort eight sort eight é uma maneira eficaz de classificar arrays no OpenCL.

  • 00:35:00 Nesta seção, o palestrante explica como funciona o radix sort, que envolve a classificação de valores em um conjunto de dados de acordo com o dígito correspondente em cada posição. O processo começa com o dígito menos significativo e se move em direção ao dígito mais significativo. O palestrante usa um exemplo para mostrar como os valores que terminam com um e zero são separados em diferentes matrizes antes de executar uma operação aleatória para criar o vetor de saída final. O processo é repetido para os demais dígitos, e o resultado final é armazenado em um buffer global.
OpenCL Example: Radix Sort
OpenCL Example: Radix Sort
  • 2020.03.26
  • www.youtube.com
OpenCL Example: Radix Sort using Shuffle Function