CUDA 上下文中模块的持久性
Posted
技术标签:
【中文标题】CUDA 上下文中模块的持久性【英文标题】:Persistence of modules in CUDA contexts 【发布时间】:2014-05-07 12:45:06 【问题描述】:我有一个 MATLAB mex 库,可以在运行时加载特定于问题的 cubin 文件。这个 mex 函数被 MATLAB 调用了几百次。当我调用 cuModuleLoad 时,CUDA 是否每次都重新加载内核?还是以某种方式缓存?如果没有,有没有办法在两者之间保留加载的模块?我目前没有调用 cuModuleUnload。
似乎只为 MATLAB 进程创建了一次 CUDA 上下文,因为只有第一次调用库很慢。随后对 mex 库的 matlab 函数调用速度很快。所以我想我可以假设相同的 CUDA 上下文正在被重用。
【问题讨论】:
问题MEX library lifecycle 可能很有趣。 【参考方案1】:简短的回答是肯定的,您可以重复使用它们。
MEX 文件中 C++ 中的全局/静态变量或静态成员仅在动态加载 MEX 文件时创建一次,只要它们不依赖于 Matlab 内存管理器(mxMalloc
、mxCreateNumericArray
等)。当 Matlab 退出或 MEX 文件被clear mex
卸载时,它们会被销毁。也可以用MEX API保护MEX文件:mexLock
防止意外卸载,mexAtExit
注册析构回调等。
【讨论】:
但每次调用时我都会在函数内部调用 cuModuleLoad。所以,我的问题是 CUDA 如何管理资源。 这是一个当你多次调用cuModuleLoad
时会发生什么的问题。检查 CUDA 文档。但是您可以通过使用标志或将其包装在类构造函数/析构函数中并将该实例设为静态来仅初始化一次 CUDA 资源。
我可以试试。这似乎肯定会导致一些问题,因为一段时间后,cuModuleLoad 失败,错误代码为 2(内存不足)。以上是关于CUDA 上下文中模块的持久性的主要内容,如果未能解决你的问题,请参考以下文章