CUDA允许使用非对齐固定内存吗?

时间:2015-02-05 09:01:28

标签: cuda

是否传递了一个指向cudaHostRegister的指针,该指针不是页面对齐的允许/可移植的?我问,因为simpleStream示例执行手动页面对齐,但我在文档中找不到此要求。也许这是一个可移植性问题(类似于支持linux上不对齐的mlock(),但一般不支持POSIX)?

我更改为带宽测试并使用未对齐但已注册的内存执行与cudaHostAlloc返回的内存相同。由于我使用这些固定缓冲区来重叠复制和计算,我也对非对齐是否会阻止它(到目前为止我无法检测到性能损失)感兴趣。

我所有的测试都是在x86-64 linux上进行的。

2 个答案:

答案 0 :(得分:5)

  

也许它是一个可移植性问题(类似于支持linux上的非对齐的mlock(),但一般不支持POSIX)?

Linux's mlockWindows' VirtualLock都将锁定包含您要锁定的字节或更多字节范围的所有页面,不需要手动对齐。但正如您所指出的,POSIX允许实现要求mlock的参数与页面对齐。特别是OS X's mlock上的情况,将页面未对齐的地址整理到下一页边界,因此不会锁定整个地址范围。

cudaHostRegister的文档没有提及对其参数的任何对齐约束。因此,此API的消费者有权期望在基础平台上对齐的任何关注是cudaHostRegister的责任,而不是用户的责任。但是,如果没有看到cudaHostRegister的来源,就无法判断实际情况是否如此。由于样本是故意手动处理对齐,cudaHostRegister可能没有这种透明的对齐固定功能。

因此,是的,可能编写的示例是为了确保其在CUDA(Windows,Linux,Mac OS X)支持的操作系统之间的可移植性。

答案 1 :(得分:1)

我刚刚在旧的4.0 NVIDIA库中找到了以下几行......也许它对以后的问题很有帮助:

  

必须使用cudaMapHost标志创建CUDA上下文,以使cudaHostRegisterMapped标志生效。

     

可以在CUDA上下文中为不支持映射固定内存的设备指定cudaHostRegisterMapped标志。失败被推迟到cudaHostGetDevicePointer(),因为内存可以通过cudaHostRegisterPortable标志映射到其他CUDA上下文。

最后

  

指针ptr和大小必须与主机页面大小(4 KB)对齐。

因此它与主页大小有关。