为什么我的"Hello world"程序需要几乎10秒?

chr*_*ris 6 c c++ cuda

我已将CUDA运行时和驱动程序版本7.0安装到我的工作站(Ubuntu 14.04,2xIntel XEON e5 + 4x Tesla k20m).我使用以下程序检查我的安装是否有效:

#include <stdio.h>

__global__ void helloFromGPU()
{
    printf("Hello World from GPU!\n");
}

int main(int argc, char **argv)
{
    printf("Hello World from CPU!\n");

    helloFromGPU<<<1, 1>>>();

    printf("Hello World from CPU! Again!\n");

    cudaDeviceSynchronize();

    printf("Hello World from CPU! Yet again!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到了正确的输出,但它需要一段时间:

$ nvcc hello.cu -O2
$ time ./hello > /dev/null

real    0m8.897s
user    0m0.004s
sys     0m1.017s`
Run Code Online (Sandbox Code Playgroud)

如果我删除所有设备代码,则整体执行需要0.001秒.那么为什么我的简单程序几乎需要10秒钟?

tal*_*ies 6

您的示例明显缓慢的运行时间是由于设置GPU上下文的基本固定成本.

由于您运行在支持统一寻址的平台上,因此CUDA运行时必须将64 GB的主机RAM和4 x 5120MB从GPU映射到单个虚拟地址空间,并将其注册到Linux内核.

这样做需要很多内核API调用,而且速度不快.我猜这是你观察到的缓慢性能的主要来源.您应将此视为固定的启动成本,必须在应用程序的整个生命周期内摊销.在现实世界的应用程序中,10秒的启动是微不足道的,并不重要.在一个问候世界的例子中,事实并非如此.