没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
CUDA C 编程
time:2017.9.18-2017.9.23
1. 完整的 CUDA 程序包括主机端(CPU)和设备端(GPU)两部分代码,主
机端的代码在 CPU 上执行,设备端的代码又成为 kernel 函数,运行在
GPU 上。
其中,一个 kernel 函数对应一个 grid,每个 grid 根据需要配置不同的
block 数量和 thread 数量。
block 映射到 SM thread 映射到 SP(core)
不同 block 之间的 thread 不能读写同一共享内存(shared
memory),
各 block 是并行执行的,block 间无法通信,也没有执行顺序。
2. CUDA 程序的处理流程:
a) 从 CPU 拷贝数据到 GPU。
b) 调用 kernel 来操作存储在 GPU 的数据。
c) 将操作结果从 GPU 拷贝至 CPU
3. 核函数(Kernel):
a) 在 GPU 上执行的函数通常称为核函数。
b) 一般通过标识符__global__修饰,调用通过<<<参数 1(grid),参
数 2(block),参数 3,参数 4>>>。其中参数 1 指定 grid 内 block
维度,类型为 dim3;参数 2 指定 block 内 thread 维度,类型为
dim3;参数 3 指定共享存储空间大小,类型为 size_t;参数 4 指定
流索引号;其中参数 3,参数 4 可选。例子:kernel_name<<<4,
8>>>(argument list);该行代码表明有 grid 为一维,有 4 个
block,block 为一维,每个 block 有 8 个线程,故此共有 4*8=32
个线程。
注意:不同于 c 函数的调用,所有 CUDA kernel 的启动都是异步的,
当 CUDA kernel 被调用时,控制权会立即返回给 CPU。
c) 以线程格(Grid)的形式组织,每个线程格由若干个线程块
(block)组成,而每个线程块由若干个线程(thread)组成。
d) 能在主机端代码中调用。
e) 调用时必须声明内核函数的执行参数。
f) 在编程时,必须先为 kernel 函数中用到的数组或变量分配好足够的空
间,再调用 kernel 函数,否则在 GPU 计算时会发生错误,例如越界
或报错,甚至导致蓝屏和死机。
g) Kernel 的限制:
i. 仅能获取 device memory 。
ii. 必须返回 void 类型。
iii. 不支持可变数目参数。
iv. 不支持静态变量。
v. 不支持函数指针。
vi. 异步。
4. 函数类型提示符:(函数限定符)
英语单词注释:
callable:可调用的 omit:省略,忽略
a) _ _ global_ _:声明的函数称为 kernel 函数。该函数只能被 CPU
(主机)端调用,执行在 GPU 上。kernel 函数类型必须是 void,即返
回类型必须为空。
b) _ _ device_ _:声明在设备上执行的函数。该函数无法被 CPU(主
机)端调用,即只能被_ _ device_ _ 或 _ _ global_ _声明的函数调用。
c) _ _ host_ _:声明在主机执行的函数,仅可在 CPU(主机)端调用。一
般情况下可以省略,只有该函数同时存在被设备端和主机端同时调用的
情况需要增加限定符,且无法与_ _ global_ _联用。
5. 变量限定符
a) _ _ device_ _:声明在设备上的变量,该变量位于 global
memory,只能在设备端使用,是全局变量,无须也不能在函数参数
表中出现。grid 中所有线程可访问。
b) _ _ constant_ _:声明在常量存储中的变量,只能在设备端使用。此
变量一般情况下是只读的,只能通过特定的方式进行修改。该变量是
全局变量,无须也不能在函数参数表中出现。grid 中所有线程可访问。
剩余11页未读,继续阅读
资源评论
MrCzx
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功