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

时间:2012-05-27 18:22:54

标签: c++ ubuntu opencl nvidia dlopen

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

Zistack

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

编辑:我最近发现了一些有趣的事情:Here是来自Khronos的icd加载器的规范。它说:

  

成功加载供应商ICD的库后,   ICD Loader从库中查询以下函数:   clIcdGetPlatformIDsKHR,clGetPlatformInfo和   clGetExtensionFunctionAddress。如果有这些功能   如果没有,则ICD Loader将关闭并忽略   图书馆。

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

  

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

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

1 个答案:

答案 0 :(得分: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,因此没有这种设置的驱动程序。但是,安装大黄蜂并使用optirun运行我的程序就像一个魅力。