楼主: 图腾部落

第三期有奖话题:“晒晒”你的CUDA开发经历!{活动结束获奖名单已公布}

[复制链接]
论坛徽章:
9
41#
发表于 2009-12-31 22:55 | 只看该作者
CUDA表示Compute Unified Device Architecture(统一计算设备架构),是一种新型的硬件和软件架构,用于将GPU上作为数据并行计算设备在GPU上进行计算的发放和管理,而无需将其映射到图像API。它可用于GeForce 8系列、Tesla解决方案和一些Quadro解决方案(详细信息请参阅附录A)。操作系统的多任务机制负责管理多个并发运行的CUDA和图像应用程序对GPU的访问。
CUDA软件堆栈由几层组成,如图1-3所示:硬件驱动器,应用编程接口(API)及其runtime库,还有两个更高层的通用数学库CUFFT和CUBLAS,这两个库在单独的文档中介绍。硬件已经设计为支持轻量级驱动和runtime层,以达到高性能。

使用道具 举报

回复
论坛徽章:
0
42#
发表于 2010-1-1 08:18 | 只看该作者
CPU代码作用:在kernel启动前进行数据准备和设备初始化的工作,以及在kernel之间进行的一些串行运算。理想状况下 ,CPU串行代码的作用只是清理上一个kernel函数,并启动下一个kernel函数。

CUDA并行计算函数kernel:它是整个CUDA程序中的一个可以被并行执行的步骤。

kernel函数中存在两个层面的并行:Grid中的block间并行;block中的thread间并行。

kernel:组织形式是grid;以block为单位执行。

Grid:表示一系列可以并行的block的集合;

         各个block之间无法通信,没有执行顺序;

         目前一个kernel中只有一个grid,未来DX11中将采用MIMD架构,允许一个kernel中存在多个不同的grid。

block:同一个block的线程需要共享数据,必须在同一个sm中发射;(在同一个时刻,一个sm中可有多个活动block)

          block中的每一个thread被发射到一个sp上;

          block的数量是处理核心的数量的几倍的时候,才能充分发挥GPU的运算能力:如果太少,无法体现其计算速度相较传统方式的优势。

Thread:有自己的私有寄存器和local memory;

             同一个block内的线程可以通过共享存储器和同步机制进行通信。

实际运行单元:warp(线程束),大小由硬件能力决定。tesla架构的gpu中为32。划分依据是block的ID,比如,0~31为一束。

                    32的warp:每发射一条warp指令,sm中的8个sp会将这条指令执行4遍。

CUDA编程key:

    程序以及warp中尽量避免分支:

                  warp中尽量避免使用分支:如果有分支,sm需要把每一个分支的指令发射到每一个sp上,再根据sp决定要不要执行,执行时间将

                  是所有分支之和。

使用道具 举报

回复
论坛徽章:
9
ITPUB社区OCM联盟徽章
日期:2013-03-27 11:17:11奥运纪念徽章
日期:2013-06-18 09:13:52ITPUB社区千里马徽章
日期:2013-08-22 09:58:03大众
日期:2013-08-30 14:51:33路虎
日期:2013-12-01 18:25:42
43#
发表于 2010-1-1 08:20 | 只看该作者
ptx代码:类似于汇编余元,是为动态编译器jit设计的输入指令序列。
                      jit可以在使用不同的机器语言的显卡上运行同样的ptx,保证兼容性。
                      jit的输出受到硬件和其他一些因素影响,有不确定性。
                     对于需要确定代码的独立软件开发商,可以把代码编译成cuda二进制代码cubin,避免jit过程的不确定性。
CUDA运行时api:在驱动程序api基础上进行了封装,编程方便。
                        放在CUDArt包中;
                        函数以CUDA前缀;
CUDA驱动程序API:基于句柄的底层接口。
                          放在nvCUDA包里;
                          前缀为cu;

使用道具 举报

回复
论坛徽章:
0
44#
发表于 2010-1-1 19:35 | 只看该作者
原帖由 215197 于 2010-1-1 08:18 发表
CPU代码作用:在kernel启动前进行数据准备和设备初始化的工作,以及在kernel之间进行的一些串行运算。理想状况下 ,CPU串行代码的作用只是清理上一个kernel函数,并启动下一个kernel函数。

