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方法,但是不管怎样。

10-08 19:18