Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Programação de Kernel SYCL - A API single_task
Declare o kernel vector_addition
Descrição
Por especificação, um tipo sem nome é um argumento de modelo inválido para classes usadas para nomear kernels SYCL. Portanto, você precisa pelo menos declarar a classe do kernel antes de usá-la.
Os exemplos a seguir são nomes de kernel SYCL válidos:
// class
class MyKernelClass;
// struct
struct MyKernelStruct;
// enum class
enum class MyKernelEnum : int;
Tarefa
Mais adiante, declare o functor da classe vector_addition
antes do ponto de entrada int main
da aplicação.
Localização no código fonte:
// <<Declare vector_addition kernel function object>>
Dica
class vector_addition;
Implemente o kernel vector_addition
Descrição
Agora precisamos enfileirar o kernel de adição de vetores para execução.
Um kernel que é executado em uma thread usando NDRange(1,1,1)
pode ser enfileirado usando a API cl::sycl::single_task
:
single_task<typename kernel_lambda_name>([=](){});
Isso é equivalente à execução de um kernel em uma única unidade de computação com um único grupo de trabalho de apenas um item de trabalho. Assim, podemos acessar os valores dos objetos acessadores diretamente usando o índice 0
da seguinte maneira:
// e.g, assign accessor element in the kernel body
acc[0] = someValue;
Tarefa
Complete o código do kernel de adição de vetores em que os acessadores de a
, b
, c
disponibilizam os vetores para o cálculo de c = a + b
.
Localização no código fonte:
// <<Complete the vector addition computation>>
Dica
c_acc[0] = a_acc[0] + b_acc[0];