在最终设法使我的代码可以使用OpenCL进行编译之后,我似乎无法使输出二进制文件运行!这是在我的运行Kubuntu 13.10 x64的linux笔记本电脑上
我得到的错误是(从cl::Error打印):
ERROR: clGetPlatformIDs
-1001
我找到了this post,但似乎没有一个明确的解决方案。
我将自己添加到视频组中,但这似乎不起作用。
关于ICD配置文件...我不确定该怎么做-cuda工具包中是否应该包含此文件?如果没有,我可以在哪里下载?
编辑:我的系统中似乎有一个ICD文件,位于/usr/share/nvidia-331/nvidia.icd下。它包含以下文本:
libnvidia-opencl.so.1
我的系统中唯一与此相似的文件是:
/usr/lib/nvidia-331/libnvidia-opencl.so.331.20
我的ICD个人资料有问题吗?有谁知道修复它的方法吗?
最佳答案
(Mods:我不确定这篇文章是否应该转移到AskUbuntu上,因为这是与Linux大黄蜂相关的问题,而不是与OpenCL本身相关的问题?)
好的,所以我经过大量的努力设法解决了这个问题。
我需要做两件事:
使ICD工作
创建从/usr/share/nvidia-331/nvidia.icd到/etc/OpenCL/vendors的符号链接(symbolic link)
sudo ln -s /usr/share/nvidia-331/nvidia.icd /etc/OpenCL/vendors
注意:在大多数情况下,您需要使用任何正在使用的驱动程序替换nvidia-331-最常见的是nvidia-current
我真的很好奇为什么在安装cuda工具包时无法自动完成此操作-但是我注意到,如果没有此步骤,OpenCL程序将无法正常工作!
Nvidia Optimus与大黄蜂
之所以如此复杂,是因为我有一台nvidia optimus笔记本电脑,该笔记本电脑对Linux的驱动程序支持不佳。为了解决这个问题,我安装了bumblebee以允许在我的nvidia卡和Intel卡之间切换。
但是,因为我使用的是大黄蜂-除非明确告知,否则nvidia图形卡(和nvidia驱动程序)将被卸载。为了使用OpenCL,我们需要打开nvidia显卡。
为此,我们需要使用
optirun
或primusrun
命令明确告知bumblebee打开nvidia卡:optirun myopenclprogram
但是请注意,因为重要的是打开了nvidia卡并加载了驱动程序,所以您无需继续使用
optirun myprogram
来使它起作用(因为这总是涉及等待图形卡被启动的最初延迟。初始化)。例如,您可以运行
optirun kate
,这将打开nvidia图形卡。然后,您可以在单独的终端中运行没有optirun的opencl程序,并且由于图形卡已经打开(并且只要保持例如kate的运行状态就保持打开状态)就可以正常运行。您将注意到这次启动程序没有延迟! 这样可以节省大量等待时间,尤其是在开发有问题的opencl程序时。
再一次,只要您保持nvidia显卡处于打开状态,您的opencl程序就可以运行。
我可能会联系大黄蜂开发人员,以查看是否有更简单的方法使它起作用并报告他们在这里所说的内容。希望有某种方法可以打开和关闭nvidia卡,而无需保持程序(例如我的示例中的kate)运行。
我希望这对将来尝试在带有大黄蜂的Linux笔记本电脑上使用OpenCL的人有所帮助(我自己找不到任何明确的解决方案)
EDIT2 :对于Bumlebee用户,可以按照以下步骤打开和关闭图形卡:
打开图形卡并加载nvidia模块
sudo tee /proc/acpi/bbswitch <<< ON
sudo modprobe nvidia
关闭图形卡(自动卸载nvidia模块)
sudo tee /proc/acpi/bbswitch <<< OFF
关于linux - 错误: clGetPlatformIDs -1001 when running OpenCL code (Linux),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20335579/