CUDA ---- Hello World From GPU
本篇博文仅实现hello world,先看到效果,具体细节将在后续博文解释。
准备
如果你是第一次使用CUDA,在Linux下可以使用下面的命令来检查CUDA编译器是否安装正确:
$ which nvcc
一般,该指令输出为:
/usr/local/cuda/bin/nvcc
另外,你可能还需要检查下你机器上的GPU型号,可以使用给下面的命令查询:
$ ls -l /dev/nv*
可能的输出为:
crw-rw-rw- 1 root root 195, 0 Jul 3 13:44 /dev/nvidia0
crw-rw-rw- 1 root root 195, 1 Jul 3 13:44 /dev/nvidia1
crw-rw-rw- 1 root root 195, 255 Jul 3 13:44 /dev/nvidiactl
crw-rw---- 1 root root 10, 144 Jul 3 13:39 /dev/nvram
以上输出显示这里有两个GPU显卡安装在机器上。
写一段CUDA程序的基本过程为:
- 创建源文件,以”.cu”为后缀。
- 用nvcc编译程序。
- 命令行运行。
代码
首先,为了对比,先写一段简单的C程序输出hello world:
#include <stdio.h> iint main(void){ printf(“helllo world!\n”); }
然后是我们所谓的kernel function(即CUDA代码):
__global__ void helloFromGpu(void){ printf(“hello world form GPU!\\n”); }
限定符__global__告诉编译器这个function将由CPU调用在GPU上执行,其调用形式为:
helloFromGPU<<<1,10>>>();
一个kernel是由一组线程执行,所有线程执行相同的代码。上面一行三对尖括号中的1和10 表明了该function将有10个线程,具体含义之后博文中会详述。下面是完整代码:
#include <stdio.h>
__global__ void helloFromGPU (void) { printf(“Hello World from GPU!\n”); } int main(void) { // hello from cpu printf(“Hello World from CPU!\n”); helloFromGPU <<<1, 10>>>(); cudaDeviceReset(); return 0; }
这里顺便提及下,我们将CPU端称为host,GPU端称为device。
cudaDeviceReset()用来显式的摧毁清理CUDA程序占用的资源。现在用下面的命令编译:
$nvcc –arch sm_20 hello.cu –o hello
-arch sm_20是用来指定编译器使用Fermi架构产生device代码。编译成功后执行$ ./hello:
Hello World from CPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
Hello World from GPU!
一个典型的CUDA程序结构包含五个主要步骤:
- 分配GPU空间。
- 将数据从CPU端复制到GPU端。
- 调用CUDA kernel来执行计算。
- 计算完成后将数据从GPU拷贝回CPU。
- 清理GPU内存空间。
参考书:《professional cuda c programming》
NVIDIA CUDA板块:https://developer.nvidia.com/cuda-zone
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通