OpenCL na negociação

 

OpenCL é uma plataforma que fornece um padrão aberto para escrever programas que podem ser executados em diferentes arquiteturas de computadores, como CPUs, GPUs e processadores especializados, permitindo que os desenvolvedores de software escrevam código em um idioma que pode ser executado em diversos dispositivos, independentemente do fornecedor ou da arquitetura.

O OpenCL inclui um tempo de execução e uma interface de programação que fornecem um certo nível de independência em relação à plataforma, permitindo que os desenvolvedores escrevam códigos que podem ser executados em qualquer dispositivo com suporte para OpenCL. Além disso, ele possui um conjunto de APIs de baixo nível que facilitam aos desenvolvedores controlar explicitamente a execução do dispositivo, memória e núcleos, dando a eles um controle refinado sobre seus aplicativos.

O OpenCL é amplamente utilizado em cálculos computacionais, processamento de imagem e vídeo, aprendizado de máquina e outros campos. Ele melhora o desempenho do aplicativo utilizando o poder de processamento paralelo de vários dispositivos para uma execução mais rápida e eficiente.

Uma das vantagens mais significativas do OpenCL é sua capacidade de aproveitar o poder de processamento das GPUs, que podem realizar certos tipos de cálculos muito mais rápido que as CPUs. Isso o torna especialmente útil para aplicativos que exigem cálculos complexos, como modelagem científica, processamento de imagem e vídeo ou aprendizado de máquina. 

No geral, o OpenCL fornece uma estrutura flexível para desenvolver aplicativos que podem aproveitar o poder de diferentes dispositivos de computação, tornando-se uma ferramenta valiosa para desenvolvedores que otimizam aplicativos computacionais de alto desempenho.


O MQL5 oferece suporte ao OpenCL desde 2012, consulte a seção Trabalhando com OpenCL da documentação do MQL5 para obter detalhes. Veja também Classe para trabalhar com programas OpenCL .

Exemplos de uso do OpenCL podem ser encontrados em MQL5\Scripts\Examples\OpenCL.

OpenCL examples in MetaTrader5

Aqui podemos ver um exemplo do Seascape OpenCL




Veja também artigos:

 

Introdução ao OpenCL



Introdução ao OpenCL (1)

O vídeo Introdução ao OpenCL aborda o OpenCL como uma linguagem de baixo nível para computação paralela de dados heterogêneos de alto desempenho, compatível com vários tipos de dispositivos, incluindo CPUs, GPUs e FPGAs. O OpenCL tornou-se um padrão aberto em 2008 e recebeu suporte significativo da indústria de empresas como Intel, Nvidia e AMD. Embora o OpenCL seja frequentemente comparado ao CUDA, que possui melhores ferramentas, recursos e suporte da Nvidia, o OpenCL oferece suporte a mais dispositivos, tornando-o mais difundido entre os fabricantes. Para projetos pessoais, o palestrante sugere o uso de CUDA para suas melhores ferramentas e otimização, enquanto o OpenCL é recomendado para produtos profissionais que precisam suportar diferentes GPUs.

  • 00:00:00 Nesta seção, o palestrante apresenta o OpenCL como uma linguagem de baixo nível para computação paralela de dados heterogêneos de alto desempenho. OpenCL pode suportar vários tipos de dispositivos, incluindo CPUs, GPUs e FPGAs, e é baseado em C 99, permitindo portabilidade entre dispositivos. O OpenCL também fornece uma maneira consistente de expressar vetores e possui bibliotecas matemáticas compartilhadas e um processo de certificação OpenCL que garante precisão garantida. O palestrante observa que o OpenCL se tornou um padrão aberto em 2008, recebendo suporte significativo da indústria de empresas como Intel, Nvidia e AMD, bem como fabricantes de dispositivos embarcados como Ericsson, Nokia e Texas Instruments. Embora o OpenCL seja frequentemente comparado ao CUDA, que possui melhores ferramentas, recursos e suporte da Nvidia, o OpenCL oferece suporte a mais dispositivos, tornando-o mais difundido entre os fabricantes.

  • 00:05:00 Nesta seção, o palestrante discute as diferenças entre CUDA e OpenCL e quando escolher um em detrimento do outro para diferentes propósitos. Para projetos pessoais, o palestrante sugere o uso de CUDA para suas melhores ferramentas, depuradores e otimizações. No entanto, para produtos profissionais que precisam suportar diferentes GPUs, o palestrante recomenda o uso do OpenCL, pois é a única forma de oferecer suporte a GPUs não Nvidia e também está evoluindo com o suporte de várias empresas. Quando se trata do curso, o palestrante sugere o uso de CUDA para obter melhores ferramentas e codificação simplificada, mas o OpenCL pode ser mais fácil de usar para acessar todos os recursos de computação.
