POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
楼主: Elvis
打印 上一主题 下一主题

您认为CUDA技术最终能让我们电脑发展走向GPGPU计算时代吗?[NVIDIA达人挑选赛]

[复制链接]
1#
发表于 2009-7-16 18:41 | 显示全部楼层
本帖最后由 天魔 于 2009-7-16 18:42 编辑

这里的问题提的是CUDA能否最终能让我们的电脑发展走向GPGPU计算时代,首先要看看能与CUDA相提并论的东西有哪些,就CUDA本身而言,是一个非常大的概念,包括了硬件和软件两部分。

如此看来,能与CUDA同等级的东西实际上是AMD Stream和Intel的Larrabee Native,而不是OpenCL或者Compute Shader这两个低阶的API。

就这三者而言,CUDA有以下的优势和不足:

优势:

1、硬件实物在06年发布距今已经是两年半,软件支持方案在07年年初发布,距今有两年的时间,具有时间上众所公认的优势。

2、相对AMD Stream来说,CUDA的软件工具、文档要比Stream更强大、更丰富、更清晰明了,Stream发布至今其实也有一年时间,但是应用软件和业界研究成果方面就相距甚远,Brook+编译器也是最近才提供了Local Data Store的支持。

3、Intel Larrabee目前其实在ISV方面还没有实际的硬件提供,实际运行的效果外界根本无法得知,唯一明了的是Ct由于有 Intel 提供的各种基本功能库,所以在使用上比白手写CUDA C更容易,加上Larrabee本身其实是一个真正的x86多核处理器,对LRBni的并行化支持,可以透过编译器得以解决一部分问题,所以Larrabee应该是在前期软件支持力度上比目前的CUDA更好,问题是Larrabee的实际规格我们目前无法得知,估计连Intel自己都还没最终拍板,简单地说就是不尽现实,还没出来的东西总是最好的。

5、NVIDIA对CUDA有比较明确的roadmap,对开发人员来说是一定的保证,不至于出现CTM那样半途而废的问题,而且可以了解到大致的工具软件更新进度。

CUDA目前存在的不足:
1、硬件方面受制于TSMC制程以及内存技术,目前的产品未能充分发挥GPGPU的理论性能,Thread Block之间无法实现片上数据共享,而在Larrabee上是没有这个问题的。
2、目前虽然已经有工具可以直接把CPU代码编译为CUDA代码,但是性能方面应该是不怎么样,当然这个问题在Intel Larrabee Native上也是一样存在。

在某种角度上而言,CUDA已经让我们踏入GPGPU计算时代,但是CUDA能否在后续的竞争中大获全胜就是另一回事情,这取决于英特尔在GPU上的成熟度和持久力,而不是微软,因为CUDA完全不是Compute Shader、OpenCL级别上的概念,能真正撼动CUDA地位的只有Intel Larrabee。
回复

使用道具 举报

2#
发表于 2009-7-16 19:05 | 显示全部楼层
CUDA C 编写的时候根本不存在所谓的调用抽象的硬件指令才能实现,它就是一个高级语言的扩展而已,使用 CUDA 完全不需要接触底层,只需要了解一些 CUDA 并行要素的层次即可,GPU 更新的时候,根本不需要重新编写代码也能直接编译运行,当然它也和CPU一样,在新的指令扩展出来后,透过编译器开关实现对新扩展的支持,例如 Intel 的编译器提供的 Qx 开关,在 CUDA C 编译器上也提供了诸如 -arch 的类似开关。

楼上对编程的了解可以说是张冠李戴,大量论点是完全错误套用。
回复

使用道具 举报

3#
发表于 2009-7-16 19:50 | 显示全部楼层
本帖最后由 天魔 于 2009-7-16 19:57 编辑

我不清楚你说的什么不使用 CUDA 只需要一行代码是啥意思,如果仅仅是指表达式我在 CUDA 上就是这样的:

  1.      exp(-0.005 * s) * 400 / (s * s + 50 * s)
复制代码


只要你有很多 s 要跑,这个算式就能在 CUDA 上实现高度的并行。

btw,既然你考了我一题,我也可以考你一下吧?
回复

使用道具 举报

4#
发表于 2009-7-16 20:20 | 显示全部楼层
本帖最后由 天魔 于 2009-7-16 20:22 编辑

这不重要,那基本上是编译器如何使用SP和SFU的问题
回复

使用道具 举报

5#
发表于 2009-7-17 13:36 | 显示全部楼层
G80和G200是存在严重缺陷的架构(对于GPGPU来说),其最多只能提供32位浮点数的支持,单这一点缺陷,就足以使其在图形以外的应用场合无人问津。
weihua8206 发表于 2009-7-16 19:37


你还是再看看CUDA的文档再说吧:

http://developer.download.nvidia ... mming_Guide_2.0.pdf

