首页 文章

即使nvidia.icd存在且包含'libcuda.so',getPlatformIDs()也会返回-1001

提问于
浏览
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驱动程序在所有其他方面都运行良好,我能够编译该程序 . 什么可能是错的?

Zistack

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

编辑:我最近发现了一些有趣的东西:Here是来自Khronos的icd装载机的规格 . 它说:

成功加载Vendor ICD库后,ICD Loader将从库中查询以下函数:clIcdGetPlatformIDsKHR,clGetPlatformInfo和clGetExtensionFunctionAddress . 如果这些功能中的任何一个不存在,那么ICD Loader将关闭并忽略该库 .

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

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

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

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平台是无效的,因为我的程序没有附加到软件的硬件's point of view. Unfortunately there is no easy way to just tell the operating system to ignore the Intel chip and just use the nvidia one, and nvidia doesn'感觉就像在linux下支持optimus一样,所以没有这个设置的驱动程序 . 但是,安装大黄蜂并使用 optirun 运行我的程序就像一个魅力 .

相关问题