专栏首页C/C++基础CUDA Study Notes

CUDA Study Notes

1. 归约(Reduction)

归约是使用解决其它问题的”黑盒”来解决另一个问题.

2. Tesla是什么

CUDA架构用作GPU通用计算。

3. SSE指令集

SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其中包含70条指令。

4. 3DNow!指令集

(据称是“3D No Waiting!”的缩写)是由AMD开发的一套SIMD多媒体指令集,支持单精度浮点数的矢量运算,用于增强x86架构的计算机在三维图像处理上的性能。

5. MMX技术

MMX 是MultiMedia eXtensions(多媒体扩展)的缩写,是第六代CPU芯片的重要特点。MMX技术是在CPU中加入了特地为视频信号(Video Signal),音频信号(Audio Signal)以及图像处理(Graphical Manipulation)而设计的57条指令,因此,MMX CPU极大地提高了电脑的多媒体(如立体声、视频、三维动画等)处理功能。

6. GPU通用计算开发环境有哪些

有CUDA、OpenCL(全称Open Computing Language,开放运算语言)和微软的DirectX 11 .

7.pinned memory

固定内存技术,其作用是固定内存技术的实质是强制让系统在物理内存中完成内存申请和释放的工作,不参与页交换,从而提高系统效率。

8.在一个CUDA程序中,基本的主机端代码主要完成以下任务

(1) 启动CUDA,使用多卡时加上设备号,或者使用cudaDevice()设置GPU装置。 (2) 分别在CPU和GPU端分配内存,用以储存输入输出数据,CPU端要记得初始化数据,然后将数据拷入显存。 (3)调用device端的kernel程序计算,将结果写到显存相关区域,再回写到内存。 (4)利用CPU进行数据其他处理,释放内存和显存空间。 (5)退出CUDA装置

9. CUT_DEVICE_INIT(argc, argv)和CUT_EXIT(argc,argv)

是cutil.h中的两个宏函数,分别用来启动和退出CUDA环境。

10.昨CUDA_SAFE_CALL()宏函数

调用后的返回值为cudaerr型,用CUT_CHECK_ERROR()宏函数可以接受最后一次的cudaerr_t异常,如果发生异常将输出错误类型,对调试很有帮助,cudaerr_t是定义在toolkit里的\include\drive_types.h中。

11.Kernel函数完整的执行参数配置形式<<<Dg,Db,Ns,S>>>

1)Dg用于定义整个grid的维度和尺寸,为dim3型。最多为二维,Dg.x和Dg.y最大为65535,整个grid中最多也只能定义65535个block,例如:Dg(Dg.x,Dg.y,1)。

2)Db用于定义每个block的维度和大小,也是dim3型。Db.x和Db.y最大为512,Db.z最大为4,三个维度之积小于768(计算能力为1.0,1.1的硬件)或1024(计算能力为1.2,1.3的硬件).例如:Db(Db.x,Db.y,Db.z)

3)Ns是一个可选参数,用于设置每个block除了静态分配的sharedmemory外,最多能动态分配的sharedmemory,单位是Byte。目前的硬件最多每个block分配16KB的sharedmemory(静态+动态)。不需要时可写0或省略。

4) S是一个cudaStream_t类型的可选参数,初始值为0. 实际在代码编写的时候,<<<>>>参数只需要填写两个,分别BLCOKNUM(block数量)和每个block中的线程数THREADNUM。

12.CUDA程序特点

看过CUDA程序的都知道啊,进行一次GPU计算,需要在多个存储器之间进行数据传输,因此有较大的延迟,故GPU不适合对实时性要求很高的应用。由于不同存储器间的数据传输速率和使用方法有很大差异,故开发人员需要根据硬件特点设计并行算法。

13.CUDA程序开发难点

到目前为止,我觉得最难的地方就是要根据任务以及硬件的特性对任务进行划分,以设计block的工作流程,既要照顾到数据传输的问题同时要隐藏各种访存延迟。

14.关于extern限定符

在_device_和_global_函数中表示动态分配,而在主机端正如C语言所描述的一样,只是表示外部变量。

注意:通过这种方式定义的所有变量都是开始于同一地址,因此数组中的变量布局必须通过偏移量显式管理。 如要在动态分配的共享存储器中得与下代码对应内容:

short array0[128];
float array1[64];
int array2[256];

应该按照如下方式定义:

extern_shared_char array[];

_device_voidfunc()//_device_or_glabol_function
{ 
short*array0=(short*)array;
   float*array1=(float*)array0[128];
   int*array2=(int*)array1[64];
}

15. OpenMP

OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Directive)。

16. CUDA自带的库函数_mul24()完成两个数的相乘

在CUDA中,GPU端(release和debug模式下的_global_和_device_函数)只能使用自带的数学库函数。

