注册大于4MB的虚拟连续Memchunks导致无效参数错误

时间:2017-07-04 15:43:50

标签: memory-management cuda linux-device-driver

我的任务是在我的专有PCIe设备中分配Linux内核内存的BIG内存块,使用mmap / mmap64将其映射到用户空间,然后将其注册到Cuda,并使用cudaHostRegister作为几乎连续的内存块。

将cudaHostRegisterPortable更改为cudaHostRegisterIoMemory可以解决我之前报告过的问题(有关详细信息,请参阅https://devtalk.nvidia.com/default/topic/1014391/registering-mapped-linux-character-device-memory-with-cudahostregister-results-in-invalid-argument/Registering Mapped Linux Character Device Memory with cudaHostRegister Results in Invalid Argument)。

但是,我观察到以下行为:

如果我分配大小为< = 4MB的Linux内核内存块,将它们映射到用户空间(使用mmap / mmap64)并最终使用cudaHostRegister将它们注册到Cuda设备上工作正常,但是,如果我分配的块大于4MB cudaHostRegister结果具有相同的错误"无效的参数"。更重要的是,如果我映射&注册一个大小超过4MB的内存块,但是将cudaHostRegister中的size参数更改为< = 4MB它仍能正常工作。

CUDA Runtime API声明如下:

  

" cudaHostRegisterIoMemory:传递的内存指针被视为   指向一些存储器映射的I / O空间,例如,属于a   第三方PCIe设备,它将标记为非缓存相干和   。连续的"

据我所知,Linux内核中的物理连续内存块可能高达4MB,但是,由于重新映射这些块,可以使用连续的虚拟内存(提供给用户空间),因此从cudaHostRegister的角度来看,这个内存是连续的。 更重要的是,为了消除非连续的"内存问题我已经将内核MAX_ORDER参数更改为9,这使得4MB内存块在物理上不连续(由两个pfns组成)并重新映射到几乎连续的用户空间透视内存数组,并且仍然是cudaHostRegister没有导致& #34;无效的论点"错误和"完成了工作"很好。

从上面我怀疑cudaHostRegister只是在一些"硬编码"方式返回这样的错误,但我希望你能更多地帮助它。 附上了我认为可能有用的strace日志。 从这些日志文件中可以看出,区别在于ioctl(fd,0xc0304627,arg_ptr)命令,其中fd是dev / nvidia0文件的文件描述符。之后在FourMBFrame.log成功流程中,下一个命令是ioctl(ffd,0x21,argg_ptr),而"失败" path - FiveMBFrame.log报告"无效参数"错误。

请告知。

P.S。 我找不到附加日志的方法,可以从https://devtalk.nvidia.com/default/topic/1016845/cuda-programming-and-performance/registering-virtually-contiguous-memchunks-larger-than-4mb-results-in-invalid-parameter-error/

中的原始问题下载这些日志。

0 个答案:

没有答案
相关问题