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

时间:2013-12-02 18:47:52

标签: linux opencl nvidia

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

我得到的错误是(从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个人资料有什么不对吗?有谁知道解决它的方法?

2 个答案:

答案 0 :(得分: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

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

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

Nvidia Optimus with Bumblebee

之所以如此复杂,以至于我有一台nvidia optimus笔记本电脑,在Linux上的驱动程序支持很差。为了解决这个问题,我安装了bumblebee以允许在我的nvidia卡和英特尔卡之间切换。

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

要做到这一点,我们需要明确告诉大黄蜂使用命令optirunprimusrun打开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

答案 1 :(得分:2)

分享一些添加信息。我在Ubuntu 13.10上安装了intel opencl版本。问题是一样的:-1001错误。我通过类似于前一篇文章的链接解决了它:

sudo ln -sf /opt/intel/opencl-1.2-3.2.1.16712/etc/intel64.icd /etc/OpenCL/vendors/nvidia.icd