在处理一些 CUDA 运行时 api 调用以进行内存管理(如 cudaFree)时,不需要显式同步。 Is cudaDeviceSynchronize() required before cudaFree()?
现在,假设不是 CUDA api 调用,而是使用用户定义的分配器对象来分配和释放设备内存。
template<class Alloc>
void reduce(Alloc& alloc, ...){
size_t temp_storage_bytes = 0;
cub::DeviceReduce::Sum(nullptr, temp_storage_bytes, d_in, d_out, num_items);
void* d_temp_storage = alloc.allocate(temp_storage_bytes);
cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, d_in, d_out, num_items);
//synchronize before deallocate?
alloc.deallocate(d_temp_storage);
}
在deallocate之前应该使用显式同步吗?
在解除分配之前必须使用显式同步吗?
如果在调用解除分配时内核仍在使用内存,是否有可能导致问题的分配器实现?
例如,在链接的问题中,隐式同步的参数是虚拟地址空间的修改。 如果,例如,上面的代码示例是否会中断分配器是使用驱动程序端虚拟内存管理 https://developer.nvidia.com/blog/introducing-low-level-gpu-virtual-memory-management/ 实现的,而解除分配只会从虚拟地址范围中取消映射物理内存,但保持虚拟地址范围不变。