首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA插件dlopen

CUDA插件dlopen
EN

Stack Overflow用户
提问于 2010-09-22 16:37:40
回答 1查看 665关注 0票数 1

我已经编写了一个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()调用,程序就可以正常工作,但在这种情况下,我不能在程序执行期间将插件替换为新的插件。

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

EN

回答 1

Stack Overflow用户

发布于 2010-09-23 23:31:49

没有人在CUDA上写插件吗?

我在CUDA SDK上找到了类似的例子:matrixMulDynlinkJIT。我在代码中做了一些小的修改。特别是,在文件cuda_drvapi_dynlink.c中,我更正了cuInit()函数:

代码语言:javascript
复制
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()函数中添加了循环:

代码语言:javascript
复制
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()时-一切正常

我不能理解这种行为。有什么想法吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3767578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档