楼主: 图腾部落

CUDA第四期有奖讨论:谈谈你对CUDA的架构的理解(活动已结束)

[复制链接]
论坛徽章:
4
2012新春纪念徽章
日期:2012-01-04 11:56:01ITPUB 11周年纪念徽章
日期:2012-10-09 18:14:482014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08
11#
发表于 2010-1-4 16:14 | 只看该作者
高手,仰慕……

使用道具 举报

回复
论坛徽章:
12
2010新春纪念徽章
日期:2010-03-01 11:08:29马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-02-18 11:42:502011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
12#
发表于 2010-1-4 17:38 | 只看该作者
咋有人 copy的blog~~来回贴啦~~

使用道具 举报

回复
论坛徽章:
21
2010新春纪念徽章
日期:2010-03-01 11:08:292012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主3段
日期:2012-05-15 15:24:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:12:25
13#
发表于 2010-1-4 20:01 | 只看该作者

回复 #12 OpenHero 的帖子

开勇:这个题目是你出的吧?

使用道具 举报

回复
论坛徽章:
7
2012新春纪念徽章
日期:2012-01-04 11:56:01itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50
14#
发表于 2010-1-4 21:06 | 只看该作者
1.CUDA toolkit 和sdk
·CUDA Toolkit version 1.1 for Win XP
·CUDA SDK version 1.1 for Win XP
ps: ·NVIDIA Driver for Microsoft Windows XP with CUDA Support (169.21) 在开发的时候,这个可以不用安装,如果是有支持CUDA的显卡的时候,安装这个才有效)
在安装过程中,会提醒你是否把sdk和toolkit的设置加入到VS的开发环境中,这里要选择是,但是CUDA windows 版本,目前只支持6.0. vs2003, vs2005的toolkit的bat,vs2008的好像还不支持。
2.设置系统环境变量
将安装的CUDA的sdk的路径加到系统环境变量中:
例如C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\bin\win32\
下的
├─Debug
├─EmuDebug
├─EmuRelease
└─Release
几个目录都加入到系统环境变量中,这样才能在运行程序的时候找到相应的dll库。
3.VS2005建立CUDA简单的工程
a.创建简单的空win32项目
b.加入新的项,自己修改为example.cu
c.右键点击exampl.cu 选择自定义编译选项
命令行中添加 "$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -deviceemu -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -I"$(CUDA_INC_PATH)" -I./ -I../../common/inc -o $(ConfigurationName)\example.obj example.cu

输出里面修改为 $(ConfigurationName)\example.obj
依赖项 修改为 example.cu
ps:这里的编译选项是为了方便很多还没有支持CUDA开发的显卡的朋友。这里的用的编译选项是在模拟器上运行。如果到时候有了真的可以运行CUDA的硬件支持,可以自己修改编译选项;
下面就是自己写example.cu的程序。
d.右键点击example项目,选择最终编译选项为exe文件。
e.编译,执行,就会看到模拟器执行程序了:)

使用道具 举报

