Prévia do material em texto
Introdução à programação CUDA Exercícios 1. O termo GPU foi criado pela Sony, empresa que desenvolve o PlayStation. Esse termo se referia ao chip gráfico para cálculos do console. Nas GPUs com suporte a CUDA, a quantidade de CUDA cores se refere a que? Você acertou! A. À capacidade de paralelização. A quantidade de CUDA cores é referente à capacidade de paralelização. Quanto mais CUDA cores a GPU tiver, maior será o número de operações que podem ser feitas em paralelo, assim, acelerando a execução das aplicações. A velocidade de processamento sequencial é a de frequência clock. A capacidade de armazenamento é relacionada com o host. A velocidade de acesso à memória e a banda disponível no barramento têm relação com as memórias da GPU. 2. Placas gráficas (GPUs) eram utilizadas apenas para melhorar os efeitos visuais de jogos e aplicações multimídia. Entretanto, em meados de 2008, pesquisadores perceberam que os recursos disponíveis nessas arquiteturas de computadores poderiam ser utilizados para processamento de propósito geral. As aplicações que obtêm os maiores ganhos de desempenho utilizando essas placas apresentam qual tipo de computação? Resposta correta. C. Cálculos simples e repetitivos. Cálculos simples e repetitivos são os que obtêm os melhores ganhos em GPUs. As GPUs possuem milhares de núcleos de execução, entretanto, esses são menos poderosos individualmente do que os de uma CPU. Assim, cálculos simples e repetitivos são os que melhor tiram proveito dessas placas. Aplicações com pouco uso de multitarefa ou com cálculos complexos em ordem não são paralelas o suficiente para ganhar desempenho utilizando GPUs. Aplicações que transferem muitos dados ou acessam a memória principal podem até ser paralelas, mas esses comportamentos serão gargalos, o que diminuirá consideravelmente o desempenho na GPU. 3. Durante a implementação de uma aplicação em CUDA, o desenvolvedor decide trechos de código que devem ser executados na CPU e trechos que devem ser executados na GPU. Na CPU, esses trechos são chamados de função. Por outro lado, na GPU, chamam-se kernel. Outra diferença fundamental é que na GPU, no momento da chamada do kernel, dois parâmetros de execução devem ser informados. Quais são esses parâmetros? Você acertou! D. Número de blocos e de threads por bloco. Os parâmetros da chamada do kernel são o número de blocos e o número de threads por bloco. Esses dois parâmetros indicam quantos conjuntos de computações serão feitos em paralelo, dividindo-se entre os núcleos de execução da GPU de forma otimizada. O número de CUDA cores é a quantidade de núcleos da GPU, o qual não foi solicitado. A memória global é definida pela desenvolvedora da GPU. O número de blocos é um dos parâmetros, mas o número de CUDA cores e a memória principal não são. 4. O processador e a GPU possuem cada um memórias próprias, as quais são comumente chamadas de memória do host e memória do device. Na linguagem Python, com Numba, para copiar os dados do host para o device, deve-se utilizar o comando: Você acertou! D. to_device. A alternativa correta é to_device. Esse é o método que deve ser chamado quando há um objeto na memória da CPU e se deseja copiá-lo para a memória da GPU. O comando syncthreads cria uma barreira que sincroniza as threads dentro de um bloco. O comando copy_to_host copia os dados do device para o host. Os comandos blockDim e threadIdx indicam o número de blocos e o identificador de threads, respectivamente. 5. Comandos de seleção como o se–então e o switch-case são evitados em kernels que executam em GPUs. Isso ocorre devido à arquitetura e à maneira de execução desses kernels. Quando um comando de seleção existe no kernel, para cada condição que necessite ser executada, um conjunto de threads vai executar paralelamente, porém, uma região após a outra, tornando a execução menos eficiente do que o convencional. Kernels que implementam a soma de matrizes e o problema SAXPI possuem um comando de seleção if (i < n). Qual é a razão para a existência dessa condição? Você acertou! A. Evitar que posições inexistentes do vetor sejam acessadas. A resposta correta é a que diz que o comando de seleção serve para evitar que posições inexistentes do vetor sejam acessadas. Quando se indica o número de blocos e threads por bloco que vão ser executados na GPU, esses valores multiplicados podem resultar em um número maior do que o número de elementos do vetor, por exemplo. Quando isso ocorre, adiciona-se um comando de seleção para filtrar quais threads vão executar e quais não vão. A indicação de quais são as threads do bloco em execução é feita utilizando-se as variáveis blockIdx e threadIdx. A sincronização das threads de diferentes blocos é feita utilizando-se o comando __syncthreads. Para calcular apenas as posições que o usuário deseja, seria necessário um vetor de máscara. Por fim, esse comando de seleção diminui o desempenho do kernel e não garante o desempenho máximo. Introdução à programação CUDA Exercícios