cuda c的hello world
1 | /* |
异构计算
1、一台 intel i7-4790 CPU加上两台Titan x GPU构成的工作站,GPU插在主板的PCIe卡口上,运行程序的时候,CPU像是一个控制者,指挥两台Titan完成工作后进行汇总,和下一步工作安排,所以CPU我们可以把它看做一个指挥者,主机端,host,而完成大量计算的GPU是我们的计算设备,device。
2、一个四核CPU一般有四个ALU,ALU是完成逻辑计算的核心,也是我们平时说四核八核的核,控制单元,缓存也在片上,DRAM是内存,一般不在片上,CPU通过总线访问内存。
3、GPU,排列成行的一组ALU 公用一个Control单元和Cache,这个部分相当于一个完整的多核CPU。但是不同的是ALU多了,control部分变小,可见计算能力提升了,控制能力减弱了。
4、CPU和GPU之间通过PCIe总线连接,用于传递指令和数据,这部分也是后面要讨论的性能瓶颈之一。
5、低并行逻辑复杂的程序适合用CPU;高并行逻辑简单的大数据计算适合GPU
衡量GPU计算能力
容量:CUDA核心数量(越多越好);内存大小(越大越好)
性能:峰值计算能力;内存带宽
CPU和GPU线程的区别:
1、CPU线程是重量级实体,操作系统交替执行线程,线程上下文切换花销很大
2、GPU线程是轻量级的,GPU应用一般包含成千上万的线程,多数在排队状态,线程之间切换基本没有开销。
3、CPU的核被设计用来尽可能减少一个或两个线程运行时间的延迟,而GPU核则是大量线程,最大幅度提高吞吐量
cuda c
1、CUDA C 是标准ANSI C语言的扩展,扩展出一些语法和关键字来编写设备端代码,而且CUDA库本身提供了大量API来操作设备完成计算。
2、驱动API是低级的API,使用相对困难,运行时API是高级API使用简单,其实现基于驱动API。
这两种API是互斥的,也就是你只能用一个,两者之间的函数不可以混合调用,只能用其中的一个库。
3、一个CUDA应用通常可以分解为两部分
CPU 主机端代码和GPU 设备端代码
4、nvcc 是从LLVM开源编译系统为基础开发的。CUDA nvcc编译器会自动分离你代码里面的不同部分,如图中主机代码用C写成,使用本地的C语言编译器编译,设备端代码,也就是核函数,用CUDA C编写,通过nvcc编译,链接阶段,在内核程序调用或者明显的GPU设备操作时,添加运行时库。
cuda程序步骤
- 分配GPU内存
- 拷贝内存到设备
- 调用CUDA内核函数来执行计算
- 把计算完成数据拷贝回主机端
- 内存销毁
CUDA抽象了硬件实现
- 线程组的层次结构
- 内存的层次结构
- 障碍同步
工具
- Nvidia Nsight集成开发环境
- CUDA-GDB 命令行调试器
- 性能分析可视化工具
- CUDA-MEMCHECK工具
- GPU设备管理工具
本文链接: https://satyrswang.github.io/2021/04/12/cuda编程/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!