首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
CUDA
CUDA高性能计算讨论
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
《利用GPU进行高性能数据并行计算》附MD5破解源码
[已结贴,结贴人:DING_YIMING]
加为好友
发送私信
在线聊天
DING_YIMING
丁艺明
等级:
发表于:
2008-04-25 10:19:03
楼主
《利用GPU进行高性能数据并行计算》
丁艺明,刘 波 (趋势科技)
(全文文发表于《程序员》2008第4期)
摘 要
:图形处理芯片GPU通过单指令多数据(SIMD)指令类型来支持数据并行计算,提供惊人的计算能力。本文探讨基于GPU的并行编程模型与并行编程等软件技术。虽然GPU最初专门是为图形渲染设计的,通过我们的DES 编解码, MD5密码破解, 字符串匹配等实验,证明GPU还可以有效地执行多种通用的基于整数的计算。本文还讨论了以通用计算为目的GPU发展趋势。
关键词
:高性能计算;GPU;CPU
高性能计算
数据库技术的成熟,数据挖掘应用,生物基因技术的发展,历史数据的几何级膨胀等要求高性能计算(High Performance Computing,HPC)。虽然通过创建分布式系统可以解决部分大型计算的问题,但是分布式系统有通信开销大,故障率高;数据的存取结构复杂,开销大;数据的安全性和保密性较难控制等弱点。随着计算机处理器,特别是GPU (Graphical Processing Unit)计算能力的飞速提高,高性能计算逐步进入桌面(低端)领域,这就要求我们探讨并行编程模型与并行编程等软件技术。
GPU 强大计算能力
早期的3D游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成。图形渲染适合并行处理,擅长于执行串行工作的CPU实际上难以胜任这项任务。直到1995年,PC机领域第一款GPU 3dfx Voodoo出来以后,游戏的速度、画质才取得了一个飞跃。GPU的功能更新很迅速,平均每一年多便有新一代的GPU诞生,运算速度也越来越快。
Intel Core2Due
Woodcrest G80 Chip 运算能力比较
24 GFLOPS 520 GFLOPS GPU快21.6倍
为什么GPU跑得快?
GPU具有两点主要特征:超长流水线与并行计算[4]。
如果装配一台汽车需要10个时间单元,将它分成10个流水线阶段,每个阶段分配一个时间单元,那么一条装配线每一个时间单元就可以生产一辆汽车。显然流水线模式的生产在理想状况下要比串行方式快了十倍。
GPU通过单指令多数据(SIMD)指令类型来支持数据并行计算。在单指令多数据流的结构中,单一控制部件向每条流水线分派指令,同样的指令被所有处理部件同时执行。例如NVIDIA 8800GT显卡中包含有14组多处理器(Multiprocessor),每组处理器有8个处理单元(Processor),但每组多处理器只包含一个指令单元(Instruction Unit)。
GPU流式编程模型
GPU编程以流式编程模型为基础,它以允许高效计算和通信的方式构造程序[3]。在流式编程模型中,所有数据都表现为流。我们把流定义为具有相同数据类型的数据的有序集。数据类型可以是简单的(整数或浮点数流)或复杂的(点或三角形或变换矩阵流)。流可以是任意长度,如果流很长(流中有上百或更多的元素),那么流上的操作并行度将很高。流上允许的操作包括复制它们,从它们导出子流,用一个单独的索引流索引入它们,以及用核在它们上执行计算。GPU程序称为核,核操作整个流,获取一个或多个流作为输入并产生一个或多个流作为输出。核的特征是它操作多个流上的所有元素而不是独立的元素。
CPU程序以异步的方式调用GPU核程序。GPU作为CPU的协处理器(Coprocessor)提供服务。
实验
我们的实验基于CUDA的SDK以及C语言编译器在8800GT显卡上开发运行的。CPU版程序为双线程,用VC++6.0开发,运行于Intel Core2Duo主频为2.6G赫兹。实验结果中,GPU版程序运行时间包括输入数据流和输出数据流上传和下载到显卡的I/O时间。
1 DES 编解码
DES算法对64位数据进行加密后输出64位数据。DES算法可以用流计算模型来实现,输入与输出流的基本数据类型为64位数据。核程序为DES算法。
DES 编码 CPU 时间 GPU时间 GPU版比CPU版快
64 M字节 11.4秒 1秒 11.4 倍
表2:CPU/GPU DES编码实验结果
2 MD5密码破解
在我们的程序中,允许用户输入一长度为五的密码的MD5值,每位密码变化范围是A~Za~z[]\^_`{} ¦~,共64种字符。穷举所有的密码并用MD5算法得到所有的MD5值,与用户输入的MD5值比较,若枚举的密码MD5值与用户输入匹配,输出该密码。
MD5 破解可以用流计算模型来实现,输入流基本数据为长度为5个字符的密码,可以枚举出来。所有基于密码产生的128比特 MD5值可看为中间结果流。核程序为MD5算法。最后,把中间结果和输入的MD5值比较的布尔值组成最终结果流。
MD5 破解 CPU 时间 GPU时间 GPU版比CPU版快
穷举1G种可能 201秒 15.3秒 13.1 倍
表3:CPU/GPU MD5 破解实验结果
3 字符串匹配
本实验随机产生64M字节的文本和64个长度为8的关键字,找出在输入的文本中出现的关键字。本实验的程序采用的是Boyer-Moore-Horspool-Sunday(BMHS)字符串匹配算法.
字符串匹配问题用流计算模型来实现,输入流为64M字节文本。核程序为分别对64个关键字进行字符串匹配的算法。把64个关键字字符串匹配结果的布尔值组成结果流。
值得一提的是,对每个关键词的搜索在窗口内进行,窗口的大小于关键词的长度相等,窗口沿着文本向右滑动。BMHS算法将窗口内文本的最后一个字符(L)和关键字的最后一个字符进行比较。如果相等,则需要在搜索窗口中从后向前对文本和关键字进行比较,直到完全相等或者在某个字符处不匹配。然后,都将根据L在关键字的下一个出现的位置将 窗口向右移动。对每个关键词移动的距离,也就是下次读取字符的位置,是不一样的。参见图 NVDIA GeForce 8体系结构,每次从GPU设备存储器(Device Memory)读取数据需要耗费400~600个时钟周期[1]。本实验把输入文本和一两维图像(纹理)进行绑定,这样也就利用了纹理缓存(Texture Cache)来提高设备存储器的访问速度,减少大量的I/O时间。
字符串匹配 CPU 时间 GPU时间 GPU版比CPU版快
64 M字节文本 14.5秒 1.4秒 10 倍
表4:CPU/GPU字符串匹配实验结果
4 实验结果小结
吞吐量可由输入数据大小比上处理器运行时间。从图3 CPU/GPU吞吐量实验结果表明,GPU在通用计算方面的性能能够比CPU快10倍以上。MD5密码破解程序的I/O最小,DES编码程序次之,字符串匹配程序I/O最大。相对于CPU版程序吞吐量,GPU版MD5密码破解相对性能最高,DES编码程序次之,虽然字符串匹配程序相对性能最低,但GPU版程序也能比CPU版程序快一个数量级。
GPU能取代CPU吗?
GPU在运算能力的远远超越CPU,GPU是否能取代CPU呢?答案是否定的。GPU具有CPU所没有的局限性。GPU只提供单指令多数据类型处理,适合于数据并行计算。GPU在条件控制能力方面非常弱,若程序使用条件控制语句会极大影响GPU程序的执行效率。当然,有部分条件控制语句可以用计算来代替,例如,判断两个整数是否相等可以用两个整数异或后再映射成0和1来代替。本文中的实验中,利用了这些技巧来避免使用条件控制语句。另外现在的GPU与主机(host)数据交换只能通过总线来实现,对于需要大量I/O的应用,通讯就会成为GPU性能瓶颈。
以通用计算为目的GPU发展趋势
NVIDIA发布Tesla通用计算架构方案,Tesla GPU运算处理器不是一图形处理专业卡,可以看作之前的NVIDIA图形处理专业卡的通用计算版本。
可以看出,以通用计算为目的GPU发展趋势是GPU和CPU的整合,适合于大量数据并行计算的任务由GPU来承担,GPU定位为CPU的协处理器。需要复杂条件控制的,只能串行处理的任务由CPU来承担。CPU和GPU互相配合工作。
参考文献:
[ 1 ] NVEDIA。CUDA Programming Guide。
[ 2 ] Kapasi。流计算模型。
[ 3 ] Gonzalo Navarro, Mathieu Raffinot。《柔性字符串匹配》。
[ 4 ] 沈璐。《GPU为什么跑得快?》。
附MD5破解源码, License: GPL V2.
我不能上传源码,错误提示为“不能打开文件”。请发邮件给我 (ding.yiming # gmail.com) 索要源码。
问题点数:
0
回复次数:
33
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xiongzm
等级:
发表于:
2008-04-29 14:19:14
1
楼 得分:
0
很好的应用,不错的文章,学习学习!
还是看好GPU用来做通用计算的
TESLA就是太贵了
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
huma_cs
李洛克
等级:
发表于:
2008-04-29 17:36:24
2
楼 得分:
0
收到LZ的源码了,正在研究中,十分感谢...
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
eagleinfo
eagle
等级:
发表于:
2008-04-30 14:19:09
3
楼 得分:
0
源码已收到,学习中,感谢。。。。
望不吝赐教
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
UltraBejing
OneNightInBejing
等级:
发表于:
2008-05-01 08:43:31
4
楼 得分:
0
没遇到过这种情况.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
davyzn
等级:
发表于:
2008-05-03 11:48:58
5
楼 得分:
0
源码已收到,谢谢
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
davyzn
等级:
发表于:
2008-05-03 18:19:15
6
楼 得分:
0
疑问,源码用vs2005编译执行后,用debug模式正常,耗时15000ms,但是用emudebug模式无法crack出字串,耗时15ms,按我的理解,emudebug模式是用cpu模拟GPU,应该也能够正常跑出和debug模式一样的结果才对啊,请DING_YIMING 赐教
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
DING_YIMING
丁艺明
等级:
发表于:
2008-05-04 09:42:44
7
楼 得分:
0
CUDA SDK 提供两种模式:Device 和 Debug。Debug模式实际上是用CPU线程去仿真GPU行为,每个芯片组线程数一般设置超过128,其效率肯定很差。Device模式是不能单步跟踪的。Debug模式只用于提早发现一些程序逻辑错误。
据我的经验, 同一代码在这两种模式下运行,其行为并不完全相同。我的建议是同一代码在GPU(GPU Device模式)运行后的结果最好和CPU版(不是GPU Debug模式)比较一下它们的运行结果。CPU版编译器毕竟用了几十年,其正确性大家都认同。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jiedao
戒刀
等级:
发表于:
2008-05-07 13:42:26
8
楼 得分:
0
不错的gpu应用文章吗。我对gpu非常感兴趣,还望能多发点关于gpu的文章。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
DING_YIMING
丁艺明
等级:
发表于:
2008-05-07 16:42:24
9
楼 得分:
0
我想可以讨论一些如何克服GPU在条件控制语句方面的限制,我知道的包括:
Workarounds for GPU Constraints in Conditional Controls:
1) Computing instead of condition controls
2) Min, Max Operations
3) Compare & Swap Operation
4) Less & Swap Operation
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
fonmy
等级:
发表于:
2008-05-07 19:38:22
10
楼 得分:
0
源代码已经收到,拜读了在《程序员》杂志上的文章,谢谢,学习中~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wl1167
Squall
等级:
发表于:
2008-05-13 12:41:49
11
楼 得分:
0
源码已收到!非常感谢!研究中。。。。。。。。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
WilfredLiu
等级:
发表于:
2008-05-14 10:56:24
12
楼 得分:
0
收到LZ源码,多谢!学习中~~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
albertyth
等级:
发表于:
2008-05-15 08:56:34
13
楼 得分:
0
烦请发一份CUDA的MD5源码,忠心感谢!
albertyth@163.com
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hyhhmh
等级:
发表于:
2008-05-16 09:59:50
14
楼 得分:
0
能否把你的邮箱重新说一遍啊,我发邮件给你,怎么发不出去啊
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
DING_YIMING
丁艺明
等级:
发表于:
2008-05-17 13:06:12
15
楼 得分:
0
因太多的垃圾邮件,故不好公开邮件地址. ding.yiming#gmail.com (#换成@)
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
whycoby
Rio
等级:
发表于:
2008-05-17 16:44:30
16
楼 得分:
0
你好,上次收到你的MD5代码后总算能运行了,但我有一个MD5需要破解,密码长度未知,字符集为数字+字母,可否帮我修改一下代码呢?
MD5为:D299FF39B0E56B17E9E21889B20FC41E
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cys348
yiyun
等级:
发表于:
2008-05-18 23:30:29
17
楼 得分:
0
代码已收到,谢谢
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hyhhmh
等级:
发表于:
2008-05-19 08:59:48
18
楼 得分:
0
谢谢,代码我已经收到,正在研究!!!!!!!!!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hyhhmh
等级:
发表于:
2008-05-19 11:38:02
19
楼 得分:
0
怎么还没发给我源码啊,快点咯,将不胜感激!!!!!!!!!!!!!!!!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
DING_YIMING
丁艺明
等级:
发表于:
2008-05-19 17:44:21
20
楼 得分:
0
"你好,上次收到你的MD5代码后总算能运行了,但我有一个MD5需要破解,密码长度未知,字符集为数字+字母,可否帮我修改一下代码呢?
MD5为:D299FF39B0E56B17E9E21889B20FC41E"
MD5例子中, 假设密码由'A'-'A'+64组成,只枚举了长度为5的所有可能密码,其个数为64^5=1G. 密码长度可逐步增加去破解。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
whycoby
Rio
等级:
发表于:
2008-05-20 14:43:55
21
楼 得分:
0
引用 20 楼 DING_YIMING 的回复:
"你好,上次收到你的MD5代码后总算能运行了,但我有一个MD5需要破解,密码长度未知,字符集为数字+字母,可否帮我修改一下代码呢?
MD5为:D299FF39B0E56B17E9E21889B20FC41E"
MD5例子中, 假设密码由'A'-'A'+64组成,只枚举了长度为5的所有可能密码,其个数为64^5=1G. 密码长度可逐步增加去破解。
可否请丁大侠帮忙修改一下代码呢?我不会弄啊,谢谢了啊,密码是由数字与字母构成,长度未知,感激不尽!!!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jjqgpu
月雨
等级:
发表于:
2008-05-20 18:39:43
22
楼 得分:
0
学习
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
arnewc
arnewc
等级:
发表于:
2008-05-21 12:29:13
23
楼 得分:
0
已经收到lz的源代码,非常感谢。
前几天因为有事情不能上网,所以迟了。
最近关注并行计算,在认真研读代码,有心得会上来说的
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
woyaowenzi
我咬蚊子
等级:
发表于:
2008-05-23 09:27:47
24
楼 得分:
0
嘿嘿,真好!了解中....
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
mominer
Zebra
等级:
发表于:
2008-05-29 20:01:19
25
楼 得分:
0
aworm@sina.com, 谢谢!!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yj198387
干活的人
等级:
发表于:
2008-05-31 12:07:25
26
楼 得分:
0
你好,代码已经收到,非常感谢.但调试时出现了一个错误,不知道为什么.
simplestream.cu(7):fatal error 01083:无法打开包括文件:"cutil.h":No Such file or directory.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
DING_YIMING
丁艺明
等级:
发表于:
2008-06-03 09:08:20
27
楼 得分:
0
Your project can not located the CUDA standard header file. The cause may
1) You have not install CUDA SDK
2) your project setting is wrong.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hyhhmh
等级:
发表于:
2008-06-03 11:07:20
28
楼 得分:
0
丁大侠,怎么还不发源码给我呢,我在等呢,我的邮箱是humh@gongsuda.com
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yufeng2002
CSDN,I like
等级:
发表于:
2008-06-03 20:20:41
29
楼 得分:
0
已经发了mail,未见回复,如可能,请将源码发到yf_ncc@yahoo.com.cn
不胜感谢!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hyhhmh
等级:
发表于:
2008-06-10 09:05:18
30
楼 得分:
0
我已经发了邮件这么久拉,你怎么还没把源代码发给我啊,我的邮箱是humh@gongsuda.com,麻烦你尽快发给我,谢谢!!!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ballby
等级:
发表于:
2008-06-17 16:43:17
31
楼 得分:
0
ballby@sohu.com
非常感谢!!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ballby
等级:
发表于:
2008-06-18 14:49:14
32
楼 得分:
0
请问,LZ对GPU和CPU的比较,GPU的程序不用说,我想应该是做了“充分优化”的了,
那针对CPU的相应程序有没有作"优化"?如果CPU程序没有优化,那么结果可能不是很有说服力了。
一般情况下,这些程序本身在CPU上运行"优化前"和“优化后”就可能差一个数量级以上!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
cVinson
等级:
发表于:
2008-06-24 16:56:43
33
楼 得分:
0
我也想获得一份源码,给楼主发了mail没有回复…
希望之前收到源码的人分享一份给我吧
我的mail: xmuvinson@foxmail.com
不胜感激!
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