我的计算机配有Intel CPU和NVIDIA GPU,运行Windows 7.我有一个用NVIDIA CUDA编写的软件模块,另一个用OpenCL编写的模块。我想在CPU上运行OpenCL模块,使用英特尔OpenCL实现,同时使用CUDA模块。
在我的系统中,我首先安装了CUDA SDK,然后安装了英特尔的SDK。
我在Visual Studio 2012中编译了程序,指示链接器使用Intel的库(我根据intel提供的OpenCL头编译)。
然而,当我运行一个简单的程序来查询硬件时,我只能看到NVIDIA卡。
我尝试过修改Windows注册表和PATH变量。当我用“Dependecy Walker”查询依赖项时,我看到程序依赖于位于c:\ windows \ system32中的dll,它不是Intel dll所在的文件夹。我试过删除这个DLL,但我仍然看到这种依赖,我只能访问GPU。
关于可能发生的事情的任何想法?
答案 0 :(得分:2)
在Windows上,“OpenCL.dll” 由Khronos提供并由AMD,NVIDIA和Intel重新分发的ICD。
注册表引用了实际的驱动程序,ICD将它们全部枚举。
当您查询OpenCL平台时,您会看到每个安装的驱动程序(AMD,NVIDIA,Intel)都有一个。
在每个平台中都会有设备(或设备),例如,在NVIDIA平台上你会找到你的NVIDIA GPU,在英特尔平台下你会找到你的CPU。
不要替换OpenCL.dll
运行clinfo或GPU-Z以查看它看到的OpenCL平台和设备。
重新安装英特尔CPU驱动程序(2天前刚刚发布的新驱动程序)以确保安装了驱动程序。
注意:您的CPU需要SSE 4.2才能使Intel CPU驱动程序正常工作。
答案 1 :(得分:1)
您可以尝试Installable Client Driver (ICD) Loader。但是,如果它适用于Windows,我没有经验。
或强>
由于您不想将GPU与OpenCL一起使用,因此您只需将英特尔OpenCL.dll
复制到工作目录中即可。加载.dll
时,首先访问工作目录。因此,即使Nvidia OpenCL.dll
已安装到您的windows/system32
目录中,也会首先找到英特尔库,因此会加载。可能有更好的解决方案可能按需加载dll,如Dynamically load a function from a DLL所述,但作为一种快速解决方案,它应该可行。