(Mods:我不确定这篇文章是否应该转移到 AskUbuntu,因为这是一个与 Linux bumblebee 相关的问题,而不是 OpenCL 本身?)
好的,经过大量的努力,我设法解决了这个问题。
我需要做两件事:
让 ICD 发挥作用
创建一个从 /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 与 Bumblebee
工作起来如此复杂的原因是我有一台 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 程序就可以运行。
我可能会联系 Bumblebee 开发人员,看看是否有更简单的方法可以让它发挥作用,并在此处报告他们所说的内容。希望有一些方法可以打开和关闭 nvidia 卡,而无需保持程序(如我的示例中的 kate)运行。
我希望这对将来尝试在带有 bumblebee 的 Linux 笔记本电脑上使用 OpenCL 的人有所帮助(我自己找不到任何明确的解决方案)
EDIT2:对于大黄蜂用户来说,开启和关闭显卡的操作如下:
打开显卡并加载nvidia模块
sudo tee /proc/acpi/bbswitch <<< ON
sudo modprobe nvidia
关闭显卡(自动卸载nvidia模块)
sudo tee /proc/acpi/bbswitch <<< OFF