Introduction to OpenCL (1)
Introduction to OpenCL (1)
  • 2016.04.06
  • www.youtube.com
Introduction to OpenCL: What is it, what is it good for, how does it compare to CUDA.
 

Para que serve o OpenCL?



Para que serve o OpenCL? (2)

O palestrante do vídeo fala sobre as vantagens de usar o OpenCL para programas de computação intensiva que são dados paralelos e de precisão única. As GPUs são projetadas para gráficos e são ideais devido à alta proporção de operações matemáticas para operações de memória. O palestrante explica que os loops de maior intensidade gastam mais tempo fazendo operações matemáticas, onde as GPUs se destacam, enquanto os loops de baixa intensidade passam a maior parte do tempo esperando o acesso à memória. O paralelismo de dados, que envolve a execução das mesmas operações independentes em muitos dados, também é explorado nesta seção. O palestrante também discute o uso de precisão simples e dupla no OpenCL, onde a precisão dupla é mais cara de executar porque exige o dobro de dados que a precisão simples.

  • 00:00:00 Nesta seção, o palestrante explica que o OpenCL é bom para programas de computação intensiva que são dados paralelos e de precisão única. As GPUs são projetadas para gráficos e são boas para esses tipos de programas porque são computacionalmente intensivas, com alta proporção de operações matemáticas para operações de memória. A matemática é rápida e a memória é lenta, portanto, ter muitas operações matemáticas mantém a máquina ocupada enquanto os acessos à memória a tornam mais lenta. O palestrante explica que os loops de baixa intensidade passam a maior parte do tempo esperando pela memória, enquanto os loops de maior intensidade passam mais tempo fazendo operações matemáticas, que é onde as GPUs se destacam. O paralelismo de dados, que significa fazer as mesmas operações independentes em muitos dados, também é explorado nesta seção. Os exemplos incluem modificar pixels em uma imagem ou atualizar pontos em uma grade.

  • 00:05:00 Nesta seção, o palestrante explica como funciona a execução paralela de dados no OpenCL. Ele afirma que envolve essencialmente operações independentes em muitos dados e que isso é chamado de execução paralela de dados. O palestrante explica que esse tipo de execução pode resultar em perda de desempenho devido às variações nos cálculos feitos nos dados, como os que podem ocorrer ao realizar operações em pixels de cores diferentes. Ele então discute o uso de precisão simples e dupla no OpenCL, afirmando que a precisão dupla requer duas vezes mais dados que a precisão simples e, portanto, é mais cara de executar.
What is OpenCL Good for? (2)
What is OpenCL Good for? (2)
  • 2016.04.06
  • www.youtube.com
Overview of the kind of problems OpenCL is good at accelerating: computational intensity, parallelism.
 

Dimensões locais e globais em OpenCL



Dimensões locais e globais em OpenCL (3)

Este vídeo investiga o conceito de dimensões globais e locais no OpenCL e como elas são usadas para especificar o paralelismo na execução do código. A dimensão global é uma matriz 1D, 2D ou 3D que determina o número de threads ou itens de trabalho a serem executados para cada execução do kernel. Por exemplo, se a dimensão global for um array 3D com mil pontos, cada ponto terá um thread ou work item executado. Enquanto isso, a dimensão local divide a dimensão global em grupos de trabalho locais ou grupos de threads que funcionam juntos, facilitando a sincronização. A sincronização só é permitida dentro do mesmo grupo de trabalho, tornando-se fundamental selecionar dimensões locais que permitam a sincronização necessária. Para resumir, a dimensão global estabelece o número de threads ou itens de trabalho para cada execução do kernel, enquanto a dimensão local particiona a dimensão global em grupos de trabalho que permitem a sincronização. A seleção de dimensões locais adequadas é crucial para a sincronização, visto que ela só pode ocorrer dentro do mesmo grupo de trabalho.

