2

我最近在我的 Ubuntu 12.04 机器上玩过 OpenCL。当我打电话时cl::Platform::get,我得到一个错误代码 -1001。经过一番研究,我发现当 c 调用getPlatformIDs未能找到有效平台时会发生这种情况,并且当您的 /etc/OpenCL/vendors/ 目录中没有 .icd 文件或实现时会发生这种情况(s ) 文件引用的文件无法通过调用来打开dlopen
然而,我已经测试了所有这些可能性。在 /etc/OpenCL/vendors/ 中,我找到了 nvidia.icd,其中包含“libcuda.so”行。然后我尝试调用dlopen这个文件名,并成功了。然而,我的程序仍然返回 -1001 的错误代码!我的 nvidia 驱动程序在所有其他方面都运行良好,并且我能够编译该程序。什么可能是错的?

齐斯塔克

编辑:额外信息:我正在使用 nvidia-current-dev 驱动程序。我正在运行 nvidia GeForce GT 540M。

编辑:我最近发现了一些有趣的东西: 是来自 Khronos 关于 icd 加载器的规范。它说:

成功加载供应商 ICD 的库后,ICD 加载器会从库中查询以下函数:clIcdGetPlatformIDsKHR、clGetPlatformInfo 和 clGetExtensionFunctionAddress。如果这些函数中的任何一个不存在,则 ICD 加载器将关闭并忽略该库。

这是一个实现 icd 加载器试图加载 nvidia 平台的人的帖子它说:

我可以使用 dlsym() 从 libcuda.so 获取 clGetExtensionFunctionAddress 和 clGetPlatformInfo,然后我可以使用 clGetExtensionFunctionAddress 检索 clIcdGetPlatformIDsKHR。

在我的实验中,我只能成功查询 3 个函数中的 2 个 -clGetPlatformInfoclGetExtensionFunctionAddress. 另一个失败了,正如论坛帖子所暗示的那样:作者继续说他们clGetExtensionFunctionAddress用来检索clIcdGetPlatformIDsKHR. 如果由 Khronos 实现的 ICD 加载器逐字遵循规范,那么它会失败是有道理的,因为查询clIcdGetPlatformIDsKHR会失败,并且库将被忽略。鉴于此,nvidia 的实现似乎并没有完全实现规范,除非有另一个我不知道的更新版本。然而其他人设法让 OpenCL 在他们的 nvidia 平台上正常工作。我错过了什么吗?

4

1 回答 1

2

我想通了,这个命令的输出说明了一切:

lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [GeForce GT 540M] (rev ff)

我有 Optimus 技术,因此我的系统默认使用 Intel VGA 控制器。因此,nvidia 平台是无效的,因为从我的程序的角度来看,软件没有附加硬件。不幸的是,没有简单的方法来告诉操作系统忽略英特尔芯片而只使用 nvidia 芯片,而且 nvidia 不喜欢在 linux 下支持 optimus,因此没有适用于此设置的驱动程序。然而,安装 bumblebee 并运行我的程序optirun就像一个魅力。

于 2012-08-12T23:40:23.227 回答