什么是Cuda中cudaDeviceReset()的作用?

16
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
__global__ void funct(void){
      printf("Hello from GPU!\n");
}

int main(void){
         funct << < 2, 4 >> >();

for (int i = 0; i < 10; i++){
    cudaDeviceReset();
    //cudaDeviceSynchronize();
    printf("Hello, World from CPU!\n");

    }
return 0;
}

我认为 cudaDeviceReset 的作用是 cudamemcpy。在这种情况下,我们没有数字结果。因此,我们无法使用 cudamemcpy。但是我们使用 cudaDeviceReset 从内核返回四个“Hello from GPU!”的结果。

这样对吗?

后来我用 cudaDeviceSynchronize() 替换了 cudaDeviceReset()。我看到了相同的结果,但我不知道它们之间的区别。

1个回答

17

cudaDeviceReset()的作用在这里有记录。

它被用来销毁CUDA上下文,这意味着所有设备分配都将被移除。

虽然它看起来具有同步效果,但由于文档中指出:

请注意,此函数将立即重置设备。

我认为依赖这种行为是不安全的。此外,文档还提到了在多线程应用程序中使用此函数的危险。因此,安全编码应该遵循以下规则:

  1. 使用设备同步(例如cudaDeviceSynchronize()cudaMemcpy()等)。

  2. 检索应用程序想要保留的任何数据,可能在设备分配中,或最近运行的内核可能已经更新(在设备内存中)。

  3. 确保任何可能与设备活动相关联的主机线程也已终止。

  4. 确保任何可能在其析构函数中具有设备活动的C++对象已经正确销毁或超出作用域。

  5. 在应用程序关闭时调用cudaDeviceReset()

请注意,将cudaDeviceReset()作为应用程序关闭的一部分调用不应视为强制要求。许多应用程序可以在没有此习惯用法的情况下正常工作。

这个答案也可能会引起兴趣。


1
调用 cudaDeviceReset() 对于像 cuda-memcheck 这样的工具是必需的,因此在程序结尾包含它是一个好习惯。 - Mikhail
我刚刚查阅了文档,似乎只有在进行泄漏检测时才需要使用它。 - Robert Crovella
1
从我的初学时代开始,我记得这也是分析器所必需的,以下是Mark Harris的评论:https://devblogs.nvidia.com/pro-tip-clean-up-after-yourself-ensure-correct-profiling/ - Mikhail
再次,在特定的、非典型的情况下需要。 - Robert Crovella
这是否意味着如果我使用cudaDeviceReset,就不必使用cudaFree了? - Matan
1
这取决于您如何以及在哪里使用cudaFree以及用于什么目的。我们不太可能在评论中解决这个问题。 - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接