Local and Global Dimensions in OpenCL (3)
Local and Global Dimensions in OpenCL (3)
  • 2016.04.06
  • www.youtube.com
How to specify parallelism in OpenCL kernels with global dimensions and local dimensions. How to choose the right dimensions.
 

Problemas com dimensões locais no OpenCL



Problemas com dimensões locais no OpenCL (4)

O vídeo explora vários problemas relacionados a dimensões locais no OpenCL, incluindo limitações de sincronização e utilização de dispositivos. A sincronização é restrita ao mesmo grupo de trabalho na GPU, e a sincronização global é cara e só pode ser usada no final da execução do kernel. Escolher o tamanho certo do grupo de trabalho local é crucial para evitar o desperdício de hardware, e o palestrante sugere a seleção de dimensões que sejam bons múltiplos do tamanho físico do hardware. O vídeo conclui recomendando uma abordagem de tentativa e erro para encontrar as melhores dimensões para um desempenho ideal.

  • 00:00:00 Nesta seção, o vídeo explora dois problemas relacionados à sincronização e utilização do dispositivo ao escolher dimensões locais no OpenCL. O tamanho do grupo de trabalho local é limitado a 512 threads, até 1024, dependendo da complexidade do código, e a sincronização só pode ocorrer dentro do mesmo grupo de trabalho. O vídeo usa um aplicativo de redução para demonstrar como funciona a sincronização e as limitações impostas pelos tamanhos dos grupos de trabalho. O vídeo atribui a capacidade de sincronização limitada às necessidades de escalabilidade da GPU e ao custo de suportar a sincronização arbitrária em outro lugar do chip.

  • 00:05:00 Nesta seção, o vídeo explora problemas com dimensões locais no OpenCL. O primeiro exemplo mostra como o uso de bloqueios de rotação pode resultar em um impasse devido à falta de garantias de avanço do escalonador. O vídeo também explica que a sincronização global só pode ser feita no final da execução do kernel, tornando-a cara e obrigando os programadores a planejar cuidadosamente seus algoritmos. Outro problema é a utilização do dispositivo quando os tamanhos dos grupos de trabalho locais não correspondem ao tamanho das unidades de computação. Isso resulta no desperdício de partes do hardware e, para evitar esse problema, os programadores precisam escolher dimensões que funcionem bem para o problema e correspondam perfeitamente ao tamanho do hardware.

  • 00:10:00 Nesta seção, o palestrante discute os fatores que influenciam a escolha das dimensões locais no OpenCL. Eles explicam que em uma GPU, é melhor ter mais de 2.000 itens de trabalho em bons múltiplos do tamanho do hardware físico, como 16 ou 3.200 para vídeo 64 e AMD. Para CPUs, é melhor ter o dobro do número de núcleos de CPU, mas isso pode variar dependendo dos algoritmos usados. O palestrante sugere tentativa e erro até que o melhor desempenho seja alcançado.
Issues with local dimensions in OpenCL (4)
Issues with local dimensions in OpenCL (4)
  • 2016.04.06
  • www.youtube.com
Handling reductions with local dimensions and problems with spin locks and device utilization on GPUs.
 

Kernels de Computação OpenCL



Kernels de computação OpenCL (5)

