CUDA学习笔记(一)Hello World From GPU

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。

准备

如果你是第一次使用CUDA,在Linux下可以使用下面的命令来检查CUDA编译器是否安装正确:

bash 复制代码
which nvcc

一般,该指令输出为:

/usr/local/cuda/bin/nvcc

另外,你可能还需要检查下你机器上的GPU型号,可以使用给下面的命令查询:

bash 复制代码
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:

cpp 复制代码
#include <stdio.h>

iint main(void){

                printf("helllo world!\n");

}

然后是我们所谓的kernel function(即CUDA代码):

cpp 复制代码
__global__ void helloFromGpu(void){

                printf("hello world form GPU!\n");

}

限定符__global__告诉编译器这个function将由CPU调用在GPU上执行,其调用形式为:

helloFromGPU<<<1,10>>>();

一个kernel是由一组线程执行,所有线程执行相同的代码。上面一行三对尖括号中的1和10 表明了该function将有10个线程,具体含义之后博文中会详述。下面是完整代码:

cpp 复制代码
__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程序占用的资源。现在用下面的命令编译:

bash 复制代码
nvcc --arch sm_20 hello.cu --o hello

-arch sm_20是用来指定编译器使用Fermi架构产生device代码。编译成功后执行

bash 复制代码
./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!

bash 复制代码
一个典型的CUDA程序结构包含五个主要步骤:

    分配GPU空间。
    将数据从CPU端复制到GPU端。
    调用CUDA kernel来执行计算。
    计算完成后将数据从GPU拷贝回CPU。
    清理GPU内存空间。
相关推荐
小年糕是糕手43 分钟前
【数据结构】常见的排序算法 -- 插入排序
c语言·开发语言·数据结构·学习·算法·leetcode·排序算法
我先去打把游戏先1 小时前
ESP32C3开发指南(基于IDF):console控制台命令行交互功能
笔记·嵌入式硬件·mcu·物联网·学习·esp32·交互
长桥夜波1 小时前
【第二十周】机器学习笔记09
人工智能·笔记·机器学习
QT 小鲜肉3 小时前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
YuanDaima20483 小时前
安全协议设计入门:原理与分析
人工智能·笔记·安全·网络安全·密码学·安全协议·课程
浮游本尊3 小时前
React 18.x 学习计划 - 第六天:React路由和导航
前端·学习·react.js
yuxb734 小时前
Zabbix企业级分布式监控系统(上)
笔记·学习·zabbix
现在,此刻4 小时前
李沐深度学习笔记D1-什么是深度学习
人工智能·笔记·深度学习
猿来是你_L6 小时前
UGUI笔记——3D坐标转换成UGUI坐标
笔记·3d
崎岖Qiu11 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式