作者a5000ml (咖啡里的海洋蓝)
看板C_and_CPP
标题[分享] CUDA 程式设计(8) -- OpenMP vs. SIMT
时间Thu Nov 6 03:10:47 2008
※ [本文转录自 VideoCard 看板]
作者: a5000ml (咖啡里的海洋蓝) 看板: VideoCard
标题: [分享] CUDA 程式设计(8) -- OpenMP vs. SIMT
时间: Wed Nov 5 20:30:35 2008
※ 第 7 章 SIMT vs OpenMP
最近为了要对 SIMT 做更精确的描述,所以做了以下的对照表
+------+--------------------------------+-----------------------------------+
| |
OpenMP |
SIMT |
+------+--------------------------------+-----------------------------------+
|
运作 | 程式设计师站在管理者的角度, | 程式设计师站在员工的角度(执行绪),|
|
方式 | 对执行绪进行任务派遣。 | 对工作进行主动切割。 |
+------+--------------------------------+-----------------------------------+
|
执行绪| 执行绪「被动的」接受任务。 | 执行绪「主动的」切割任务。 |
|
观点 | | |
+------+--------------------------------+-----------------------------------+
|
硬体面| 倾向於 CISC,管理执行绪的指令 | 倾向於 RISC,管理执行绪的指令 |
| | 相对较多。 | 相对少。 |
+------+--------------------------------+-----------------------------------+
| | 1.程式容易设计&管理 | 1.容易发出大量执行绪 |
|
优点 | 2.序列化处理比较不浪费资源 | 2.硬体设计简单, 易於实现超多核心 |
| | 3.编译器最佳化已有一段时间 | 3.指令拮取可以合并 (warp) |
| | 4.执行绪任务分配较为弹性 | 4.记忆体读取可以并 (coalesced) |
+------+--------------------------------+-----------------------------------+
| | 1.不易发出大量执行绪 | 1.程式不易设计&管理 |
|
缺点 | 2.硬体需处理复杂的执行绪问题 | 2.工作切割需要处理正交性问题 |
| | 3.资料同步化不易 | 3.序列化处理较浪费资源 |
| | 4.不同核心的指令拮取无法合并 | 4.编译器最佳化不易 (发展较浅) |
| | 5.记忆体读取不易合并 | 5.演算法较缺乏 (发展较浅) |
| | 6.快取一致性问题 | 6.执行绪弹性较差 |
+------+--------------------------------+-----------------------------------+
◆ 先谈 OpenMP 好了
(1) 可以在单线程的程序中插入平行化的指令,对软体设计的确是很方便的,
但为了达到这个目的,它需要动态调节执行绪的指令,指令集就相对的多,
所以会演化成
CISC,晶片空间会不够实做大量暂存器 (差不多几百个)。
(2) 在调整执行绪数目时,那些本来闲置的 core 必需重做指令拮取 (fetch),
也就是
重置管线,所以会有 overhead。
(3) 因为是
原本的单线程做 invoke,若这些工作不同时,就不易发出大量执行绪,
想像一个老板要叫 10 个员工去做 10 个不同的工作,就要一个一个叫过来谈,
那不是很花时间吗?所以大量发出执行绪有困难。
(4) 但也因为这 10 个员工都能独立做事,所以执行绪任务分配上较为弹性,
不过各自能力都很强,同步化的就不容易了,必需使用 wait 机制。
(5) 每个核心都很完整,连指令和资料管线都独立,也就是不能合并来做,
除了透过快取层来协调之外,直接合并指令和资料很难,
而快取比暂存器
和 ALU 运作慢,这种情况下的指令的合并有不如无。
(6) 资料在各核心之间的同步,其实和快取一致性的有关,现在 x86 这族
的 CPU 还没有出现 shared memory,所以同步化的上限顶多就是和 texture
一样而己 (它也是用 cache)
(7) 在需要序列化的处理时,它可以关闭其它 core,比较不会占用资源。
----------------------------------------------------------------------
◆ 再来谈 SIMT
(1)
因为设计成执行绪群组,所以指令拮取和资料读取很容易合并,老板叫
10 个员工一起做一件事,只需沟通一次即可,而做的工作又类似,要拿
的记忆体位址也都很近,可以一次叫 RAM 送来。
(2)
但这 10 个员工要协调好,不要重覆做到相同的事,那就是正交性的问题,
这些分割现在要由软体负责,所以程式设计上会比较困难一点。
(3) 执行绪切换时,因为是
群组切换(warp),所以 overhead 很小,很容易就
可以发出大量且运作顺畅的执行绪,
(4) 因为执行绪硬体上并不完全独立(MP & warps),所以弹性较差,有些需要
转为序列化处理的部份,会比较卡资源。
(5) 现阶段的 SIMT 和硬体相依性颇高 (MP, warps, 最大暂存器数, branch...),
所以在做最佳化时常要考虑硬体细节,比较复杂的情况下,有时会觉得像
在写组合语言的延伸而不是 C++ 的延伸~~ XD
(6)
演算法在这个领域很缺乏,是值得发展的空间。 .:+:
(7) 硬体较简单,倾向於 RISC,所以暂存器光是 G80 的一个 MP 就有 8,192 个,
16 个 MP 的 32-bit 暂存器总量就是
8,192 * 16 = 131,072 13万个,真是吓死人
GTX280 每个 MP 暂存器数量加倍,30 个 MP 的暂存器总量就是
16,384 * 30 = 491,520 将近 50 万个 @_@
看这个趋势,明年 NV 不知道会不会推出
「百万暂存器」的晶片。
-------------------------------------------------------------------
小弟先去体育馆运动一下,回头再来吐泡泡 ...oO
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.208.148
1F:推 lookers:推荐这篇文章 11/05 20:39
2F:推 fanzero:我又要收下了这篇XD 11/05 20:50
3F:推 Luciferspear:。o O ○。o O ○。o O ○。o O ○。o O ○。o 11/05 22:54
※ uf2000uf:转录至某隐形看板 11/06 00:52
4F:推 lavatar:推一下... 11/06 01:03
5F:推 mnmnqq:推! 11/06 01:13
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.208.148
6F:推 TroyLee:推 11/06 14:46
7F:推 williamsoul:看到表格让我想到洪X 11/22 11:47