O instrutor explica que os kernels OpenCL são códigos C99 usados para computação paralela. Os kernels são executados milhares de vezes em paralelo e são o loop interno da computação. Recursos OpenCL como vetores, arredondamento e conversões precisos e funções intrínsecas garantem precisão. As funções utilitárias do OpenCL fornecem informações sobre itens de trabalho, como ID, dimensões e IDs de grupo, permitindo a criação de kernels flexíveis que podem ser ajustados. No entanto, usar as funções da biblioteca OpenCL significa negociar preferência e precisão porque a reordenação da operação de código paralelo pode afetar a sequência de execução e alterar os resultados, impossibilitando a execução determinística em todos os dispositivos.

  • 00:00:00 Nesta seção, o instrutor explica que os kernels OpenCL são basicamente apenas código C99 e são usados para especificar cálculos que serão feitos em paralelo. O código é executado milhares de vezes em paralelo e é o loop interno da computação. O instrutor então dá um exemplo de uma função C e como ela pode ser executada em paralelo usando kernels OpenCL. Ele também fala sobre alguns dos recursos do OpenCL, como vetores, capacidade explícita de controlar arredondamentos e conversões e funções intrínsecas que vêm com precisão garantida. As funções utilitárias do OpenCL também fornecem informações sobre cada item de trabalho, como ID do item de trabalho, dimensões, número máximo em uma dimensão específica e IDs de grupo, o que ajuda a escrever kernels flexíveis que podem ser inteligentes ao descobrir qual trabalho devem fazer . No geral, o OpenCL aprimora a capacidade de tornar o código portátil e de alto desempenho, fornecendo disponibilidade e precisão garantidas.

  • 00:05:00 Nesta seção, o palestrante explica a troca entre preferência e precisão ao usar as funções da biblioteca de conformidade OpenCL. Embora essas funções garantam a precisão quando testadas, isso não significa necessariamente que os aplicativos irão gerar os mesmos resultados em todas as máquinas OpenCL. A razão é que o compilador pode reordenar operações em código paralelo, afetando a sequência de execução e possivelmente alterando os resultados finais. Portanto, embora seja preferível criar código nessas funções de biblioteca, a execução determinística em todos os dispositivos não pode ser garantida.
OpenCL Compute Kernels (5)
OpenCL Compute Kernels (5)
  • 2016.04.06
  • www.youtube.com
How to write compute kernels in OpenCL for parallelism, OpenCL utility functions and intrinsics.
 

Arquitetura de tempo de execução OpenCL



Arquitetura OpenCL Runtime (6)

O vídeo discute a arquitetura da plataforma OpenCL, incluindo seus dispositivos como GPUs e CPUs conectados através de um barramento de memória. Os contextos OpenCL também são explicados como agrupamentos de dispositivos dentro de uma plataforma, permitindo a transferência otimizada de dados entre eles. As filas de comandos são introduzidas como um meio de enviar o trabalho para diferentes dispositivos, mas a distribuição do trabalho entre os dispositivos precisa ser feita manualmente, pois não há distribuição automática.

OpenCL Runtime Architecture (6)
OpenCL Runtime Architecture (6)
  • 2016.04.06
  • www.youtube.com
OpenCL architecture: devices, queues, contexts, compute units, data transfer and utilizing multiple devices.
 

Movimentação de dados em OpenCL



Movimentação de dados em OpenCL (7)

O vídeo discute a movimentação de dados no OpenCL, onde o palestrante explica as etapas manuais necessárias para copiar dados entre a memória do host e a GPU e a diferença de velocidade entre a memória global e a local. A memória global na GPU tem acesso mais rápido, mas a obtenção de dados da memória do host para a GPU é lenta. A memória local no OpenCL pode fornecer desempenho aprimorado com largura de banda massiva, mas é mais difícil de usar do que os caches, pois requer alocação manual. As GPUs Nvidia modernas oferecem a escolha entre gerenciar manualmente a memória local ou usá-la como um cache, com a abordagem recomendada para começar com um cache antes de otimizar para a movimentação de dados local.

  • 00:00:00 Nesta seção, o palestrante discute como a movimentação de dados funciona no OpenCL e as etapas manuais necessárias para copiar dados da memória do host para a GPU e vice-versa. A GPU tem memória global que tem acesso muito mais rápido do que a memória do host, mas a obtenção de dados da memória do host para a GPU é lenta devido ao barramento PCIe. A GPU também possui memória local com grande largura de banda, e usá-la pode melhorar significativamente o desempenho. No entanto, alocar e copiar dados para a memória local precisa ser feito manualmente em cada unidade de computação, tornando-se uma tarefa complicada.

  • 00:05:00 Nesta seção, o palestrante fala sobre a memória local em OpenCL, que pode variar de 16 a 48 kilobytes, e como ela pode fornecer maior largura de banda de milhares de gigabytes por segundo. No entanto, a memória local é mais difícil de usar do que os caches porque os caches colocam automaticamente os dados usados mais recentemente sem a necessidade de alocar diferentes partes da memória para dados diferentes, enquanto a memória local requer alocação manual. As GPUs Nvidia modernas permitem a escolha entre gerenciar a memória local manualmente ou usá-la como um cache, com a abordagem recomendada para começar com um cache antes de otimizar para movimentação de dados local.
