我有以下情况:
两个线程处理两个共享相同上下文的 OpenCL 设备。每个线程加载不同版本的 OpenCL 设备代码,创建一个cl::Programm
实例并为其特定的cl::Device
. 但是,createKernels
成功构建程序后的功能失败,错误代码 -47 =
CL_INVALID_KERNEL_DEFINITION 如果由 kernel_name 给出的 __kernel 函数的函数定义(例如参数的数量),对于已构建程序可执行文件的所有设备,参数类型并不相同。
对于多个cl::Context
实例(每个设备一个),效果很好。如果我查看 OpenCL 类图(http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/classDiagram.html),我不明白为什么不能使用在一个上下文中具有多个内核的多个程序,因为它们可以通过关联的程序清楚地区分。
我在 CUDA SDK 5.5 中使用 Nvidia 的 OpenCL 实现。对我来说出现的问题是:
这是对 OpenCL 结构的普遍误解,并且有一条规则说上下文中的每个内核都必须有一个唯一的名称,还是 Nvidia 的非 OpenCL 标准之一确认了处理这个特定用例的方法?
我真的希望一个上下文中的多个设备能够使用从一个cl::Buffer
到另一个的复制,即使它们的内存驻留在不同的设备上。