我使用Khronos SDK在Windows上开发OpenCL 3.0应用程序,其中包括使用GPU处理存储在驱动器上的大量数据。为此,我使用了几个CPU线程,这些线程从驱动器读取、处理、发送到GPU,并将结果返回到驱动器上。一年多来,我一直使用这段代码,没有出现任何问题。但是在最近更新了我的Nvidia GPU驱动程序(从460版本的东西到最新的517. xx)之后,这个程序突然不能再工作了。我尝试了几个5XX范围内的老驱动程序,但都没有改变这种行为。
在研究了一下导致这种情况的原因之后,我发现OpenCL调用了lock(即使是那些应该是非阻塞的),并且永远不会返回。如果所有的调用都在一个线程上完成,一切都很好,但是任何后续的线程都不会从它的第一次调用中返回。
举一个简单的例子,只要创建几个线程,每个线程创建一个OpenCL队列,第一个执行的线程就可以正常工作,但是所有其他线程都不会从clCreateCommandQueue调用返回。
我在两台PC上测试了它,一台GTX 1650和一台RTX 3070 TI,经过一周的努力想出解决方案,并在网上搜索类似的问题,我什么也没找到。
谢谢你读我,如果有人知道什么可能是问题,或者可以证明我不是唯一一个面临它?
提前感谢!
**TLDR:**OpenCL与任何最新的Nvidia驱动程序一起使用时,如果从多个CPU线程调用,则会导致我的clCreateCommandQueue(和其他cl调用)永远不会返回。
1条答案
按热度按时间j5fpnvbx1#
我这里有一个代码示例。
这并不是最小的,因为只有在cl上下文中出现ocl错误时,我才会得到eba04348所描述的行为。
我已经向nvidia提交了一个bug。