我们在大型商业程序中使用Intel OpenCL 1.2,在单个Intel Haswell CPU / GPU上运行。可以想象,许多线程可能希望在不同的时间将GPU用于不同的功能。
所以我的问题:
允许多个用户使用单个设备是一个好主意吗?我们可能面临哪些并发症?
我正在考虑为所有用户设置针对设备和平台的公共上下文。然后他们将建立自己的程序,内核和队列。但我对设备行为感到紧张:我们真的可以在一个上下文中创建缓冲区,程序,队列,内核和内核args的非交互式孤岛吗?至少,我看到clSetKernelArg不是线程安全的。
答案 0 :(得分:0)
从个人经验来看,我可以说多线程没有问题,使用带有上下文的相同设备,在线程之间共享。有一些想法:
从单个程序创建多个内核 - 每个线程的每个内核。来自Khronos的报价:
clSetKernelArg可以安全地从任何主机线程调用,并且是安全的 只要并发呼叫在不同的呼叫上运行,就会重新呼叫 cl_kernel对象
但是,为每个线程创建单独的命令队列可能不合理 - 驱动程序线程将很难处理太多队列。这可能会严重影响您的应用程序性能。
如果您需要在线程之间对共享GPU数据进行编组访问,则可能会使用多个(可能重叠的)子对象对大型共享OpenCL内存对象进行切换。
希望它对你有所帮助。