使用来自多个主机线程的不同 OpenCL 命令队列
Using different OpenCL command queues from multiple host threads
同一个 OpenCL 程序在不同的 OpenCL 设备上编译,可能在不同的平台上。为每个设备创建一个命令队列。因此,例如可能有两个队列,一个用于 CPU,一个用于 GPU。
是否可以从不同的主机线程(每个命令队列一个)在两个命令队列上调用 clEnqueueNDRangeKernel
然后 clEnqueueReadBuffer
(阻塞)?
例如使用 OpenMP,循环如
// queues_ contains command queues for different contexts,
// each with one device on one platform (e.g. CPU and GPU)
#pragma omp parallel for num_threads(2) schedule(dynamic)
for(int i = 0; i < job_count; ++i) {
cl::CommandQueue& queue = queues_[omp_get_thread_num()];
// queue is for one device on one platform
// euqueue kernel, and read buffer on queue
}
这会将作业列表分为 CPU 和 GPU 两个块。 schedule(dynamic)
将使调度动态适应内核的执行时间。
主机代码将花费大部分时间等待内核(在阻塞的 clEnqueueReadBuffer
调用中。)但是由于 CPU 设备,CPU 实际上会忙于执行内核(在 OpenCL 中),同时等待 GPU 完成(在主机代码中)。
如果上下文也不同,那么它们将独立工作,即使使用 3D 应用程序也是如此。根据实现,两个上下文可以被驱动程序抢占或超线程化,但您可以进一步在上下文之间添加基于事件的同步,以便 queue-a 中的一项等待 queue-b 中的一项完成。
如果它们生活在相同的上下文中,您可以使用驱动程序或 api 性能操作在两个队列之间进行隐式同步。
将 cpu 的所有核心用于内存绑定内核不会让它足够快地进行阵列复制到 gpu 和从 gpu 复制,除非您使用直接内存访问复制时设置 cpu 没有复制指令.如果缓存足够大和足够快,也许它不需要这样的东西。
同一个 OpenCL 程序在不同的 OpenCL 设备上编译,可能在不同的平台上。为每个设备创建一个命令队列。因此,例如可能有两个队列,一个用于 CPU,一个用于 GPU。
是否可以从不同的主机线程(每个命令队列一个)在两个命令队列上调用 clEnqueueNDRangeKernel
然后 clEnqueueReadBuffer
(阻塞)?
例如使用 OpenMP,循环如
// queues_ contains command queues for different contexts,
// each with one device on one platform (e.g. CPU and GPU)
#pragma omp parallel for num_threads(2) schedule(dynamic)
for(int i = 0; i < job_count; ++i) {
cl::CommandQueue& queue = queues_[omp_get_thread_num()];
// queue is for one device on one platform
// euqueue kernel, and read buffer on queue
}
这会将作业列表分为 CPU 和 GPU 两个块。 schedule(dynamic)
将使调度动态适应内核的执行时间。
主机代码将花费大部分时间等待内核(在阻塞的 clEnqueueReadBuffer
调用中。)但是由于 CPU 设备,CPU 实际上会忙于执行内核(在 OpenCL 中),同时等待 GPU 完成(在主机代码中)。
如果上下文也不同,那么它们将独立工作,即使使用 3D 应用程序也是如此。根据实现,两个上下文可以被驱动程序抢占或超线程化,但您可以进一步在上下文之间添加基于事件的同步,以便 queue-a 中的一项等待 queue-b 中的一项完成。
如果它们生活在相同的上下文中,您可以使用驱动程序或 api 性能操作在两个队列之间进行隐式同步。
将 cpu 的所有核心用于内存绑定内核不会让它足够快地进行阵列复制到 gpu 和从 gpu 复制,除非您使用直接内存访问复制时设置 cpu 没有复制指令.如果缓存足够大和足够快,也许它不需要这样的东西。