错误:运行OpenCL代码时clGetPlatformIDs -1001(Linux)

Mic*_*ina 6 linux nvidia opencl

在最终设法让我的代码用OpenCL编译之后,我似乎无法让输出二进制文件运行!这是在我的Linux笔记本电脑上运行Kubuntu 13.10 x64

我得到的错误是(从cl :: Error打印):

ERROR: clGetPlatformIDs
-1001
Run Code Online (Sandbox Code Playgroud)

我找到了这篇文章,但似乎没有一个明确的解决方案.

我把自己加入了视频组,但这似乎不起作用.

关于ICD配置文件......我不确定我需要做什么 - 这不应该包含在cuda工具包中吗?如果没有,我在哪里下载一个?

编辑:我的系统中似乎有一个ICD文件在/usr/share/nvidia-331/nvidia.icd下.它包含以下文本:

libnvidia-opencl.so.1
Run Code Online (Sandbox Code Playgroud)

我系统中唯一类似于此的文件是:

/usr/lib/nvidia-331/libnvidia-opencl.so.331.20
Run Code Online (Sandbox Code Playgroud)

我的ICD资料有点不对吗?有谁知道修复它的方法?

Mic*_*ina 2

(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
Run Code Online (Sandbox Code Playgroud)

注意:在大多数情况下,您需要将 nvidia-331 替换为您正在使用的任何驱动程序 - 最常见的是 nvidia-current

我真的很好奇为什么在安装 cuda 工具包时不会自动完成此操作 - 但我注意到如果没有此步骤,OpenCL 程序将无法运行!

Nvidia Optimus 与 Bumblebee

工作起来如此复杂的原因是我有一台 nvidia optimus 笔记本电脑,在 Linux 上的驱动程序支持很差。为了解决这个问题,我安装了bumblebee,以允许在我的 nvidia 卡和 intel 卡之间切换。

但是,因为我使用的是 bumblebee - 除非明确告知,否则 nvidia 显卡(和 nvidia 驱动程序)将被卸载。为了使用OpenCL,我们需要打开nvidia显卡。

为此,我们需要使用optirun以下命令明确告诉 bumblebee 打开 nvidia 卡primusrun

optirun myopenclprogram
Run Code Online (Sandbox Code Playgroud)

但请注意,因为重要的是 nvidia 卡已打开并加载了驱动程序,所以您不需要继续使用optirun myprogram它来使其工作(因为这总是涉及等待显卡初始化的初始延迟) )。

例如,您可以运行optirun kate,这将打开 nvidia 显卡。然后,您可以在单独的终端中运行 opencl 程序而不需要 optirun,它会正常工作,因为显卡已经打开(并且只要您让 kate 运行,就会保持打开状态)。

您会发现,这次启动您的程序没有任何延迟!这可以节省您大量的等待时间 - 特别是如果您正在开发相关的 opencl 程序。

再次强调,只要你保持 nvidia 显卡开启,你的 opencl 程序就可以工作。

我可能会联系大黄蜂开发人员,看看是否有更简单的方法来让它工作并报告他们在这里所说的内容。希望有某种方法可以打开和关闭 nvidia 卡,而不需要保持程序(如我的示例中的 kate)运行。

我希望这对将来尝试在带有 bumblebee 的 Linux 笔记本电脑上使用 OpenCL 的人有所帮助(我自己找不到任何明确的解决方案)

EDIT2:对于大黄蜂用户来说,打开和关闭显卡可以按如下方式完成:

打开显卡并加载 nvidia 模块

sudo tee /proc/acpi/bbswitch <<< ON
sudo modprobe nvidia
Run Code Online (Sandbox Code Playgroud)

关闭显卡(nvidia模块自动卸载)

sudo tee /proc/acpi/bbswitch <<< OFF
Run Code Online (Sandbox Code Playgroud)