在将设备内存释放回分配器之前是否需要同步?

时间:2021-03-15 07:00:57

标签: cuda

在处理一些 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/ 实现的,而解除分配只会从虚拟地址范围中取消映射物理内存,但保持虚拟地址范围不变。

0 个答案:

没有答案
相关问题