一个OpenCL设备可以在不同的线程上托管多个用户吗?

时间:2015-07-02 07:00:13

标签: multithreading opencl intel

我们在大型商业程序中使用Intel OpenCL 1.2,在单个Intel Haswell CPU / GPU上运行。可以想象,许多线程可能希望在不同的时间将GPU用于不同的功能。

所以我的问题:

  1. 允许多个用户使用单个设备是一个好主意吗?我们可能面临哪些并发症?

  2. 我正在考虑为所有用户设置针对设备和平台的公共上下文。然后他们将建立自己的程序,内核和队列。但我对设备行为感到紧张:我们真的可以在一个上下文中创建缓冲区,程序,队列,内核和内核args的非交互式孤岛吗?至少,我看到clSetKernelArg不是线程安全的。

1 个答案:

答案 0 :(得分:0)

从个人经验来看,我可以说多线程没有问题,使用带有上下文的相同设备,在线程之间共享。有一些想法:

从单个程序创建多个内核 - 每个线程的每个内核。来自Khronos的报价:

  

clSetKernelArg可以安全地从任何主机线程调用,并且是安全的   只要并发呼叫在不同的呼叫上运行,就会重新呼叫   cl_kernel对象

但是,为每个线程创建单独的命令队列可能不合理 - 驱动程序线程将很难处理太多队列。这可能会严重影响您的应用程序性能。

如果您需要在线程之间对共享GPU数据进行编组访问,则可能会使用多个(可能重叠的)子对象对大型共享OpenCL内存对象进行切换。

希望它对你有所帮助。