Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Um exemplo completo
Multiplicação de matrizes
Agora vamos analisar um exemplo completo de multiplicação de matrizes em C++ que envia dados para processamento e os recebe de volta. Além das diferenças inerentes da linguagem, temos algumas novidades em relação ao nosso exemplo anterior.
O kernel é criado na seguinte linha:
// Create the compute kernel from the program
cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer> naive_mmul(program, "mmul");
Depois, ele é invocado diretamente pelo seu nome, mas antes declaramos um objeto NDRange
que estipula suas dimensões e tamanhos:
cl::NDRange global(N, N);
naive_mmul(cl::EnqueueArgs(queue, global), N, d_a, d_b, d_c);
Os kernels OpenCL podem trabalhar com 1, 2 ou 3 dimensões. Neste exemplo, estamos usando 2 dimensões e cada instância do kernel vai calcular um único elemento da matriz. Observe no código do kernel que está na última aba as seguintes linhas:
int i = get_global_id(0);
int j = get_global_id(1);
A função get_global_id
retorna um identificador único em cada dimensão (0
e 1
) para cada uma das N x N execuções, cobrindo toda a matriz.