CUDA编程——如何理解CUDADeviceSet()

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

过去,我经常通过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。我发现如果我删除这一行,我就无法获得输出消息。我不明白原因。我看到CUDADeviceSet将破坏Cuda上下文并重置设备。这是否意味着该函数还刷新我的输出缓冲区


还有一个问题,如果我删除这一行,我不会得到任何输出到我的屏幕。我相信这是因为我的程序在GPU输出到我的屏幕之前就结束了。是这样吗?

你已经知道为什么会这样了。 要使内核的结果对代码可见,您需要等待它完成

cudaDeviceReset是实现这一点的函数之一,但在将来,您将希望使用它

cudaDeviceSynchronize


或者类似的API函数,它可以让您在不重置GPU的情况下等待内核完成。

您已经找到了发生这种情况的原因。 要使内核的结果对代码可见,您需要等待它完成

cudaDeviceReset是实现这一点的函数之一,但在将来,您将希望使用它

cudaDeviceSynchronize


或类似的API函数,允许您在不重置GPU的情况下等待内核完成。

或其他内核启动,或同步memcpy操作,或流suchronization调用,或流回调,或多个上下文操作之一。所有这些都列在《编程指南》或其他内核启动、同步memcpy操作、流suchronization调用、流回调或多个上下文操作之一中。所有这些都列在编程指南中