CUDA并行计算函数kernel:它是整个CUDA程序中的一个可以被并行执行的步骤。

kernel函数中存在两个层面的并行:Grid中的block间并行;block中的thread间并行。

kernel:组织形式是grid;以block为单位执行。

Grid:表示一系列可以并行的block的集合;

         各个block之间无法通信,没有执行顺序;

         目前一个kernel中只有一个grid,未来DX11中将采用MIMD架构,允许一个kernel中存在多个不同的grid。

block:同一个block的线程需要共享数据,必须在同一个sm中发射;(在同一个时刻,一个sm中可有多个活动block)

          block中的每一个thread被发射到一个sp上;

          block的数量是处理核心的数量的几倍的时候,才能充分发挥GPU的运算能力:如果太少,无法体现其计算速度相较传统方式的优势。

Thread:有自己的私有寄存器和local memory;

             同一个block内的线程可以通过共享存储器和同步机制进行通信。

实际运行单元:warp(线程束),大小由硬件能力决定。tesla架构的gpu中为32。划分依据是block的ID,比如,0~31为一束。

                    32的warp:每发射一条warp指令,sm中的8个sp会将这条指令执行4遍。

CUDA编程key:

    程序以及warp中尽量避免分支:

                  warp中尽量避免使用分支:如果有分支,sm需要把每一个分支的指令发射到每一个sp上,再根据sp决定要不要执行,执行时间将

                  是所有分支之和。

好象是复制的编程指南吧?不过挺有用,支持

顺便通俗的解释下,CUDA编程指南本来就挺复杂,翻译的时候又几乎是直译的,很多句子看了也不知道在说什么,我从头到脚看了N遍才懂一点他们想说什么,大部分信息都没往脑子里去 所以解释下,让跟我一样头疼的初学者们理解的容易一点。
thread是每次让一个GPU执行的最小单位操作,就是一次让GPU算个加几减几的一个操作,所以它的数量是GPU的整数倍的时候最能体现速度,比如你有128个GPU,thread数量最好是128乘以几,像256,或者1280这种数( block的数量是处理核心的数量的几倍的时候,才能充分发挥GPU的运算能力:如果太少,无法体现其计算速度相较传统方式的优势)

每个GPU有自己的寄存器和缓存,就是计算的数据和结果之类的有自己的地方放(随身带个腰包 ),但它们之间不能交换信息,所以一般来说会用别的方法把结果放在一起,然后再调用所有GPU进行下一批运算,比如建一个数组 INT I[N],第一个thead结果放在 I[1],下一个结果放在I[2],以此类推,如果计算到中途需要上一步的计算结果,但所有GPU是同时运行的,这个thread需要一个计算的结果,但不知道该出结果的thread是不是已经算出来了,就要用个程序等待这一批所有结果都算出来,再继续往下算,这里的一批指令就是所谓的BLOCK和GRID,就像排积木,把一堆积木排到一起,就是BLOCK,其实就是很多thread的组合,但这一堆不能和的另一堆交换结果,要等都算出来了,才能把结果和别的BLOCK放在一起。至于GRID也一样,就是N多的BLOCK,类似于集装箱,里面封装了很多箱子。(Grid:表示一系列可以并行的block的集合; 各个block之间无法通信,没有执行顺序;)
这些是比较基本的理论,其实都不怎么难,就是挺复杂,真不知道GPU为什么造的这么麻烦   希望有想看的人能看明白

使用道具 举报

回复
论坛徽章:
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
45#
发表于 2010-1-1 22:45 | 只看该作者
这里的资料确实不错

使用道具 举报

回复
论坛徽章:
0
46#
发表于 2010-1-2 06:55 | 只看该作者
没有人贴源码啊,还想学习一下呢

使用道具 举报

回复
论坛徽章:
124
信息化板块选型征文获奖徽章
日期:2007-09-07 11:21:25马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14优秀写手
日期:2014-06-10 06:00:28青年奥林匹克运动会-网球
日期:2014-09-13 10:31:45祖国65周年纪念徽章
日期:2014-09-26 23:23:05马上有对象
日期:2014-11-04 23:17:36
47#
发表于 2010-1-2 12:05 | 只看该作者
通过CUDA帮你解决了什么样的问题?
说说我们公司利用CUDA解决上次说到的三维动画放大缩小的大量数据并行计划过程吧.
=================================

