我有一个现有的Linux应用程序,我想用CUDA加速。应用程序从另一个进程流入数据,对该数据应用一些信号处理操作,并将数据流出到后续进程(这个意义上的“进程”是指操作系统意义上的术语)。
用于流式传输数据的IPC方法由我的应用程序运行的框架决定。也就是说,命名共享内存块在每个进程之间用作循环缓冲区:当我的应用程序在其输出中有可用数据时,它以循环方式将其写入共享内存块。
为了获得我的应用程序的CUDA版本的最大吞吐量,我想重叠以下所有内容:
N
个输入数据块复制到设备。N-1
- 输入数据块的处理。N-2
个输出数据块从设备复制到主机。据我所知,要实现与所有这些操作的重叠,我必须在主机上使用固定内存。但是,我的输入/输出共享内存缓冲区是由框架分配的,这是我无法控制的;我不能让它分配固定内存。我可以复制到中间缓冲区,但这会增加我的应用程序的内存占用,这是不可取的。理想情况下,我想改为固定现有的共享内存缓冲区。
有没有一种方法,给定一个任意的虚拟内存块,我可以固定它,使其适合与异步重叠的CUDA内存副本一起使用?基于其手册页,mlock()
函数听起来像它可能做我想要的。这里有什么陷阱吗?