为什么我的 "Hello world" 程序需要将近 10 秒?

Why does my "Hello world" program take almost 10s?

我已将 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;
}

我得到了正确的输出,但它花费了很多时间:

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

real    0m8.897s
user    0m0.004s
sys     0m1.017s`

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

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

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

执行此操作需要大量内核 API 调用,而且速度不快。我猜这是您观察到的性能缓慢的主要原因。您应该将其视为固定的启动成本,必须在您的应用程序的生命周期内摊销。在现实世界的应用程序中,10 秒的启动是微不足道的,并不重要。在一个你好世界的例子中,它不是。