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

时间:2016-03-15 13:10:24

标签: cuda

#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返回四个&#34;来自GPU的Hello!&#34;内核的结果。

是吗?

我用cudaDeviceSynchronize()替换了cudaDeviceRest()。我看到了同样的结果。但我不知道它们之间的区别。

1 个答案:

答案 0 :(得分:5)

cudaDeviceReset()的角色已记录在案here

它用于销毁CUDA context,这意味着将删除所有设备分配。

我同意它似乎具有同步效果。但是,由于文档说明:

  

请注意,此功能会立即重置设备。

我认为依靠这种行为是不安全的。此外,文档还提到了在多线程应用程序中使用此功能的危险。因此,安全编码将决定:

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

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

  3. 确保任何可能还有与之关联的设备活动的主机线程也被终止

  4. 确保在析构函数中可能具有设备活动的任何C ++对象都被正确销毁或超出范围

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

  6. 请注意,调用cudaDeviceReset()作为应用程序关闭的一部分不应被视为必需。如果没有这样的习惯用法,很多应用程序都能正常运行