NVIDIA目前推出的用于GPU计算的CUDA开发环境,简单的说是将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。因为在CUDA的架构中,计算不再像过去所谓的GPGPU(通用图形计算)架构那样必须将计算映射到图形API(OpenGL和Direct 3D)中。因此,这功能可以说对开发人员的要求降低了许多。

考虑到CUDA的GPU编程语言是基于标准的C语言,因此我们这次的开发语言是基于C语言的。这使到我们许多具有C语言基础的开发人员很容易融入到团队来开发CUDA的应用程序。 例如,在这过程中我们发现CUDA的DLL开发其实和一般的C/C++的DLL开发是一个原理。大家自己可以琢磨一下它的方式。

===================
回到正题:如何应用CUDA解决三维动画放大缩小的大量数据并行计算?
因为GPU的特点是处理密集型数据和并行数据计算,因此在开始并行计算话题之前,我认为首先需要了解并行处理的原理,这样讨论才有基石

其中一个核心问题是:什么是内核函数?
简单的说:内核函数是一个在CUDA设备上执行的函数——同时由多个线程平行执行。这涉及指定内核名函数称及执行配置。执行配置是指定义在运行CUDA设备内核时组中的平行线程数及要使用的组数。
也就意味着:只要使用得当的话,CUDA就能符合SIMD-PRAM模型,也就是n台功能相同的处理机,用看似是一个容量无限大的共享处理器M(换句话说是:实现并行分时处理)。

例如:我们可以用thread数为256的block自适应处理不同尺寸的数据计算。对尺寸为2-16(2,4,8,16)的写一类核,一个block处理128-16个问题;对尺寸为32-128(32,64,96,128)的核,一个block处理8-2个问题;对尺寸为256的核,使用一个核处理;对尺寸256以上的核,使用多个核或者一个核内进行循环处理。

最后
在实现大量数据并行计算过程中,大家可以讨论一下以下几个常见的核心问题
在并行计算过程中,我们的经验是缩减问题(reduction)推荐使用二叉树的方式来做。因为基于同样的树状结构进行缩减操作,还可以进行排序,累乘,寻找最大最小值,求方差等。

而对于邻域问题:如在图像处理中,经常可以遇到邻域问题,如4-邻域,8-邻域等。基本思想就是使用图像中的几个元素按照一定的算子计算输出矩阵中的一个元素。基本思路是:1.在原有图像周围扩展像素,向外扩展像素数由邻域决定,如4-邻域和8-邻域扩展1个像素,24-邻域扩展2个像素等。2.每个block处理输出图像中长宽为16x16的一小部分,每个thread处理输出图像中的1个像素。这样每个block的线程数是256,符合nv推荐的192-256的范围。

当然还有许多其它的方式,大家可以再深入的讨论一下。

使用道具 举报

回复
论坛徽章:
29
行业板块每日发贴之星
日期:2009-05-14 01:01:052011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:53:54ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14懒羊羊
日期:2015-03-04 14:52:11
48#
发表于 2010-1-2 13:56 | 只看该作者
看到大家讨论,我也来说说我在选择和配置的经历和心得体会:
实际上,我在选择GPU开发环境上很长时间是犹豫不决的。

NVIDIA的CUDA已经有一定的规模,但AMD的ATI也不甘落后,ATI Stream SDK是AMD为开发者提供的一套完整的GPU通用计算开发平台,通过ATI Brook+ 语言就能快速轻松地开发支持ATI Stream通用计算技术的应用程序,而且32/64位的Windows XP/Vista和Linux系统下均可使用,不亚于NVIDIA的CUDA SDK。

在选型的过程中,我了解到这些区别:
区别是NVIDIA的cuda开发工具版本比较齐全,包括Windows7的32和64的都有支持。文档也很不错,至少数量上比较多。相比较,AMD的就很简陋,目前还没有Windows7的支持,文档也很少。


