Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade

Como Implementar Computação Heterogênea no Linux Usando OpenCL e CUDA

A computação heterogênea é uma abordagem que utiliza diferentes tipos de unidades de processamento, como CPUs, GPUs e outros aceleradores, para otimizar o desempenho de aplicações. No ambiente Linux, essa prática é altamente aplicável e pode ser implementada usando frameworks como OpenCL e CUDA. A seguir, vamos explorar como configurar e executar tarefas de computação heterogênea no Linux.


Exemplos:


1. Configurando o Ambiente OpenCL no Linux:


Primeiro, precisamos instalar os pacotes necessários para usar OpenCL. No Ubuntu, você pode fazer isso usando o seguinte comando:


   sudo apt-get install ocl-icd-opencl-dev

Em seguida, você pode verificar se o OpenCL está corretamente instalado e quais dispositivos estão disponíveis:


   clinfo

Este comando listará todas as plataformas e dispositivos OpenCL disponíveis no sistema.


2. Executando um Programa Simples em OpenCL:


Aqui está um exemplo de um programa simples em OpenCL que multiplica cada elemento de um vetor por 2:


   #include <CL/cl.h>
#include <stdio.h>
#include <stdlib.h>

const char *kernelSource =
"__kernel void vecAdd(__global int *a) {"
" int id = get_global_id(0);"
" a[id] *= 2;"
"}";

int main() {
int data[10];
for (int i = 0; i < 10; i++) data[i] = i;

// Setup OpenCL environment
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_command_queue queue;
cl_program program;
cl_kernel kernel;
cl_mem buffer;

clGetPlatformIDs(1, &platform, NULL);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);
queue = clCreateCommandQueue(context, device, 0, NULL);

buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(int) * 10, NULL, NULL);
clEnqueueWriteBuffer(queue, buffer, CL_TRUE, 0, sizeof(int) * 10, data, 0, NULL, NULL);

program = clCreateProgramWithSource(context, 1, &kernelSource, NULL, NULL);
clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
kernel = clCreateKernel(program, "vecAdd", NULL);

clSetKernelArg(kernel, 0, sizeof(cl_mem), &buffer);
size_t globalSize = 10;
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, NULL, 0, NULL, NULL);
clEnqueueReadBuffer(queue, buffer, CL_TRUE, 0, sizeof(int) * 10, data, 0, NULL, NULL);

for (int i = 0; i < 10; i++) printf("%d ", data[i]);
printf("\n");

clReleaseMemObject(buffer);
clReleaseKernel(kernel);
clReleaseProgram(program);
clReleaseCommandQueue(queue);
clReleaseContext(context);

return 0;
}

Compile o programa com:


   gcc -o vecAdd vecAdd.c -lOpenCL

Execute o programa com:


   ./vecAdd

3. Configurando o Ambiente CUDA no Linux:


Para usar CUDA, você precisa instalar o toolkit CUDA da NVIDIA. Siga as instruções no site oficial da NVIDIA para baixar e instalar o toolkit e os drivers necessários.


Após a instalação, você pode verificar a instalação do CUDA com:


   nvcc --version

4. Executando um Programa Simples em CUDA:


Aqui está um exemplo de um programa CUDA que multiplica cada elemento de um vetor por 2:


   #include <stdio.h>

__global__ void vecAdd(int *a) {
int id = blockIdx.x * blockDim.x + threadIdx.x;
a[id] *= 2;
}

int main() {
int data[10];
for (int i = 0; i < 10; i++) data[i] = i;

int *d_data;
cudaMalloc(&d_data, sizeof(int) * 10);
cudaMemcpy(d_data, data, sizeof(int) * 10, cudaMemcpyHostToDevice);

vecAdd<<<1, 10>>>(d_data);

cudaMemcpy(data, d_data, sizeof(int) * 10, cudaMemcpyDeviceToHost);
cudaFree(d_data);

for (int i = 0; i < 10; i++) printf("%d ", data[i]);
printf("\n");

return 0;
}

Compile o programa com:


   nvcc -o vecAdd vecAdd.cu

Execute o programa com:


   ./vecAdd

Esses exemplos mostram como configurar e executar tarefas de computação heterogênea no Linux usando OpenCL e CUDA. Ambas as abordagens permitem que você aproveite o poder das GPUs para acelerar suas aplicações.


To share Download PDF

Gostou do artigo? Deixe sua avaliação!
Sua opinião é muito importante para nós. Clique em um dos botões abaixo para nos dizer o que achou deste conteúdo.