过去,我经常通过Cublas进行GPU编程,Cublas是一种高级API。现在,我尝试编写一个新手代码如下,我有几个问题。
#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输出到我的屏幕。是那么回事吗?
发布于 2019-01-24 07:37:57
你已经知道为什么会这样了。要使您的内核的结果在代码中可见,您需要等待它完成。
cudaDeviceReset()是实现这一目的的函数之一,但是对于将来您需要使用
cudaDeviceSynchronize()
或者类似的API函数,它可以让您在不重置GPU的情况下等待内核完成。
https://stackoverflow.com/questions/54340378
复制相似问题