Data Movement in OpenCL (7)
Data Movement in OpenCL (7)
  • 2016.04.06
  • www.youtube.com
Host to device transfer speeds, local memory.
 

OpenCL Olá Mundo



OpenCL Hello World (8)

Neste vídeo, é explicado o processo de criar um programa usando OpenCL e enviá-lo para um dispositivo GPU. O palestrante percorre as etapas de construção do programa, criação de kernels e objetos de memória e cópia de dados entre CPU e GPU. Eles também explicam o processo de definição dos argumentos e dimensões do kernel, execução do kernel e recuperação dos resultados da GPU. O palestrante observa que kernels complicados podem não oferecer desempenho ideal tanto na CPU quanto na GPU e podem precisar ser corrigidos para melhorar o desempenho. Eles comparam o processo de programação em OpenCL com a resolução de um problema matemático, onde as operações são repetidas até que o resultado desejado seja alcançado.

  • 00:00:00 Nesta seção, o palestrante explica as etapas necessárias para configurar o OpenCL e criar um programa usando-o. Primeiramente, os dispositivos e plataformas precisam ser configurados e um contexto deve ser criado para a execução de comandos. Em seguida, são criadas filas de comandos para enviar o trabalho para diferentes dispositivos. O código é então compilado para obter objetos do kernel que podem ser enviados para as filas. Objetos de memória são criados para trocar dados entre dispositivos e argumentos são configurados para o kernel. O kernel é colocado na fila para execução e os dados são copiados do dispositivo para a CPU. Por fim, todos os comandos precisam ser concluídos e uma espera é implementada para garantir que os dados sejam retornados conforme o esperado. O palestrante também percorre um exemplo de programa OpenCL Hello World que calcula o seno de x em paralelo usando dispositivos.

  • 00:05:00 Nesta seção do vídeo, o palestrante explica o processo de criar um programa usando OpenCL e enviá-lo para um dispositivo GPU. Eles começam construindo o programa que leva mais tempo na primeira vez, mas nas vezes subseqüentes não. Eles então criam um objeto kernel para um kernel específico no programa chamando CL create kernel. Depois disso, eles criam um objeto de memória, alocam um espaço no dispositivo e copiam os dados da CPU para a GPU usando CL no buffer de gravação da fila. O locutor então define os argumentos e dimensões do kernel e executa o kernel usando CL no Q nd range kernel. Por fim, o alto-falante recupera os resultados da GPU e espera que tudo termine chamando CL finish. O palestrante conclui afirmando que kernels complicados podem não oferecer desempenho ideal tanto na CPU quanto na GPU e podem precisar ser corrigidos para melhorar o desempenho.

  • 00:10:00 Nesta seção, o palestrante explica que a programação geralmente envolve a repetição de certos comandos até atingir a saída final desejada. Ele compara isso a resolver um problema de matemática, onde se faria um conjunto de operações repetidas vezes até chegar à resposta correta. Ele observa que esse processo é semelhante ao usar o OpenCL, onde os comandos de programação são repetidos várias vezes até que o resultado desejado seja alcançado.
OpenCL Hello World (8)
OpenCL Hello World (8)
  • 2016.04.06
  • www.youtube.com
Writing a simple Hello World parallel program in OpenCL for GPUs: device setup, kernel compilation, copying data.
 

Mais recursos do OpenCL



Mais recursos do OpenCL (9)