回复
论坛徽章:
3
15#
发表于 2010-1-4 21:17 | 只看该作者
看了各位楼主的介绍,又学到了很多东西。下面是我对CUDA架构的理解,在这里算是抛砖引玉了。
CUDA架构最主要的包含两个方面:一个是ISA指令集架构;第二硬件计算引擎。实际上它就是硬件和指令集,这两个方面是CUDA的架构。
NVIDIA GPU的架构就是CUDA的架构,举例来说,你可以把它看成是跟Intel的X86或者IBM的Cell,他们都是CPU架构,而CUDA架构是基于GPU的架构。CUDA的GPU架构和CPU架构很类似,比如X86是包含一套指令集和执行X86各种各样的CPU,而对于CUDA也是一样的,NVIDIA有一套指令集ISA,还有各种各样执行指令集和各种各样的硬件引擎。另外CUDA到目前为止,它包含了一个C语言的编译器,就是在CUDA上面的C语言,CUDA这个架构还可以支持其他的API,包括OpenCL或者DirectX,同时以后NVIDIA的CPU还支持其他语言,包括Fortran、Java、Python等各种各样的语言,可以说这种架构是原生的,专门为计算接口而建造的这样的一个架构。CUDA硬件架构包括指令集都是非常适合于并行计算,为异构计算而设计的一整套架构。也许会有人疑问,既然有了CUDA为何还需要OpenCL,或者类似OpenCL的API呢?
简单来说,对于编程人员他可以选择不同的方式来进行编程,他们可以选择OpenCL API编程也可以选择C for CUDA语言来编程。
而API和语言的编程、开发存在着本质的不同,API是一个编程接口,它的核心是函数库和应用程序开发的一个硬件接口。用API来编程的话它有一个好处,那就是可以访问比较低层次的硬件资源,但这样的最大化控制硬件资源带来了很多弊端,例如在内存管理上就必须靠编程人员手动控制,这就需要编程人员要拥有高超的编程技术和深厚的经验积累。而就C for CUDA来说,编程人员在利用C for CUDA语言来编程的时候,无需考虑过多与自身编程目的以外的因素。再拿前文提及的内存管理来说,C for CUDA使用Runtime进行管理。
不过不管OpenCL还是C for CUDA语言来编程,最终它都是需要通过一个驱动程序来变成一个PTX的代码,PTX相当于CUDA的指令集来进行执行,然后交给图形处理其或者交给硬件来进行执行。这两个最终达到都是使用PTX或者在我们GPU上进行执行。
简单来说,如果你想获得更多的对硬件上的控制权,你可以使用API来进行变成。而如果你对API不是十分了解,或者说无法很好的掌控API编程,这时你可以用CUDA C语言来编程。二者是两种不同编程的方式,它们有相同点也有不同点,但是有一点OpenCL和CUDA C语言进行开发的时候,在并行计算方面它们的概念十分接近,这也就奠定了程序之间的相互移植会比较容易。
 对C语言编程了解的读者应该知道,C语言利用的驱动程序就是API,也许谈及这个很抽象,实际上C for CUDA就是一种C语言的扩展,而针对扩展的主要方面就是并行运算编程,这些是通过C的扩展来获得。基本上认为CUDA的程序也是一种标准的C语言的程序,然后你使用一些关键字然后来对并行这方面计算,然后做一些区分。C语言最终编译会成为PTX的代码,然后在GPU上执行。
OpenCL是一个API,就是应用程序的编程接口,OpenCL和OpenGL很像,这种API你可以调用API里面的函数库,通过程序开发调用各种各样的函数,实现各种各样的功能。对于API来说一般它对硬件设备有比较完整的访问权,你可以访问硬件设备,可以对内存进行管理,最后OpenCL通过编译和驱动程序可以生成PTX代码在GPU上进行执行。

使用道具 举报

回复
论坛徽章:
0
16#
发表于 2010-1-4 21:25 | 只看该作者
CUDA的架构就是每个GPU都由一系列的纹理处理集群来组成,每一组纹理处理集群则是由一大块纹理撷取单位和和2~3组流处理器组成,而它们则是由8个处理单元以及两组超级函数单元组成。所有指令均按照SIMD(单指令多线程)原则执行,当一个指令调用后,所有线程同步运算。
例如,一个14个多核处理器的显卡产品,
如果每个多核处理器拥有112个核心,
每个核心拥有65536*65536*1个Grid,
每个Grid拥有512*512*64个Block,
每个Block又可以同时最多运行512个线程(每个Block拥有8个寄存器)。
我们可以粗略的算出这块显卡可以同时进行越85亿个线程,而仅需要十亿字节的存储器就够用了,也就是说我们的显存一般情况下是足够用的。

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2010-1-4 21:31 | 只看该作者
CUDA架构仅限于NVIDIA产品,感觉这也是CUDA技术目前的一些限制,今天我在这谈一下CPU和GPU架构之间的差别,以便大家能够更多的了解一下CUDA 的架构。
CPU的设计初衷是为了能够以最快的速度按照顺序来执行完一条单一的指令;而GPU的设计则是为了能够让核心同时执行更多的指令。CPU的工程师们为了尽可能的提高平行处理能力,因此Pentium处理器增加了每周期能够执行两个超标量指令,Pentium Pro额外增加了顺序执行指令。不过并行处理连续指令还有一些基本限制,那就是增加越来越多的处理能力却不能够获得更好的执行效果。

