LitLeo的个人博客分享 http://blog.sciencenet.cn/u/LitLeo

博文

GPGPU-Sim研究(一)-深入掌握GPGPU的工作原理

已有 4789 次阅读 2014-5-17 21:12 |个人分类:GPGPU-Sim研究|系统分类:科研笔记

   有兴趣阅读本博客的人,相信你已经对CUDA有基本的了解,如果您不了解的话,请恕不在这里赘述 。同时,本博客系列内的一些对词语的翻译大部分来源于网上,可能会表达的不准确,所以强烈建议阅读英文原版文档!

  作为本研究的第一个阶段,了解GPU的工作远离,对于一个不了解GPU的人是相当苦逼的一个阶段,就是你需要基本明白各种概念。

  这个阶段的我的主要工作便是阅读NVIDIA自己出的一个文档-《CUDA_C_Best_Practices_Guide》,这份资料的内容与题目相同,是对CUDA C优化编程的一个比较系统的介绍,内容比《CUDA C Programming Guide》更深一层,如果你没有阅读过《CUDA C Programming Guide》的话,建议先读一下,再阅读《CUDA_C_Best_Practices_Guide》。

  阅读英文文档对我这样的英语渣渣真是异常的煎熬,当时花了我大约三个周的时间才看完。下面是我看完问完学长后所做的一些比较粗糙的笔记,希望对大家有帮助。


Chapter 3 Getting Started

三种并行化方式

第一种并行库

第二种并行化编译器

第三种用代码实现并行


Chapter 4 Getting the Right Answer

本章探讨的问题可能会影响返回的数据点,以适当的解决方案

对于浮点精度问题,单精度和双精度,浮点运算不满足结合律

在正常coding中,

float a1 = 0.2;  // 会有warning

float a1 = 0.2f;


Chapter 5 Performance Metrics (性能指标)

利用Timing对程序进行计时以判断性能

对程序进行计时时,如果用cpu端的函数测试时间,则需要同步,用GPU端的函数则不需要同步

在device端涉及到异步copy和执行的问题

影响程序运行时间的最大因素是 Bandwidth ,可以理解为host端与 device 端之间拷贝数据的 speed

每一块机器上都有理论带宽计算,但是兽兽种种因素影响,有效带宽需要我们自己测试出来并且往往比理论带宽低


Chapter 6 Memory Optimizations(内存优化)

基础概念:

一个显卡中会有多个SM(Streaming Multiprocessor),每个SM中有多个SP(Streaming Processor),一个SM会负责多个ThreadBlock(线程块)的计算任务,一般为 8 个,每一个 SP 一个时刻负责一个Thread

Stream:流(Stream)是一系列顺序执行的命令,流之间相对无序或并发的执行他们的命令。

Warp:warp是SM调度和执行的基础概念

这可以说是在GPU与CPU的区别最大的名词。

CPU为单指令单执行的典型,但是GPU为多指令多执行的典型

在SM中,有一种单位叫做warp,一个SM有多个warp,每个warp中一般有32个线程,每一个线程都有自己的寄存器内存和local memory,一个warp中的线程是同时执行的,也就是当进行并行计算时,线程数尽量为32的倍数,如果线程数不上32的倍数的话;假如是1,则warp会生成一个掩码,当一个指令控制器对一个warp单位的线程发送指令时,32个线程中只有一个线程在真正执行,其他31个 进程会进入静默状态。

换句话说,可以用一个非常多的核的CPU来理解GPU的并行计算,当然有很多细节是不一样的


Pinned Memory or Page-locked Memory

在计算机中,虚拟内存的概念在内存短缺时,CPU将一些内存存到本地的硬盘内,当需要这块“内存空间”时,再将其替换到内存中,借此“扩大”内存,而Pinned Memory特指那些不会被替换的内存单元。


Zero Copy (零拷贝)

直接表现:device 端直接访问 host端内存,即device端的指针直接映射到host端,但是这样做必然会降低运算速率,但在特定条件下copy速率比较好

特定一:集成显卡

特定二:GPU端在计算中只读取一次数据并且整个device端计算在整个程序计算中占小部分


虚拟统一寻址:能够为 主系统内存和显卡内存提供一个合并的存储器地址空间,让并行编程变得更快,更easy,但是也需要device端和host端之间的内存copy


  上述笔记可能会有一些地方理解的不对,还望各位指点。


PS:回过头来看一下自己当时写的东西,自己当时真是too young too simple。如果要想深入的了解GPGPU的工作原理的话,我自己的见解是:

首先可以读《GPU高性能运算之CUDA》这本书, 这本书不仅会教你CUDA C语言的编写,还会教一些关于GPU的一些细节。但是这本书还是太薄了,很多细节只是说了一段,容易让人云里雾里,而且几个小地方不是很准确。当然,对于newer是足够了。

如果你已经看完这本书,并自己写过一些用CUDA实现的算法的话,就可以看我说的这份文档《CUDA_C_Best_Practices_Guide》了,里面会比较概要zhunque的介绍关于GPGPU底层的一些东西,最重要的是,它是英文的,如果你以后想对GPU有啥想法,基本英语就应该是你的第二母语了。

看完以上的东西,就基本达到写代码的基本水平了,但是要想做研究还是远远不够的




https://blog.sciencenet.cn/blog-1328569-795333.html

上一篇:GPGPU-Sim研究(零)-写在前面
下一篇:GPGPU-Sim研究(二)-认识GPGPU实验工具(安装gpgpu-sim)
收藏 IP: 210.30.97.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-10-4 15:16

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部