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]