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