在后来我还是选择了NVIDIA的cuda的开发环境:
一般来说, CUDA开发环境配置需要依次安装 Driver,Toolkit,SDK。
以下是我总结的VS2008配置CUDA开发环境的过程:

  1、安装和设置Visual Studio 2008环境。
  2、安装开发助手Visual Assist X。

  3、安装CUDA开发环境:CUDA 驱动--〉CUDA Toolkit --〉CUDA SDK
     按我的理解是:CUDA体系结构的组成包含了三个部分:开发库、运行期环境和驱动。开发库是基于CUDA技术所提供的应用开发库。运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。

      CUDA 驱动:由于目前存在着多种GPU版本的NVIDIA显卡,不同版本的GPU之间都有不同的差异,因此Driver驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,是提供硬件设备的抽象访问接口。目前基于CUDA开发的应用必须有NVIDIA CUDA-enable的硬件支持。
    CUDA Toolkit :目前 NVIDIA 提供的 CUDA Toolkit支持 Windows (32 bits 及 64 bits 版本)及许多不同的 Linux 版本。而且,CUDA Toolkit 需要配合 C/C++ compiler。
    CUDA SDK:在 Windows 下,CUDA Toolkit 和 CUDA SDK 都是由安装程序的形式安装的。CUDA Toolkit 包括 CUDA 的基本工具,而 CUDA SDK 则包括许多范例程序以及链接库。基本上要写 CUDA 的程序,只需要安装 CUDA Toolkit 即可。不过 CUDA SDK 仍值得安装,因为里面的许多范例程序和链接库都相当有用。CUDA Toolkit 安装完后,预设会安装在 C:\CUDA 目录里。

  4、最后,还要将NVIDIA CUDA SDK的usertype.dat文件copy到Microsoft Visual Studio \IDE目录下面。这样应该就可以直接在 Visual Studio 的 IDE 中,编辑 CUDA 程序后,直接 build 以及执行程序了。

      CUDA 的主要工具是 nvcc,它会执行所需要的程序,将 CUDA 程序代码编译成执行档 (或 object 文档) 。在 Visual Studio 2008下,我是透过设定 custom build tool 的方式,让 Visual Studio 自动执行 nvcc。

请大家多多提建议~~

[ 本帖最后由 潘八妹 于 2010-1-2 14:07 编辑 ]

使用道具 举报

回复
论坛徽章:
113
生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章2007版:羊
日期:2011-10-11 10:20:29生肖徽章:猴
日期:2007-04-10 01:23:40生肖徽章:虎
日期:2011-10-11 10:20:29生肖徽章:羊
日期:2007-08-12 22:22:56生肖徽章:兔
日期:2007-08-15 17:25:14生肖徽章:虎
日期:2011-10-11 10:20:29生肖徽章:虎
日期:2007-09-24 07:24:16
49#
发表于 2010-1-3 10:58 | 只看该作者
CPU代码作用:在kernel启动前进行数据准备和设备初始化的工作,以及在kernel之间进行的一些串行运算。理想状况下 ,CPU串行代码的作用只是清理上一个kernel函数,并启动下一个kernel函数。

CUDA并行计算函数kernel:它是整个CUDA程序中的一个可以被并行执行的步骤。

kernel函数中存在两个层面的并行:Grid中的block间并行;block中的thread间并行。

kernel:组织形式是grid;以block为单位执行。

Grid:表示一系列可以并行的block的集合;

         各个block之间无法通信,没有执行顺序;

         目前一个kernel中只有一个grid,未来DX11中将采用MIMD架构,允许一个kernel中存在多个不同的grid。

block:同一个block的线程需要共享数据,必须在同一个sm中发射;(在同一个时刻,一个sm中可有多个活动block)

          block中的每一个thread被发射到一个sp上;

          block的数量是处理核心的数量的几倍的时候,才能充分发挥GPU的运算能力:如果太少,无法体现其计算速度相较传统方式的优势。

Thread:有自己的私有寄存器和local memory;

             同一个block内的线程可以通过共享存储器和同步机制进行通信。

实际运行单元:warp(线程束),大小由硬件能力决定。tesla架构的gpu中为32。划分依据是block的ID,比如,0~31为一束。

                    32的warp:每发射一条warp指令,sm中的8个sp会将这条指令执行4遍。

