是否传递了一个指向cudaHostRegister的指针,该指针不是页面对齐的允许/可移植的?我问,因为simpleStream示例执行手动页面对齐,但我在文档中找不到此要求。也许这是一个可移植性问题(类似于支持linux上不对齐的mlock(),但一般不支持POSIX)?
我更改为带宽测试并使用未对齐但已注册的内存执行与cudaHostAlloc返回的内存相同。由于我使用这些固定缓冲区来重叠复制和计算,我也对非对齐是否会阻止它(到目前为止我无法检测到性能损失)感兴趣。
我所有的测试都是在x86-64 linux上进行的。
答案 0 :(得分:5)
也许它是一个可移植性问题(类似于支持linux上的非对齐的mlock(),但一般不支持POSIX)?
Linux's mlock
和Windows' 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)对齐。
因此它与主页大小有关。