CUDA学习小记
来源:互联网 发布:宽客网络属于什么网 编辑:程序博客网 时间:2024/06/06 00:09
断断续续看了一个星期cuda,然后就感冒了(cuda的魅力真是大==!),今天原地复活,复习一下,做下学习笔记。
CPU代码作用:在kernel启动前进行数据准备和设备初始化的工作,以及在kernel之间进行的一些串行运算。理想状况下 ,CPU串行代码的作用只是清理上一个kernel函数,并启动下一个kernel函数。
CUDA并行计算函数kernel:它是整个CUDA程序中的一个可以被并行执行的步骤。
kernel函数中存在两个层面的并行:Grid中的block间并行;block中的thread间并行。
kernel:组织形式是grid;以block为单位执行。
Grid:表示一系列可以并行的block的集合;
各个block之间无法通信,没有执行顺序;
目前一个kernel中只有一个grid,未来DX11中将采用MIMD架构,允许一个kernel中存在多个不同的grid。
block:同一个block的线程需要共享数据,必须在同一个sm中发射;(在同一个时刻,一个sm中可有多个活动block)
block中的每一个thread被发射到一个sp上;
block的数量是处理核心的数量的几倍的时候,才能充分发挥GPU的运算能力:如果太少,无法体现其计算速度相较传统方式的优势。
Thread:有自己的私有寄存器和local memory;
同一个block内的线程可以通过共享存储器和同步机制进行通信。
实际运行单元:warp(线程束),大小由硬件能力决定。tesla架构的gpu中为32。划分依据是block的ID,比如,0~31为一束。
32的warp:每发射一条warp指令,sm中的8个sp会将这条指令执行4遍。
CUDA编程key:
程序以及warp中尽量避免分支:
warp中尽量避免使用分支:如果有分支,sm需要把每一个分支的指令发射到每一个sp上,再根据sp决定要不要执行,执行时间将
是所有分支之和。
优化存储器访问:理想状态时所有存储器仅此那个传输的同时,GPU的各个核心也始终在进行计算。这需要合理划分程序。
CUDA软件体系:
CUDA C:一种用c语言编写设备端代码的编程方式,包括对c的一些扩展和一个运行时库。
nvcc编译器:分离源文件中的主机代码和设备代码;
主机代码由c文件形式输出,交流高性能编译器,如ICC、GCC或者其他合适的高性能编译器进行编译。或者在编译的最后阶段交给其他编译器生成.obj或者.o文件。
设备代码由nvcc编译成ptx代码或者二进制代码。
ptx代码:类似于汇编余元,是为动态编译器jit设计的输入指令序列。
jit可以在使用不同的机器语言的显卡上运行同样的ptx,保证兼容性。
jit的输出受到硬件和其他一些因素影响,有不确定性。
对于需要确定代码的独立软件开发商,可以把代码编译成cuda二进制代码cubin,避免jit过程的不确定性。
CUDA运行时api:在驱动程序api基础上进行了封装,编程方便。
放在CUDArt包中;
函数以CUDA前缀;
CUDA驱动程序API:基于句柄的底层接口。
放在nvCUDA包里;
前缀为cu;
- CUDA学习小记
- CUDA学习小记
- Cuda安装小记
- CUDA小记(1)环境搭建
- CUDA学习--CUDA流
- [CUDA学习]CUDA安装
- cuda学习
- CUDA学习
- cuda学习
- CUDA学习
- CUDA学习
- CUDA学习
- cuda学习
- cuda学习
- cuda学习
- cuda学习
- CUDA小记(2)运行第一个CUDA程序
- CUDA学习(1)--CUDA简介
- 网页上用idrop控件做个DWG文件库
- DWR学习笔记(四)
- DWR学习笔记(五)
- [推荐] 80后的10个人生底线
- ORACLE
- CUDA学习小记
- 一些养生保健小知识
- DWR学习笔记(六)
- 我相信
- Matlab的图像细化算法(详细实现)
- DWR学习笔记(七)--完
- Oracle:插入模板查询SQL语句
- EL表达式
- Datalist嵌套Repeater显示