CUDA编程key:

    程序以及warp中尽量避免分支:

                  warp中尽量避免使用分支:如果有分支,sm需要把每一个分支的指令发射到每一个sp上,再根据sp决定要不要执行,执行时间将

                  是所有分支之和。

     优化存储器访问:理想状态时所有存储器仅此那个传输的同时,GPU的各个核心也始终在进行计算。这需要合理划分程序。

CUDA软件体系:

        CUDA C:一种用c语言编写设备端代码的编程方式,包括对c的一些扩展和一个运行时库。

         nvcc编译器:分离源文件中的主机代码和设备代码;

                          主机代码由c文件形式输出,交流高性能编译器,如ICC、GCC或者其他合适的高性能编译器进行编译。或者在编译的最后阶段交给其他编译器生成.obj或者.o文件。

                          设备代码由nvcc编译成ptx代码或者二进制代码。

                        

         ptx代码:类似于汇编余元,是为动态编译器jit设计的输入指令序列。

                      jit可以在使用不同的机器语言的显卡上运行同样的ptx,保证兼容性。

                      jit的输出受到硬件和其他一些因素影响,有不确定性。

                      对于需要确定代码的独立软件开发商,可以把代码编译成cuda二进制代码cubin,避免jit过程的不确定性。

CUDA运行时api:在驱动程序api基础上进行了封装,编程方便。

                        放在CUDArt包中;

                        函数以CUDA前缀;

CUDA驱动程序API:基于句柄的底层接口。

                          放在nvCUDA包里;

                          前缀为cu;

使用道具 举报

回复
论坛徽章:
7
NBA常规赛纪念章
日期:2010-04-15 14:01:10NBA季后赛纪念徽章
日期:2010-06-21 13:18:42世界杯纪念徽章
日期:2010-07-12 13:08:00NBA常规赛纪念章
日期:2011-04-15 13:34:11NBA季后赛纪念徽章
日期:2011-06-13 11:34:51CBA常规赛纪念章
日期:2011-12-27 13:44:23NBA常规赛纪念章
日期:2012-04-27 16:07:05
50#
发表于 2010-1-3 12:39 | 只看该作者
下载相关的软件:显卡驱动、 CUDA Toolkit、CUDA SDK,如果你显卡支持CUDA,请先安装支持CUDA的显卡驱动,之后安装CUDA Toolkit(现在叫CUDA,假设安装在d:\programming\cuda\toolkit目录下),之后安装SDK(假设安装在d: \programming\cuda\sdk目录下),一般来说安装完后,相应的环境变量都已设置好,包括 CUDA_BIN_PATH,CUDA_INC_PATH,CUDA_LIB_PATH等。
设置基本环境

下载相关的软件:显卡驱动、CUDA Toolkit、CUDA SDK,如果你显卡支持CUDA,请先安装支持CUDA的显卡驱动,之后安装CUDA Toolkit(现在叫CUDA,假设安装在d:\programming\cuda\toolkit目录下),之后安装SDK(假设安装在d: \programming\cuda\sdk目录下),一般来说安装完后,相应的环境变量都已设置好,包括 CUDA_BIN_PATH,CUDA_INC_PATH,CUDA_LIB_PATH等。
配置VisualStudio环境(语法高亮,VA设置等)

语法高亮:将d:\programming \cuda\sdk\doc\syntax_highlighting\visual_studio_8里面的usertype.dat文件copy到 Microsoft Visual Studio 8\Common7\IDE目录下面(如果已经存在,就追加到原来的后面)。
设置VS2005环境:进入Tools|Options|Projects and Solutions|VC++Directories 添加:
Include files:d:\programming\cuda\toolkit\include和d:\programming\cuda\sdk\common\inc
Library files:d:\programming\cuda\toolkit\lib和d:\programming\cuda\sdk\common\lib
Source files:d:\programming\cuda\sdk\common\src
进入VC++ Project Settings:C/C++ File extensions:添加*.cu,在Text editor-File extension:添加cu 对应editor到Microsoft VC++ editor。
Visual Assist X设置:关闭已经所有打开的Visual studio,安装VA,之后进入注册表编辑器:HKEY_CURRENT_USER\Software\Whole Tomato\VANet8 找到右边的ExtSource项,将其值添加.cu;.cuh;之后关闭,再次打开VS2005即可。)

使用道具 举报

回复

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

本版积分规则 发表回复

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