我已将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秒钟?
答案 0 :(得分:6)
示例的明显缓慢的运行时间是由于设置GPU上下文的基本固定成本。
由于您在支持统一寻址的平台上运行,因此CUDA运行时必须将64 GB的主机RAM和4 x 5120MB从GPU映射到单个虚拟地址空间,并将其注册到Linux内核。
这样做需要很多内核API调用,而且速度不快。我猜这是你观察到的缓慢性能的主要来源。您应将此视为固定的启动成本,必须在应用程序的整个生命周期内摊销。在现实世界的应用程序中,10秒的启动是微不足道的,并不重要。在hello world示例中,它不是。