过去,我曾经通过Cublas(一种高级API)进行GPU编程。现在,我尝试编写如下的新手代码,但我有几个问题。
#include <stdio.h>
__global__ void helloFromGPU()
{
printf("Hello World from GPU!\n");
}
int main()
{
printf("Hello World from CPU!\n");
helloFromGPU <<<1, 10>>>();
cudaDeviceReset();
return 0;
}
在这种情况下,我在内核函数之后调用CudaDeviceReset()。我发现如果删除此行,将无法获得输出消息。我不明白原因。我看到cudaDeviceReset()
是要破坏Cuda上下文并重置设备。这是否意味着该函数还会刷新我的输出缓冲区?
还有一个问题,如果我删除此行,则屏幕上没有任何输出。我相信这是因为我的程序在GPU的输出到达屏幕之前就已经超时了。是吗?
答案 0 :(得分:4)
您已经找到原因。 要使内核结果对代码可见,您需要等待它完成。
cudaDeviceReset()是执行此操作的函数之一,但是将来您将要使用
cudaDeviceSynchronize()
或类似的API函数,可让您等待内核完成而无需重置GPU。