我有一个现有的Linux应用程序,我想用CUDA加速 . 应用程序从另一个进程流入数据,对该数据应用一些信号处理操作,并将数据流出到后续进程(这个意义上的“进程”是指操作系统意义上的术语) .

用于流式传输数据的IPC方法由我的应用程序运行的框架决定 . 也就是说,命名共享内存块用作每个进程之间的循环缓冲区:当我的应用程序在其输出中有可用数据时,它以循环方式将其写入共享内存块 .

为了获得我的应用程序的CUDA版本的最大吞吐量,我想重叠以下所有内容:

  • N 输入数据块复制到设备 .

  • 设备对 N-1 输入数据块的处理 .

  • N-2 输出数据块从设备复制到主机 .

根据我的理解,要实现与所有这些操作的重叠,我必须在主机上使用固定内存 . 但是,我的输入/输出共享内存缓冲区是由框架分配的,这是我无法控制的;我不能让它分配固定内存 . 我可以复制到中间缓冲区,但这会增加我的应用程序的内存占用,这是不可取的 . 理想情况下,我想固定现有的共享内存缓冲区 .

有没有一种方法,给定一个任意的虚拟内存块,我可以固定它,使其适用于异步重叠的CUDA内存副本?基于其手册页, mlock() 函数听起来像它可能做我想要的 . 这里有什么陷阱吗?