我已经编写了一个cuda插件(动态库),并且我有一个用C编写的程序,它使用dlopen()来加载这个插件。我使用dlsym()从这个插件中获取函数。对于我的应用程序来说,非常重要的一点是,在加载插件的任何时候,程序都会通过dlopen()调用获得一个新的句柄(库文件可能随后会被修改)。因此,在使用插件中的函数之后,我调用dlclose()。调用dlopen() - dlsym() - dlclose()发生在我的程序执行期间(在循环中)。
如果我在装有NVIDIA驱动程序256.35 (CUDA3.0或3.1)的计算机上工作,我有一个内存泄漏(我在我的插件cudaMemGetInfo()中调用诊断)。如果我在装有NVIDIA驱动程序195.36.15 (CUDA 3.0)的计算机上工作,则在程序执行一段时间后会出现错误:“NVIDIA:无法打开设备文件/dev/nvidia0 (打开的文件太多)。”
如果我不使用dlclose()调用,程序就可以正常工作,但在这种情况下,我不能在程序执行期间将插件替换为新的插件。
有人遇到过这个问题吗?谢谢。
发布于 2010-09-23 23:31:49
没有人在CUDA上写插件吗?
我在CUDA SDK上找到了类似的例子:matrixMulDynlinkJIT。我在代码中做了一些小的修改。特别是,在文件cuda_drvapi_dynlink.c中,我更正了cuInit()函数:
CUDADRIVER CudaDrvLib = NULL;
CUresult CUDAAPI cuInit(unsigned int Flags)
{
//CUDADRIVER CudaDrvLib;
CUresult result;
int driverVer;
if (CudaDrvLib != NULL) {
dlclose (CudaDrvLib);
CudaDrvLib = NULL;
}
.......
}在文件matrixMulDynlinkJIT.cpp中,我在main()函数中添加了循环:
int main(int argc, char** argv)
{
printf("[ %s ]\n", sSDKsample);
while (1) {
// initialize CUDA
CUfunction matrixMul = NULL;
cutilDrvSafeCallNoSync(initCUDA(&matrixMul, argc, argv));
.....
}//while (1)
cutilExit();
}因此,我遇到了与我的程序相同的问题(在执行了一段时间后):“NVIDIA:无法打开设备文件/dev/nvidia0 (打开的文件太多)。”但是,当我注释掉cuda_drvapi_dynlink.c文件中的dlclose()时-一切正常
我不能理解这种行为。有什么想法吗?
https://stackoverflow.com/questions/3767578
复制相似问题