CUDA系列学习(三)GPU设计与结构QA & coding练习

啥?你把CUDA系列学习(一)(二)都看完了还不知道為什麼要用GPU提速? 是啊。。经微博上的反馈我默默感觉到提出这样问题的小伙伴不在少数,但是更多小伙伴应该是看了(一)就感觉离自己太远所以赶紧撤粉跑掉了。。。都怪我没有写CUDA系列学习(零)。。。那么,这一章就补上这一块,通过一堆Q&A进行讲解,并辅助coding练习,希望大家感觉贴近CUDA是这么容易~~

请注意各个Q&A之间有顺序关系,轻依次阅读~ 否则不容易懂喔~

Q:现在硬件层面通常通过什么样的方法加速?
A:
 - More processors
 - Speed up clock frequency
 - More memory

图1. Period - transistors(晶体管) size

途径:将晶体管做得更快更小,功耗更少,那么每块芯片上就可以放更多transistor
宏观上看,一个处理器上能同时处理的数据就越多。

Q:参考图2,为加速3大常见方法之一,提高clock frequency, 可见到后面clock speed就做不上去了。这是为什么呢?

图2. Period - Clock frequency

A:是晶体管不能做得更快更小了么?错!

- 关键问题在散热!即便晶体管越做越小也难以散热。所以,现在我们应该着眼于build更多小而低功耗(power-efficient)的processor来提速。

