是否传递指向cudaHostRegister的指针,该指针不是页面对齐允许/可移植的?我问,因为simpleStream示例执行手动页面对齐,但我在文档中找不到此要求.也许这是一个可移植性问题(类似于mlock()支持linux上的非对齐,但POSIX一般不会)?
我更改为带宽测试并使用非对齐,但注册的内存执行与cudaHostAlloc返回的内存相同.由于我使用这些固定缓冲区来重叠复制和计算,我也对非对齐是否阻止它(迄今为止我无法检测到性能损失)感兴趣.
我所有的测试都是在x86-64 linux上进行的.
也许这是一个可移植性问题(类似于mlock()支持linux上的非对齐,但POSIX一般不会)?
双方的Linux的mlock和Windows的VirtualLock将锁定包含一个或多个字节,你要锁定的地址范围内的所有页面,则不需要手动对齐.但是正如您所指出的,POSIX允许实现要求参数与mlock页面对齐.特别是OS X的情况mlock是将页面未对齐的地址四舍五入到下一页边界,因此不会锁定整个地址范围.
文档cudaHostRegister没有提及对其参数的任何对齐约束.因此,此API的消费者有权期望在底层平台上的任何对齐问题是cudaHostRegister由用户而不是用户负责.但是,如果没有看到来源cudaHostRegister,就无法确定这是否真的如此.由于样品是故意手动处理对准,因此可能cudaHostRegister没有这种透明的对准固定功能.
因此,是的,可能编写的示例是为了确保其在CUDA(Windows,Linux,Mac OS X)支持的操作系统之间的可移植性.