NVIDIA CUDA 4.0(此处假设为RC2)提供了一个很好的功能,即通过“普通”malloc函数锁定之前分配的内存范围。这可以使用驱动程序API函数来完成:
CUresult cuMemHostRegister (void * p, size_t bytesize, unsigned int Flags);
现在,使用运行时API完成了项目的开发。不幸的是,运行时API似乎不提供像cuMemHostRegister这样的函数。我真的想避免混合驱动程序和运行时API调用。
有没有人知道如何使用标准malloc分配先前分配的内存?不应使用标准的libc函数,因为页面锁定是为了快速传输到GPU而暂存内存,所以我真的想坚持“CUDA”。
谢
答案 0 :(得分:3)
4.0运行时API提供cudaHostRegister()
,它正是您所要求的。请注意,锁定的内存分配必须与主机页面对齐,因此您可能应该使用mmap()
或posix_memalign()
(或其中一个亲属)来分配内存。从标准cudaHostRegister()
传递malloc()
任意大小的分配可能会因参数无效而失败。