请问一下,我要使用锁页内存或者0拷贝内存,那岂不是要把数据拷到这些内存里面去,那岂不是和传输差不多了,意义在哪里

  • 2 replies
  • 134 views
*

sisiy

  • *****
  • 147
    • 查看个人资料
问题:请问一下,我要使用锁页内存或者0拷贝内存,那岂不是要把数据拷到这些内存里面去,那岂不是和传输差不多了,意义在哪里?例如我是封装成dll的,别人把数据指针丢给我,我还要复制到锁页或0拷贝内存里面去,和直接复制到gpu有多大区别吗


*

sisiy

  • *****
  • 147
    • 查看个人资料
回答:往内存中写入东西,和从内存传输到显存。这是两个独立话题。关键在于page-locked memory能同时在多个流中异步传输,这点对于安排逻辑和充分利用copy engines/计算单元 同时进行,非常重要。你可以理解成普通的内存的传输,是内部自动转换成了一次到一个小的page-locked memory,然后再次传输的过程。因为只有1个这种缓冲区,所以往往不如你手工安排的好。

*

sisiy

  • *****
  • 147
    • 查看个人资料
针对你在QQ群里说就是有9张图片,拷贝加分别滤波耗费我90ms的问题,那就需要改变方式了:

不能别人给你的dll(中的函数)传递一个他分配的指针,含有数据。你需要额外提供一个分配函数给用户,例如void* GetBuffer(), 手工在此函数中分配好page-locked memory给用户,然后让用户就地填充数据,这样你再次拿到指针的时候,可以直接按照page-locked的来用(包括进行异步传输,或者就地zero-copy)。

此外,第二种做法则是不改变你的dll的导出函数(还是原本那个,无需增加额外的),而是就地在此函数中,尝试进行cudaHostRegister(), 以将page-able的转换成page-locked的。但是这种方式实际上并不可控(可能会导致多次换页操作,进行磁盘方式,特别是对于小内存的机器)。所以仅当一种快速解决方案。正式的项目依然建议上面的方案一的。



« 最后编辑时间: 七月 18, 2019, 03:48:39 pm 作者 屠戮人神 »