说明:有前缀“_”的函数根据SP(标量流处理器)特点进行了优化,可获得更高的速度,但是有前缀“_”的整数程序只能处理24位整数,有前缀“_”的浮点数精度较不带该前缀的版本精度要差一些。

17. NVIDIA的显卡有哪些系列

GeForce(Geometry Force,几何力量,精视)芯片系列显卡,NVIDIA公司出品的显示芯片的一种系列。用于竞争AMD的Radeon系列显卡,定位于PC个人领域,提供家庭娱乐。

Quadro芯片系列显卡,Quadro系列定位于专业绘图工作站领域,强调与行业软件的兼容性、稳定性以及高效率。

Tesla是一个新的显示核心系列品牌,主要用于服务器高性能电脑运算,用于对抗AMD的流处理器(FireStream)。这是继GeForce和Quadro之后,第三个显示核心商标。NVIDIA将显示核心分为三大系列,Tesla主要用于大规模的并联电脑运算。

18. ATI显卡有哪些系列

ATI显示芯片生产商已被AMD收购。生产的芯片系列有: Radeon(镭™):是AMD公司出品的显示芯片的一种系列。俗称A卡。

AMD FirePro:(又称ATI FirePro),是由ATI 开发的显示芯片。由ATI FireGL和ATI FireMV合并而来,现由AMD开发推广。AMD FirePro 定位于专业领域,其主要竞争对手为NVIDIA Quadro系列。

19. CUDA中SM、SP、cuda core、Grid、block、thread和warp的联系与区别

SM(Stream Multiprocessor)流多处理器,即GPU的核心数,就是cuda core。一个完整处理核心必须包括取值、解码、分发逻辑和执行单元。

SP(Stream Processor)标量流处理器,是SM的执行单元,不是完整的处理核心。一个SP由一个branch单元和一个ALU/MAD(Arithmetic Logic Unit算数逻辑运算单元,MAD是Multiply-Add-Unit乘加器)。

关系:CUDA编程硬件映射时,一个Grid(线程网格)对应一个流处理器阵列 Scalable Streaming Processor Array (SPA),也就是对应一个GPU;一个Block(线程块)对应一个SM,一个Thread(线程)对应一个SP。

注意:在实际运行时,一个Block会被分割为数个warp(线程束),warp才是真正的执行单元。

硬件层:每个SPA 包含若干 TPC,每个TPC包含2~3个SM,每个SM包含8个SP。其中TPC是线程处理器群 Thread Processing Cluster。

线程关系与存储结构示意图:

20. CUBLAS

CUBLAS (CUDA Basic Linear Algebra Subprogram) 是线性计算的函数库。

21. CUDA中block和grid的最大维度

对于计算能力1.x,Block和Grid各维度的最大值: block-bx <= 512,block-by <= 512,block-bz <= 64。grid-gx <= 65535,grid-gy <= 65535,每个block中的最大线程数量为512。

对于计算能力2.x,Block和Grid各维度的最大值:block-bx <= 1024,block-by<=1024,block-bz <= 64。grid-gx <= 65535,grid-gy <= 65535,每个block中的最大线程数量为1024。

22. CUDA编程基础

详见http://www.guandang.com/ppt/817048.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • *** glibc detected *** malloc(): memory corruption

    在Linux Server上不好模拟出来:不过若是先malloc,再越界memset,再free此内存块,然后malloc新内存块就会出现类似错误。

    Dabelv
  • 野指针

    指向非法的内存地址指针叫作野指针(Wild Pointer),也叫悬挂指针(Dangling Pointer),意为无法正常使用的指针。

    Dabelv
  • Shell反引号、$()和${}的区别

    反引号和$()的作用相同,用于命令替换(command substitution),即完成引用的命令的执行,将其结果替换出来,与变量替换差不多。比如:

    Dabelv
  • 手写体数字识别该如何选择GPU并实现?DeepLearning4j 实战

    在之前的博客中已经用单机、Spark分布式两种训练的方式对深度神经网络进行训练,但其实DeepLearning4j也是支持多GPU训练的。 这篇文章我就总结下用...

    AI研习社
  • 漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)

    全称Linux extended file system, extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,...

    justmine
  • 工作10年后,再看String s = new String("xyz") 创建了几个对象?

    这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人...

    灵魂画师牧码
  • 工作10年后,再看String s = new String("xyz") 创建了几个对象?

    这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人...

    JAVA葵花宝典
  • 68-生成器实例:每次取出文件的10行内容

    凯茜的老爸
  • Chrome变慢? 如何为她加速?

    zhaoolee
  • 彻底搞懂java程序的初始化顺序

    在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。

    全菜工程师小辉

扫码关注云+社区

领取腾讯云代金券