CUDA插件dlopen

时间:2010-09-22 08:37:40

标签: cuda

我编写了一个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()调用,程序运行正常,但在这种情况下,我无法在程序执行期间替换新的插件。

有人遇到过这个问题吗? 感谢。

1 个答案:

答案 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时 - 一切正常

我无法理解这种行为...... 有什么想法吗?