GPU却从最初的设计就能够执行并行指令,从一个GPU核心收到一组多边形数据,到完成所有处理并输出图像可以做到完全独立。由于最初GPU就采用了大量的执行单元,这些执行单元可以轻松的加载并行处理,而不像CPU那样的单线程处理。另外,现代的GPU也可以在每个指令周期执行更多的单一指令。例如,在某些特定环境下,Tesla架构可以同时执行MAD+MUL or MAD+SFU。

其次,GPU还不同于CPU的内存访问原则。例如,如果一个纹理texel在内存中已经就绪,那么GPU很容易从内存中预读它。同样如果一个像素被写入到帧缓冲区,那么几个周期之后附近的像素也将会被写入。因此,内存部分是不同于CPU的。不同于通用处理器,GPU不需要交大的缓存,纹理仅需要几个字节(现代GPU高达128-256KB)。同时,内存的运行模式上GPU也与CPU不同。例如,并非所有的CPU内置内存控制器,而所有GPU产品都会同时拥有多个内存控制器,例如NVIDIA最新的GT200系列拥有多达8个64位通道的内存控制器。此外,显卡还会采用速度更快的内存设备,所以GPU能够享受到更高的内存带宽,这也是并行计算当中非常重要的一个环节。

通用处理器的晶体管数量大部分都用在了命令缓冲区、硬件分支预测、大量的缓存上,好让CPU能够在更短的时间内完成单一指令周期。而GPU则不同,GPU将大量的晶体管则用在了阵列执行单位、调度、少量的共享内存、内存控制器等,他们让GPU获得更高的内存带宽后能够同时处理上千个线程。

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2010-1-4 21:36 | 只看该作者
并行运算架构——CUDA
NVIDIA CUDA技术,也是为释放GPU并行计算能力而设计的,NVIDIA CUDA能够通过通用性防范的高级编程语言让GPU进行非常适合的并行计算。
  CUDA最初同NVIDIA GeForce 8800 GPU一道推出,现在NVIDIA所有GPU均已支持CUDA。CUDA是NVIDIA并行计算战略的基础。与使用CPU相比,科学家们见证了CUDA为其应用程序所带来的最高20到200倍的速度提升,CUDA已经被全球研究界人士所广泛采用。从超级计算机与工作站到消费类PC,CUDA架构已被构建到各种各样的计算系统中。现在,目前有25,000多名开发人员利用CUDA架构从事活跃的开发工作。

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2010-1-4 21:37 | 只看该作者
由于C语言具备易学、使用者多等等普遍性,因此NVIDIA将C语言作为了CUDA架构的编程语言,CUDA C语言让很多对GPU架构、特性并不了解的人,同样可以控制GPU为他们服务。
  虽然CUDA C让人们真正的了解了GPU通用运算,在很多领域体验到了CUDA的优势,但是还是有很多人不太了解什么是CUDA,CUDA其实并不是一种编程语言,而是一种并行运算的架构,我们可以把每个支持CUDA的NVIDIA GPU当作是一个CUDA架构,例如:GT200,在进行通用运算时,我们就可以把他们当作是一个240个处理器的CUDA架构,而CUDA C语言仅仅是协调、控制这个CUDA架构的一种语言环境。

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2010-1-4 21:44 | 只看该作者
谈到NVIDIA的CUDA架构自然要和KHRONOS制定的OpenCL联系起来,两者并不冲突,他们之间的关系是API与执行架构之间的关系,
举个简单的例子:
我们熟悉的X86架构是一种CPU架构,而各种编程语言,如:汇编语言、C语言等低级语言或高级语言仅仅是建立在X86运算架构之上的一种编程环境。那么,CUDA架构和OpenCL之间的关系和X86与编程语言的关系是相同的。
  CUDA架构是OpenCL的运行平台之一,因此他们之间并不存在谁取代谁的关系。OpenCL仅仅是为CUDA架构提供了一个可编程的API而已。

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表