ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hello CUDA:第一次让 GPU 真正跑起来

Hello CUDA:第一次让 GPU 真正跑起来 核心判断只有一句:CPU 负责发起内核(kernel),GPU 负责执行 kernel;grid, block决定启动多少个线程块,以及每个线程块包含多少线程。① 从“能访问 GPU”到“真正启动 Kernel”上一篇验证了“GPU 能不能被程序访问”,这一篇继续验证“GPU 能不能真正执行 kernel”:让 CPU 发起一个 GPU kernel,并看到设备端输出。很多初学者第一次看到 CUDA 代码时,会把下面这行当成普通函数调用:hello_kernel1,1();它不是普通的 C++ 调用。这里的1, 1是 CUDA 的启动配置,表示启动 1 个线程块,每个线程块包含 1 个线程。真正的 GPU 工作从这行开始被提交。可以把它理解为:CPU 负责发起工作,kernel 定义工作内容,grid, block定义并行规模。从更大的系统视角看,CPU 是主机(Host),GPU 是设备(Device)。如下图所示,Host 侧程序负责发起工作,Device 侧的 GPU 负责执行设备代码;两者通过系统互连和 CUDA 软件栈协作:这张图要观察的是"谁负责组织、谁负责执行":main()在 CPU 上运行,kernel 本体在 GPU 上运行。本文只借这张图建立 Host / Device 的边界,不展开流式多处理器(SM)调度和 GPU 内存层次。② 先看最小闭环:CPU 发起,GPU 输出上一节把环境拆成了驱动(Driver)、工具包(Toolkit)、运行时(Runtime)和程序;本节只新增一个概念:kernel。kernel 就是一个在 GPU 上执行、可以由 CPU 发起的函数。下面是最小的 Hello CUDA:#includecstdio#includecuda_runtime.h// __global__ 表示这是一个 GPU kernel;本例由 CPU 端发起__global__voidhello_kernel(){printf("Hello from GPU\n");}intmain(){// 启动 1 个线程块,每个线程块包含 1 个线程hello_kernel1,1
返回列表