Q:CPU和GPU在设计上的区别?
A:
CPU: COMPLEX CONTROL HARDWARE
 - flexible in performance :)
 - expensive in terms of power :(

GPU: SIMPLE CONTROL HARDWARE
 - more hardware for computation :)
 - more power efficient :)
 - more restrictive programming model :(
所以刚才说到的,目前想要设计更多power-efficient的处理器就是GPU的中心思想;CPU更重视优化 (minimize) latency而GPU更重视优化 (maximize) throughput。

Q:什么是latency,什么是throughput?
A:
比如,要驾车行驶5000km从A到B。
方法1:
  by taxi,200km/h,可承载2人:latency = 25h,throughput = 2/25 person/h
方法2:
  by bus, 50km/h, 可以承载10人:latency=100h,throughput = 10/100 person/h
所以CPU更喜欢taxi,因为一次过来速度快,GPU更喜欢bus,因为吞吐量大。

Q:CUDA是啥?CUDA programming软件层面的结构?

A:

Q:CUDA编程注意什么?

A: 注意GPU擅长什么!

- efficiency launching lots of threads

- running lots of threads in parallel

Q: kernel声明时对参数有没有限制?

A:

我们在CUDA系列学习(一)An Introduction to GPU and CUDA 中讲过kernel的声明:kernel<<<grid of blocks, block of threads>>> ,其限制是:maximum number of threads per block: 1024 for new, 512 for old。比如说,我希望2048个线程并行,不能直接申请kernel<<<1,2048>>>,而应该分开<<<a,b>>>,使a*b=2048 且a<=1024 && b<=1024.

Q: 具体讲一下kernel的general声明,参数意义与格式?

A: general表示:kernel<<<grid of blocks, block of threads, shmem>>>
shmem:shared memory per block in bytes

用G表示grid of blocks
     用B表示block of threads
     事实上,dim(x,y,z)中每一维默认都为1,所以:dim3(w,1,1)==dim3(w)==int w,即这三种表示是等效的

Q:CUDA程序中能够调用的常用 built-in variables都有哪些?
A:threadIdx, blockDim, blockIdx, gridDim

Q: CUDA程序模板来一个?

A: 说是模板,只是一个简单例子的大概套路,大家也可以参考CUDA系列学习(二)CUDA memory & variablesdifferent memory and variable types,如下:

1. 声明host变量,申请分配空间,并初始化

2. 声明device变量,申请分配空间

3. cudamemcpy将赋值了的host变量赋给device变量

4. 调用cuda kernel,并行跑线程

5. device返回结果传给host

6. 释放device变量memory

========================================

Exercise1:

input: float array [0, 1, 2, ... 63]

output: float array [0^2, 1^2, 2^2, ... 63^2]

Exercise2:

输入一张彩色图,转灰度图。

提示:
in CUDA, each pixel is represented in struct uchar4:
unsigned char r,b,g,w;//w: alpha channel, represent the transparent information
灰度转换公式:I = .299*r+.587*g+.114b(给rbg设置不同weight是人眼对不同通道的敏感度不同所致)

具体实现请参考 CUDA系列学习(二)CUDA memory & variablesdifferent memory and variable types,欢迎小伙伴们把exercise code和运行时间贴上来回复,最好和cpu版本有所比较~

参考资料:

udacity - cs344

时间: 2024-10-19 10:56:45

CUDA系列学习(三)GPU设计与结构QA & coding练习的相关文章

CUDA系列学习(五)GPU基础算法: Reduce, Scan, Histogram

喵~不知不觉到了CUDA系列学习第五讲,前几讲中我们主要介绍了基础GPU中的软硬件结构,内存管理,task类型等:这一讲中我们将介绍3个基础的GPU算法:reduce,scan,histogram,它们在并行算法中非常常用,我们在本文中分别就其功能用处,串行与并行实现进行阐述. 1. Task complexity task complexity包括step complexity(可以并行成几个操作) & work complexity(总共有多少个工作要做). e.g. 下面的tree-str

CUDA系列学习(一)An Introduction to GPU and CUDA

本文从软硬件层面讲一下CUDA的结构,应用,逻辑和接口.分为以下章节: (一).GPU与CPU (二).CUDA硬件层面 (三).CUDA安装 (四).CUDA 结构与接口 4.1 Kernels 4.2 Thread,Block, Grid 4.3 Memory 4.4 Execution (五).码HelloWorld--数组求和 希望感兴趣的同学可以一起讨论. (一).GPU与CPU 对于浮点数操作能力,CPU与GPU的能力相差在GPU更适用于计算强度高,多并行的计算中.因此,GPU拥有更

【CUDA学习】GPU硬件结构

GPU的硬件结构,也不是具体的硬件结构,就是与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最后具体的指令和任务都是在sp上处理的.GPU进行并行计算,也就是很多个sp同时做处理 sm:多个sp加上其他的一些资源组成一个sm,  streaming multiprocessor. 其他资源也就是存储资源,共享内存,寄储器等. warp:GPU执行程序时的调度单位,目前cuda的warp的大小

CUDA系列学习(二)CUDA memory &amp; variables

本文来介绍CUDA的memory和变量存放,分为以下章节: (一).CPU Memory 结构 (二).GPU Memory结构 (三).CUDA Context (四).kernel设计 (五).变量 & Memory 5.1 global arrays 5.2 global variables 5.3 Constant variables 5.4 Register 5.5 Local Array 5.6 Shared Memory 5.7 Texture Memory 5.8 总结 (一).

三 GPU 并行编程的运算架构

前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别?本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流,一个个线程组合在一起就构成了并行计算网格,成为了并行的程序,下图展示了多核 CPU 与 GPU 的计算网格: 二者的区别将在后面探讨. 下图展示了一个更为细致的 GPU 并行计算架构: 该图表示,计算网格由多个流处理器构成,每个流处理器又包含 n 多块. 下面对 GPU 计算网格中的一些概念做细致分

【Android的从零单排开发日记】之入门篇(三)——Android目录结构

本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些模块和设计能够帮助解决该问题.但想了一下,这毕竟是入门篇,若没有实际项目开发经验的人看了之后肯定是一头雾水,所以就决定将其搁浅到大家熟悉Android之后再为大家介绍. 那么今天的主题是Android的目录结构,将系统架构比作人的骨骼架构的话,目录结构就像是人的各个器官,彼此功能各不相同,却能有序地

个人网站架构设计(三) - 从设计到前端到后台

在五月份,写过两篇博客,提到了要给自己做个网站,当时人在实习,没太多的时间,只是把大概的思路捋了一番,顺道也买了个云主机(配置比较低,内存才500M).接着返校处理毕业事宜,于是六月也随着同学之间挥泪告别的声音渐渐远去.七月,家里呆着,中旬回公司.想必这也是我近几年最长的一次假期了=. = 一.先说设计 1. 阮一峰的博客 目前我的博客设计是 fork 了 BeiYuu 的主题,然后七改八改,除了主页 BeiYuu 还认得出是他的之外,其他页面已经动了很大的手术,而这些手术灵感都是源自阮一峰阮大

数据结构(三)——基于顺序存储结构的线性表

数据结构(三)--基于顺序存储结构的线性表 一.基于顺序存储结构的线性表实现 1.顺序存储的定义 线性表的顺序存储结构是用一段地址连续的存储单元依次存储线性表中的数据元素. 2.顺序存储结构的操作 使用一维数组实现顺序存储结构. template <typename T> class SeqList:public List<T> { protected: T* m_array;//顺序存储空间 int m_length;//当前线性表的长度 }; 一维顺序存储结构可以是原生数组或是

哈希算法简单回顾 + 设计RandomPool结构

哈希回顾 比较重要的性质: 不可逆:当你知道x的HASH值,无法求出x: 无冲突:当你知道x,无法求出一个y, 使x与y的HASH值相同 1 # 哈希特征: 2 # 1.输入无限 3 # 2.输出有穷 4 # 3.输入相同==>输出必相同 5 # 4.可能存在不同的输入结果输出一样 ==> 哈希碰撞 6 # 5.输入样本够大,在输出样本上几乎均匀分布 ==> 散列 7 # md 5 桶结构 hashcode模n ===> 在0--n-1上均匀分布 8 9 # 设计RandomPoo