O vídeo discute recursos adicionais do OpenCL, como consulta de dispositivos, manipulação de imagens e eventos. Os usuários podem usar o comando cl_get_device_info para descobrir detalhes sobre seus dispositivos, embora esses valores nem sempre sejam totalmente precisos. O suporte nativo do OpenCL de tipos de imagem 2D e 3D pode ser lento sem suporte de hardware em CPUs, mas é acelerado por hardware em GPUs. Os eventos são essenciais quando se trabalha com execução de comandos assíncronos e vários dispositivos, servindo como sinais para diferentes dispositivos que requerem sincronização entre eles. O palestrante fornece um exemplo de uso de eventos para garantir que o Kernel B aguarde a conclusão do Kernel A antes de executar, enfileirando os kernels com os respectivos eventos, copiando a saída e aguardando que os eventos forneçam sincronização.

  • 00:00:00 Nesta seção, o palestrante discute recursos adicionais do OpenCL, incluindo dispositivos de consulta, manipulação de imagens e eventos do OpenCL. Por meio da consulta de dispositivos usando o comando cl_get_device_info, os usuários podem descobrir informações sobre seus dispositivos, como o número de unidades de computação, frequência de clock, tamanho da memória global e muito mais. No entanto, o palestrante adverte que esses valores podem não ser tão precisos quanto o desejado. O OpenCL suporta tipos de imagem 2D e 3D nativamente, que podem ser interpolados linearmente, enrolados nas bordas ou fixados nas bordas. Embora esses recursos sejam acelerados por hardware em GPUs, eles são lentos em CPUs sem suporte de hardware. Por fim, os eventos são importantes quando se trabalha com execução de comandos assíncronos e vários dispositivos, pois as dicas para diferentes dispositivos são assíncronas entre si, exigindo sincronização entre eles.

  • 00:05:00 Nesta seção, o palestrante explica os eventos e seu uso no OpenCL. Cada comando enqueue tem três coisas no final, que são o número de eventos na lista, lista de espera e eventos retornados. Eles permitem que os usuários retornem um evento para rastrear e descobrir se o kernel está pronto, fazer outras coisas para aguardar a conclusão do kernel e até mesmo obter informações de perfil. O palestrante fornece um exemplo de uso de eventos para garantir que o kernel B na GPU aguarde a conclusão do kernel A na CPU e copie sua saída para a GPU antes de executar. Envolve enfileirar o kernel com um evento, fazer uma cópia, aguardar esse evento e fazer com que o segundo kernel aguarde a cópia para garantir a sincronização.
More OpenCL Features (9)
More OpenCL Features (9)
  • 2016.04.06
  • www.youtube.com
System information, Image types, events.
 

Resumo e dicas de desempenho do OpenCL



Resumo e dicas de desempenho do OpenCL (10)

O vídeo discute dicas para otimizar o desempenho do OpenCL, o que inclui minimizar as transferências de dados, otimizar o acesso à memória, usar kernels produtor-consumidor e utilizar vetores e funções matemáticas rápidas. O palestrante destaca que os aplicativos adequados para GPUs devem ser paralelos de dados, computacionalmente intensivos, evitar sincronização global, confortáveis com precisão única e gerenciáveis com pequenos caches. Se tiver um desempenho ruim com o OpenCL, pode ser necessário reconsiderar o algoritmo e otimizar a localidade da memória, a memória compartilhada ou local e evitar a sincronização desnecessária entre os itens de trabalho.

  • 00:00:00 Nesta seção, o palestrante discute dicas para otimizar o desempenho do OpenCL, incluindo minimizar as transferências de dados entre CPU e GPU, mantendo os dados no dispositivo o maior tempo possível e usando cadeias de kernel produtor-consumidor. O palestrante também enfatiza a importância de otimizar o acesso à memória, otimizando a coalescência de memória e gerenciando a memória local nas GPUs. Além disso, o palestrante observa que o uso de vetores pode melhorar o desempenho em determinado hardware, e o uso de variantes rápidas ou nativas de certas funções matemáticas pode resultar em um aumento significativo de velocidade. Por fim, o palestrante discute as características dos aplicativos que são uma boa combinação para GPUs, incluindo dados paralelos, computação intensiva, não exigindo sincronização global, confortável com precisão única e gerenciável com pequenos caches.

  • 00:05:00 Nesta seção, o palestrante sugere que, se você estiver tendo um desempenho ruim com o OpenCL, talvez seja necessário reconsiderar seu algoritmo e escolher um que se encaixe melhor com o padrão de processamento paralelo. Isso pode envolver alterar a ordem ou a estrutura do seu código para otimizar a localidade da memória, utilizando memória compartilhada ou memória local e evitando sincronização desnecessária entre itens de trabalho.
OpenCL Performance Tips and Summary (10)
OpenCL Performance Tips and Summary (10)
  • 2016.04.06
  • www.youtube.com
OpenCL kernel and runtime performance optimizations, checklist for using OpenCL.
Razão: