Em CUDA, iniciar um kernel significa especificar seus argumentos, organizados por meio de uma matriz de ponteiros:
CUresult cuLaunchKernel (
CUfunction f,
/* launch config stuff */,
void** kernelParams,
/* snip */ );
CUresult cuLaunchKernelEx (
const CUlaunchConfig* config,
CUfunction f,
void** kernelParams,
/* snip */ ) ;
e após o lançamento - você ainda tem aquele conjunto de ponteiros para valores de argumentos, e você pode fazer o que quiser com ele: iniciar novamente, alterar e então iniciar etc.
No OpenCL, porém, os argumentos do kernel são definidos um por um e de forma opaca:
cl_int clSetKernelArg(
cl_kernel kernel,
cl_uint arg_index,
size_t arg_size,
const void* arg_value);
Então, você define, define, define algumas vezes, então inicia o kernel (usando clEnqueueNDRangeKernel()
). O aspecto interessante disso é que cl_kernel
não representa apenas um pedaço de código executável do lado do dispositivo, mas sim um estado adicional, incluindo os argumentos que você definiu.
Minha pergunta é: Quais suposições posso fazer sobre esse estado e os argumentos que defini, após o lançamento de um kernel? Posso assumir que tudo está como estava antes do lançamento e posso alterar apenas alguns argumentos, mantendo o resto, para outro lançamento do mesmo kernel? Ou - eles são invalidados/perdidos de alguma forma e precisam ser totalmente definidos novamente? ... e talvez isso seja dependente da implementação?
Os argumentos do kernel têm garantia de persistir e não mudam, a menos que sejam substituídos.
Após o lançamento do kernel, todos os argumentos do kernel permanecem os mesmos.
Após substituir um argumento individual do kernel, somente esse argumento substituído será alterado e todos os outros argumentos do kernel permanecerão inalterados.