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

时间:2015-07-01 12:04:51

标签: 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;
}

我得到了正确的输出,但这需要花费一些时间:

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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