内核启动后参数状态如何?是否需重置及OpenCL参数复用疑问
OpenCL内核启动后参数状态的疑问
CUDA与OpenCL内核参数传递的差异
在CUDA中,启动内核时需要通过指针数组指定参数,参数会被编组:
CUresult cuLaunchKernel ( CUfunction f, /* launch config stuff */, void** kernelParams, /* snip */ ); CUresult cuLaunchKernelEx ( const CUlaunchConfig* config, CUfunction f, void** kernelParams, /* snip */ ) ;
启动完成后,你仍然持有指向参数值的指针数组,可以随意操作:比如再次启动内核,或者修改部分参数后再启动等。
而在OpenCL中,内核参数需要逐个设置,且操作是不透明的:
cl_int clSetKernelArg( cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void* arg_value);
完成多次参数设置后,调用clEnqueueNDRangeKernel()启动内核。需要注意的是,cl_kernel不仅代表设备端的可执行代码,还包含额外状态——其中就包括已设置的参数。
核心问题与解答
问题
内核启动后,关于该状态及已设置的参数,可做出哪些假设?能否假设所有状态与启动前一致,仅修改部分参数后再次启动同一内核?还是这些参数会被失效/丢失,必须重新完整设置?这是否取决于具体实现?
解答
根据OpenCL官方规范,调用clEnqueueNDRangeKernel()启动内核不会修改cl_kernel对象的参数状态。也就是说,内核启动完成后,之前通过clSetKernelArg()设置的所有参数都会保留,你完全可以只修改需要变更的部分参数,然后再次调用clEnqueueNDRangeKernel()启动同一内核,不需要重新设置全部参数。
虽然理论上存在个别厂商实现可能有特殊行为,但这属于不符合规范的异常情况。从标准层面来讲,参数状态在启动后是稳定且可复用的,仅修改部分参数重新启动是合法且被支持的操作。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

