CUDA 是否允许非对齐固定内存?

Is non-aligned pinned memory allowed with CUDA?

是否将指针传递给页面未对齐的 cudaHostRegister allowed/portable?我问是因为 simpleStream 示例执行手动页面对齐,但我在文档中找不到此要求。可能是可移植性问题(类似于mlock()在linux上支持非对齐,但POSIX一般不支持)?

我更改为带宽测试并使用非对齐,但注册内存执行与 cudaHostAlloc 返回的相同。由于我将这些固定缓冲区用于重叠副本和计算,因此我也对非对齐是否可以防止这种情况感兴趣(到目前为止我无法检测到性能损失)。

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

Maybe it's a portability problem (similar to mlock() supporting non-aligned on linux, but POSIX does not in general)?

两者 Linux's mlock and Windows' VirtualLock will lock all pages containing a byte or more of the address range you want to lock, manual alignment is not needed. But as you noted, POSIX allows for an implementation to require the argument of mlock to be page-aligned. This is notably the case on OS X's mlock 都会 将页面未对齐的地址向上舍入 到下一个页面边界,因此不会锁定整个地址范围。

cudaHostRegister 的文档没有提及对其参数的任何对齐约束。因此,此 API 的消费者有理由期望底层平台上的任何对齐问题都是 cudaHostRegister 的责任,而不是用户的责任。但是没有看到 cudaHostRegister 的来源,就无法判断是否确实如此。由于示例是故意手动处理对齐,因此 cudaHostRegister 可能没有这种透明的对齐修复功能。

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

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

The CUDA context must have been created with the cudaMapHost flag in order for the cudaHostRegisterMapped flag to have any effect.

The cudaHostRegisterMapped flag may be specified on CUDA contexts for devices that do not support mapped pinned memory. The failure is deferred to cudaHostGetDevicePointer() because the memory may be mapped into other CUDA contexts via the cudaHostRegisterPortable flag.

最后

The pointer ptr and size size must be aligned to the host page size (4 KB).

所以这是关于主机页面大小。