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