#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()。我看到了同样的结果。但我不知道它们之间的区别。
答案 0 :(得分:5)
cudaDeviceReset()
的角色已记录在案here
它用于销毁CUDA context,这意味着将删除所有设备分配。
我同意它似乎具有同步效果。但是,由于文档说明:
请注意,此功能会立即重置设备。
我认为依靠这种行为是不安全的。此外,文档还提到了在多线程应用程序中使用此功能的危险。因此,安全编码将决定:
使用设备同步(例如cudaDeviceSynchronize()
或cudaMemcpy()
等)
检索应用程序要保留的可能在设备分配中的任何数据,或者最近运行的内核可能已更新(在设备内存中)。
确保任何可能还有与之关联的设备活动的主机线程也被终止
确保在析构函数中可能具有设备活动的任何C ++对象都被正确销毁或超出范围
在应用程序关闭过程中调用cudaDeviceReset()
。
请注意,调用cudaDeviceReset()
作为应用程序关闭的一部分不应被视为必需。如果没有这样的习惯用法,很多应用程序都能正常运行