A.1.4 Specifications for Compute Capability 1.3
Support for double-precision floating-point numbers.

基于GT200或者说Tesla 10系列的NVIDIA 产品以及 AMD RV670、RV770、RV740都提供了对应IEEE 754标准的硬件双精度运算能力。
回复

使用道具 举报

6#
发表于 2009-7-17 15:46 | 显示全部楼层
本帖最后由 天魔 于 2009-7-17 17:11 编辑
对方辩友还是好好做足功课再来引用吧:目前的G200芯片中只有一个流处理器能进行双精度运算,其运算效率很低,速度也远比不上CPU。GPGPU的卖点就是运算速度和效率,既没效率又没速度,空谈支持,恐怕英伟达的设计人员自己都不好意思提“Support for double-precisionfloating-point numbers”这句话。

对方辩友引用CUDA的缺点来论证己方论点,这不是自己往枪口上撞么?功课做得不到家哈
weihua8206 发表于 2009-7-17 14:36


这里整个讨论主题中没有做好功课或者说根本没做功课的恰恰是你。

首先你提出了GT200没有双精度运算,这点已经被我批驳掉了,而后tomsmith123说的"8个SP 配合1个DP模块"又被你歪曲成GT200只有一个流处理器能进行双精度运算,这说明你对GT200的体系架构甚至连CPU的体系架构都完全是处于匮乏的状态,所能做的帖子大部分都是没有丝毫正确的论据来支撑其论点。

GT200有30个MP,每个MP有8个单精度Stream Processor、一个双精度Stream Processor、两个SFU,每个Stream Processor周期GT200能完成30个DP MAD,Stream Processor的运算时钟在Tesla C1060上是1.296 Ghz,双精度运算性能是78GFLOPS。

而在RV770上,每个SIMD Core有16个Thread Processor,每个Thread Processor有5个单精度运算单元,即ALU[X,Y,Z,W]和ALU.T,其中的ALU[X,Y,Z,W]可以执行双精度运算,在RADEON HD 4870上能提供200GFLOPS级别的双精度运算性能。

有多种因素制约了GPU的性能发挥,例如内存容量。就拿跑Linpack为例,矩阵规模越大,性能就越可以接近峰值,Tesla C1060目前只有4GB,相比之下CPU只要内存槽足够,上个16GB也是轻而易举的事情,我在Core i7 920上使用gotoblas跑linpack,可以做到35GFLOPS左右,矩阵规模是25000x25000,至少6GB的内存,如果把矩阵规模缩小到4GB,这个测试值就会掉2GFLOPS以上,但是Nehalem是三通道,要达到最佳的带宽,理论上应该是三条通道的内存容量一致,那如果是3GB的话,下降到30GFLOPS一点也不奇怪。

如果用N=23040,在Core2 Q6850 + Tesla C1060上跑 HPL,效率是整体(CPU+GPU)双精度峰值性能的66%,如果N=32320(8GB+4GB可以达到的最高求解规模上限,新版本的CUDA可以实现每个MPI进程的 page-lock 内存超过4GB),就能达到72%。

还有像BLAS库的问题,在软件上这个可能更加重要,CUBLAS 2.0和CUBLAS 1.0相比就有非常显著的性能提升。
回复

使用道具 举报

7#
发表于 2009-7-18 00:53 | 显示全部楼层
本帖最后由 天魔 于 2009-7-18 12:14 编辑
这位朋友说的不错,我不是底层架构的程序员,对CPU和GPU的底层架构并不很关心,也不想花很大的时间精力去研究英伟达的芯片组里面的SP单元和DP模块是怎样协同运作的。

但请你注意一个事实:世界上绝大多数的应 ...weihua8206 发表于 2009-7-17 22:19


也不知道你到底明白没有,CUDA本身就是不需要你接触微架构细节(这部分NVIDIA隐藏得很深),只是你需要做性能优化的时候,才需要进一步了解并行化的元素。

简单地说,如果你要编译一个程序,你可以什么开关都不加,直接编译得了,但是如果需要进一步优化性能,你就可能需要在编译器后面加个-O3。但是编译器并不总是那么聪明,这个时候你就需要做一些程序上的优化,例如un-loop什么的。

不管你写什么程序,这些过程对CPU和GPU都是一样的,我不相信你写什么程序都不需要做调试。如果你做matlab的话,本身就需要知道在浮点运算的情况下,(A+B)+C的运算结果在有些情况下就无法等同于A+(B+C),有些算式你就算用128位的精度,也不可能获得正确的运算结果,而这个误差为什么会造成,你是需要查阅处理器的浮点精度细节,这本身其实就是涉及到ISA,在这些过程中其实就很容易了解到微架构的大致情况。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2024-5-8 17:31

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

快速回复 返回顶部 返回列表