考虑以下主机功能:
uint64_t * SomeDevPtr =...
/* Where SomeDevPtr is a pointer pointed to some device memory address allocated by cudaMalloc(); */
uint32_t * SomeDevIntPtr = reintepret_cast<uint32_t *>(SomeDevPtr);
由于该函数,cudaMalloc
将自动满足一些对齐要求(我认为它与某个128字节的内存边界对齐),因此我认为SomeDevIntPtr
和SomeDevPtr
都应该是从GPU的全局内存中的相同物理内存地址开始,我对此是否正确?
我只是想确认一下,因为我写的一些函数依赖于它。
答案 0 :(得分:5)
指针的reinterpret_cast
到指针 does not(即不应该)更改基础数值(位模式表示)指针。
因此,存在任何对齐条件都不会受到那种演员的影响。
当然,可以将正确对齐的指针强制转换为不再具有正确对齐的类型。例如,正确对齐的float
指针不能均匀分割为4 float
偏移量(索引),无法正确地转换为CUDA的float4
指针设备使用。一些CUDA指针需要自然对齐。
您可能也对this question感兴趣。