CUDA编程——如何理解CUDADeviceSet()
过去,我经常通过Cublas(一种高级API)进行GPU编程。现在我试着写一个新手代码,如下所示,我有几个问题CUDA编程——如何理解CUDADeviceSet(),cuda,gpu,Cuda,Gpu,过去,我经常通过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>&g
#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。我发现如果我删除这一行,我就无法获得输出消息。我不明白原因。我看到CUDADeviceSet将破坏Cuda上下文并重置设备。这是否意味着该函数还刷新我的输出缓冲区
还有一个问题,如果我删除这一行,我不会得到任何输出到我的屏幕。我相信这是因为我的程序在GPU输出到我的屏幕之前就结束了。是这样吗?你已经知道为什么会这样了。 要使内核的结果对代码可见,您需要等待它完成 cudaDeviceReset是实现这一点的函数之一,但在将来,您将希望使用它 cudaDeviceSynchronize
或者类似的API函数,它可以让您在不重置GPU的情况下等待内核完成。您已经找到了发生这种情况的原因。 要使内核的结果对代码可见,您需要等待它完成 cudaDeviceReset是实现这一点的函数之一,但在将来,您将希望使用它 cudaDeviceSynchronize
或类似的API函数,允许您在不重置GPU的情况下等待内核完成。或其他内核启动,或同步memcpy操作,或流suchronization调用,或流回调,或多个上下文操作之一。所有这些都列在《编程指南》或其他内核启动、同步memcpy操作、流suchronization调用、流回调或多个上下文操作之一中。所有这些都列在编程指南中