#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内核,我可以要求GPU执行。无论如何,我都不想修改内核代码(包括一个陷阱)。
有没有办法杀死这样一个正在运行的内核?
我打算自动生成内核(遗传编程)。这些内核可能具有需要很长时间才能完成的行为。如果我可以在内核运行时杀死它,那么我可以维护一个计时器并根据需要杀死它。
在CUDA应用程序抛出异常后,CUDA文档不清楚内存数据如何变化.
例如,内核启动(动态)遇到异常(例如Warp超出范围的地址),将停止当前的内核启动.在此之后,设备上的数据(例如__device__变量)是否仍然保留,或者它们是否与例外一起被删除?
一个具体的例子是这样的:
有人能说明这背后的理由吗?
我有一个内核,可能asm("trap;")在内核内部调用。但是,发生这种情况时,CUDA错误代码设置为启动失败,我无法重置它。
在CUDA Runtime API中,我们可以cudaGetLastError用来获取最后一个错误,同时将其重置为cudaSuccess。
是否可以使用Driver API做到这一点?