CUDA vs OpenCL
Introdução
Fornecedores
• CUDA:
– Nvidia
• OpenCL:
– AMD:
• ATI Stream: CPUs e GPUs
– Nvidia: suporta OpenCL 1.1
– Apple:
• Suporta placas Nvidia
• suporta CPUs
– Intel
– IBM: suporta CPUs PowerPC
Capacidades
• Funcionalidades de sincronização CUDA não
são tão flexíveis como as do OpenCL. Em
OpenCL, qualquer operação em fila de espera
pode esperar por qualquer outro conjunto de
operações em fila.
– No CUDA 3.2 foi introduziada a função StreamWaitEvent(),
entretanto CUDA ainda não possuir capacidade de executar filas
for a de ordem como o OpenCL.
• OpenCL suporta sincronização entre vários
dispositivos.
Capacidades
• CUDA possui ferramentas mais maduras, incluindo
um debugger e profiler, como também CUBLAS,
CUFTT e outras.
• CUDA permite construtores C++ em modo GPU,
OpenCL é baseado em C99.
• OpenCL pode enfileirar ponteiros de função de CPU
em sua fila de comandos, CUDA não.
• OpenCL possui geração de código em tempo real
embutido, para CUDA é necessário usar, por
exemplo, PyCUDA.
OpenCL na Arquitetura CUDA
ELC139 - Cícero Augusto de Lara
Pahins
Arquitetura CUDA
• A arquitetura CUDA é semelhante a
arquitetura do OpenCL
• Um dispositivo CUDA é construído em torno
de um conjunto escalonável de multithreaded
Streaming Multiprocessors (SMs). Um
multiprocessador corresponde a uma unidade
de computação OpenCL.
Arquitetura CUDA
• Um multiprocessador executa uma thread
CUDA para cada item de trabalho OpenCL e
um bloco de thread para cada grupo de
trabalho OpenCL.
• Um kernel é executado ao longo de um
NDRange OpenCL por uma grade de blocos de
threads.
Cada bloco de thread que
executar um kernel é,
portanto, unicamente
identificado por seu ID de
grupo de trabalho, e cada
thread pelo seu ID global
ou por uma combinação
de seu ID local e ID do
grupo de trabalho.
Arquitetura CUDA
• Quando um programa OpenCL no host invoca um
kernel, os grupos de trabalho são enumerados e
distribuídos como blocos de thread para o
multiprocessadores com capacidade de execução
disponíveis.
• As threads de um bloco de threads executam
simultaneamente em um multiprocessador. A
medida que blocos de threads terminam, novos
blocos são lançados nos multiprocessadores
desocupados.
Arquitetura CUDA - SIMT
• SIMT: Single Instruction, Multiple Thread
• A arquitetura SIMT é semelhante a
SIMD(Single Instruction, Multiple Data) na
organização de vetores em que uma única
instrução controla múltiplos elementos de
processamento.
Arquitetura CUDA - SIMT
• A organização SIMD de vetores expõe a largura SIMD
para o software, enquanto que as instruções SIMT
especificam a execução e o comportamento de de
desvio de uma única thread.
• Em contraste com máquinas vetorias SIMD, a
arquitetura SIMT permite aos programadores
escreverem código paralelo a nível de thread para
threads escalares independentes, bem como código de
dado paralelo para threads coordenadas.
Arquitetura CUDA – Hardware Multithread
• Cada multiprocessador possui um conjunto de
registradores 32-bit que são particionados
entre os warps*, e um cache de dados
paralelo ou memória compartilhada que é
particionado entre os blocos de threads e é
utilizado para implementar a memória local
do OpenCL.
– *Warps: grupo de 32 threads paralelas, criadas e gerenciadas por um multiprocessador
OpenCL na Arquitetura CUDA – Compilação: PTX
• Kernels escritos em C OpenCL são compilados
em PTX(Parallel Thread Execution), que é o
conjunto de instruções CUDA.
• Exemplo:
• A representação intermediára PTX pode ser obitida pela
chamada clGetProgramInfo() with CL_PROGRAM_BINARIES
OpenCL na Arquitetura CUDA – Compilação:
Volatilidade
• Somente após a execução de barrier(),
mem_fence(), read_mem_fence() ou
write_mem_fence() são feitas escritas para
uma memória global ou compartilhada de
uma thread garantindo ser visível para outras
threads.
OpenCL na Arquitetura CUDA – Compilação:
Volatilidade
• Exemplo: A primeira referência a myArray[tid]
compila em uma instrução de leitura global ou
compartilhada, mas a segunda referência não,
já que o compilador simplesmente reutiliza o
resultado da primeira
OpenCL na Arquitetura CUDA – Troca de Modo
• GPUs dedicam memória para a superfície
primária, a qual é usada para atualizar a saída
do dispositivo de visualização.
• Trocas de Modo são executadas, por exemplo,
quando o usuário muda a resolução ou bit
depth da visualização, ou quando aplicações
gráficas são exibidas.
OpenCL na Arquitetura CUDA – Troca de Modo
• Se uma Troca de Modo aumentar o tamanho
de memória necessária para a superfície
primária o sistema irá canabalizar mémoria
alocada por aplicações OpenCL.
• Isso resultada em uma chamada ao runtime
do OpenCL para falhar e retornar um erro de
contexto inválido.
Referências
• Nvidia Compute – PTX: Parallel Thread Execution ISA
Version 2.0
• Nvidia OpenCL Programming Guide for the CUDA
Architecture
• GPU Computing with MATLAB® & C/C++
[blog.accelereyes.com/blog/2010/05/10/nvidia-fermi-cudaand-opencl/]
• CUDA vs OpenCL: Which should I use?
[wiki.tiker.net/CudaVsOpenCL]
Download

OpenCL na Arquitetura CUDA