我编写了一个cuda插件(动态库),我有一个用C语言编写的程序,它使用dlopen()来加载这个插件。我正在使用dlsym()从这个插件中获取函数。对于我的应用程序,非常重要的是,任何时候加载插件程序都会获得一个带有dlopen()调用的新句柄(库文件可能随后被修改)。 因此在使用我的插件中的函数后,我调用了dlclose()。调用dlopen() - dlsym() - dlclose()是在程序执行期间(在循环中)发生的。
如果我使用NVIDIA驱动程序256.35(CUDA 3.0或3.1)在计算机上工作,我有内存泄漏(我在我的插件cudaMemGetInfo()中使用,要求进行诊断)。 如果我使用NVIDIA驱动程序195.36.15(CUDA 3.0)在计算机上工作,我在程序执行一段时间后出错:“NVIDIA:无法打开设备文件/ dev / nvidia0(打开的文件太多)。”< / p>
如果我不使用dlclose()调用,程序运行正常,但在这种情况下,我无法在程序执行期间替换新的插件。
有人遇到过这个问题吗? 感谢。
答案 0 :(得分:1)
没有人在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(打开的文件过多)。”
但是当我在dlclose()
文件中注释掉cuda_drvapi_dynlink.c
时 - 一切正常
我无法理解这种行为...... 有什么想法吗?