严格别名,CUdeviceptr和cuMemAllocManaged
Strict aliasing, CUdeviceptr, and cuMemAllocManaged
cuMemAllocManaged
要求作为其第一个参数提供的指针类型为CUdeviceptr *
(技术上是unsigned int *
),但是使用托管内存的要点是能够在主机和设备上操作相同内存地址中的数据。因此,为了能够在主机上操作托管数据,要么这些CUdeviceptr
必须在访问之前转换为适当的指针类型(例如float *
或double *
),要么主机必须存储正确类型的指针并转换为CUdeviceptr
。据我所知,前者显然违反了严格的混叠规则,但后者是否也一样,或者它仍然是安全的,因为严格混叠问题只发生在通过类型双关指针显式访问数据时?
换句话说,即使启用了严格混叠,与下面代码片段相似的模式是否安全?
float* turkey;
CUdeviceptr* goose = reinterpret_cast<CUdeviceptr*>(&turkey); // alternatively, (CUdeviceptr*)&turkey
// error checking code elided
cuMemAllocManaged(goose, sizeof(float)*10000, CU_MEM_ATTACH_GLOBAL);
// initialize turkey
// supply goose as an argument to a kernel function
cuCtxSynchronize();
// do stuff with turkey on host again
看起来这两种行为都没问题。浏览http://www.cocoawithlove.com/2008/04/using-pointers-to-recast-in-c-is-bad.html
需要明确的是,只有在单个作用域或函数中对两个指针解引用(或访问它们的共享数据)时才会出现这些错误。创建指针应该是安全的。
如果在任何给定的函数范围内,两个类型指针中只有一个将被解引用,则不会出现严格混叠的问题。
还有union
方法,但是不管怎样
相关文章:
- 没有找到相关文章