《并行程序设计》实验指导书之五.docVIP

《并行程序设计》实验指导书之五.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

《并行程序设计》实验指导书之五

实验5.1运行CUDA向量加法的样例代码

实验目的

1.掌握cuda开发环境的使用与配置;

2.掌握利用cuda调试和运行;

3.掌握cuda并行计算的原理。

实验要求

1.熟练掌握C++语言;

2.掌握VisualStudio*.NET*集成开发环境的使用;

3.掌握cuda开发环境。

实验原理

CUDA(Compute?Unified?Device?Architecture)是由NVIDIA公司创立的基于他们公司生产的图形处理器GPUs(Graphics?Processing?Units,可以通俗的理解为显卡)的一个并行计算平台和编程模型。通过CUDA,GPUs可以很方便地被用来进行通用计算(有点像在CPU中进行的数值计算等等)。在没有CUDA之前,GPUs一般只用来进行图形渲染(如通过OpenGL,DirectX)。有了CUDA之后,开发人员可以通过调用CUDA的API,来进行并行编程,达到高性能计算的目的。

CUDA中常见的概念及名称:

主机:CPU及系统的内存(内存条);

设备:?GPU及GPU本身的显示内存;

线程(Thread):资源调度单元,一般交给GPU的一个核去处理(有一维,二维,三维)。

线程块(Block):多个线程组合在一起就是线程块;各block并行执行,互相之间不能通信,执行时无法指定顺序;线程块有数量限制,最多可以有65535个线程块。

线程格(Grid):由多个线程块组成。

线程、线程块、线程格的逻辑结构如下所示:

线程束:线程束是一个集合,其中包含32个线程。这个集合里的线程被“组合在一起”并且“步调一致”地进行执行。对程序的每一行,线程束里的线程都将在不同数据上分别执行。

GPU内存分类

1.全局内存:就是指设备内存。

2.共享内存:存储在全局内存中,使用时要添加关键字__shared__到变量声明中。CUDA对GPU上启动的每个线程块,都会保存一个共享变量的副本。在同一个线程块内的所有线程都要共享这块内存,但线程却不能看到因此也不能修改其他线程块的副本。这就实现了一个线程块中的多个线程能在计算上进行通信以及协作。

3.常量内存:存储在全局内存中,使用时要添加关键字__constant__到变量声明中。常量内存用来保存在核函数执行期间不会发生变化的数据,变量是只读的,通过特殊的处理方式,有时候使用常量内存替代全局内存可以减少内存带宽,对性能提升有帮助;当需要拷贝数据到常量内存中必须使用cudaMemcpyToSymbol,如果使用cudaMemcpy会将数据复制到全局内存。

4.纹理内存:存储在全局内存中。面向访问内存具有空间聚簇性的程序(例如图像处理方面的计算程序)设计,互相临近的线程所读取的数据在物理存储上也是临近的,可以减少访存次数,节约带宽,以此来提升效率。纹理内存有一维与二维两种:一维纹理内存的声明方式是texture类型,使用cudaBindTexture()函数绑定纹理内存,cudaUnbindTexture()函数解除绑定,读取内存数据时要使用tex1D()函数;二维纹理内存的声明方式是texture类型,数字,使用cudaBindTexture2D()函数绑定纹理内存,cudaUnbindTexture()函数解除绑定,读取内存数据时要使用tex2D()函数。

5.固定内存:存储在主机内存中,又称为不可分页或页锁定内存。对于固定内存,操作系统不会对其分页,也不会交换到磁盘上,可以确保它始终驻留在物理内存上。在编写程序时可以直接访问这块物理地址,因为它不会被破坏或迁移。固定内存是为了提高访问速度而被设计出来的。GPU如果知道主机中的物理地址,就可通过DMA方式来复制主机与GPU之间的数据。当然,用户编写程序时要注意不可一味使用固定内存,这样将导致物理内存迅速消耗完。在使用固定内存时,一般将调用cudaMemcpy()函数时使用的源内存或目的内存设置为固定内存,在调用完后不再需要时立即释放掉。分配固定内存需要使用cudaHostAlloc()函数;释放固定内存需要使用cudaFreeHost()函数。注意复制固定内存是异步的方式。

核函数(Kernel)

核函数在GPU上面运行,在GPU上运行的函数都可视作是核函数;

核函数可以使用标识符来修饰,通常使用的是__global__标识符。调用的方法与C语言有所区别,通常是通过参数n1,参数n2,调用时必须声明内核函数的执行参数;

核函数需要通过线程格(Grid)来组织,线程格下包含若干线程块(block),而线程块下又包含若干个线程(thread);

核函数的执行单位是线程块(block);

编写程序时要注意的一点是,对kernel函数中所需要使用的数组或变量,一定要在调用前提前分配好

文档评论(0)

155****4925 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档