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
答案 0 :(得分:1)
看起来这两种行为都很好。经过http://www.cocoawithlove.com/2008/04/using-pointers-to-recast-in-c-is-bad.html
要清楚,只有在单个范围或函数中取消引用两个指针(或以其他方式访问其共享数据)时,才会出现这些错误。只是创建指针应该是安全的。
鉴于在任何给定的函数范围中只有两个类型指针中的一个将被取消引用,因此不会出现与严格别名有关的问题。
还有union
方法,但无论如何。