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