我需要在主机中并行运行几个 C++11 线程(GCC 4.7.1)。他们每个人都需要使用一个设备,比如 GPU。根据 OpenCL 1.2 规范(第 357 页):
All OpenCL API calls are thread-safe75 except clSetKernelArg.
clSetKernelArg is safe to call from any host thread, and is safe
to call re-entrantly so long as concurrent calls operate on different
cl_kernel objects. However, the behavior of the cl_kernel object is
undefined if clSetKernelArg is called from multiple host threads on
the same cl_kernel object at the same time.
一种优雅的方法是使用 thread_local cl_kernel 对象,而我能想到的另一种方法是使用这些对象的数组,以便第 i 个线程使用第 i 个对象。由于我之前没有实现这些,我想知道这两者中的任何一个是否很好,或者是否有更好的方法来完成任务。
第三种方法可能是对单个 cl_object 使用互斥体并将其与事件处理程序相关联。然后线程可以等到事件完成。不确定这是否适用于多线程情况......