#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;
}
Run Code Online (Sandbox Code Playgroud)
我认为cudaDeviceReset的作用是cudamemcpy.这种情况我们没有数字的结果.所以我们无法使用cudamemcpy.但我们使用cudaDeviceReset返回四个"来自GPU的Hello!" 来自内核的结果.
是对的吗?
我用cudaDeviceSynchronize()替换了cudaDeviceRest().我看到了同样的结果.但我不知道他们之间的区别.
它用于销毁CUDA 上下文,这意味着将删除所有设备分配.
我同意它似乎具有同步效果.但是,由于文档说明:
请注意,此功能将立即重置设备.
我认为依靠这种行为是不安全的.此外,文档还提到了在多线程应用程序中使用此功能的危险.因此,安全编码将决定:
使用设备同步(例如cudaDeviceSynchronize()
,或cudaMemcpy()
等)
检索应用程序要保留的可能在设备分配中的任何数据,或者最近运行的内核可能已更新(在设备内存中).
确保任何可能还具有与之关联的设备活动的主机线程也将被终止
确保在析构函数中可能具有设备活动的任何C++对象都被正确销毁或超出范围
cudaDeviceReset()
作为应用程序关闭的一部分调用.
请注意,cudaDeviceReset()
不应将调用作为应用程序关闭的一部分进行调用.如果没有这样的习惯用法,很多应用程序都能正常运行