Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1804355
  • 博文数量: 290
  • 博客积分: 10653
  • 博客等级: 上将
  • 技术积分: 3178
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 23:08
文章存档

2013年(6)

2012年(15)

2011年(25)

2010年(86)

2009年(52)

2008年(66)

2007年(40)

分类: LINUX

2010-01-14 16:15:03

1:cuda体系结构构建于一个多线程流处理器阵列.当一个在主机CPU上执行的cuda程序调用一个kernel grid 时,grid中的线程块被枚举并分发到具有计算能力的多处理器上执行。一个线程快的所有线程同时在一个多处理起上并发的执行,当线程块终止时,新的块被装入空出的多处理器上运行.
 多处理器的实现:
 2:一个多处理器由8个标量处理器核心,两个用于先验的特殊功能单元,一个多线程指令单元,和一块share memory 芯片组成;多处理器在硬件中创建 ,管理,执行并发的线程,并且调度开销为0。。它可通过一条内部指令实现 _syncthreads()_ 屏障同步。快速的屏障同步与轻量级线程创建和零开销的线程调度相结合,有效地为细粒度并行化提供了支持,举例来说,您可以为各数据元素(如图像中的一个像素、语音中的一个语音元素、基于网格的计算中的一个单元)分配一个线程,从而对问题进行细粒度分解。
 3:为了管理运行在不同运用程序的数百个线程,多处理器使用一种称为SIMT(单指令,多线程)的新架构.多处理器映射每一个线程到一个标量处理器核心(core),并且每个标量线程使用它自己的指令地址和寄存器状态独立执行,多处理器以称为warps的32个线程组来创建,管理,调度,并执行 warps的所有线程。此术语源于第一种并行线程技术 weaving。半 warp 块可以是一个 warp 块的第一半或第二半。组成SIMT的warp的各个线程都从同一程序地址开始执行,但也可以自由分支并独立执行.
 4:当一个多处理器执行一个或者多个线程块时,它将它们分为由SIMT 单元调度执行的warps。将一个block分为warps的方法总是相同的;每个warps都包含线程id连续递增的线程,第一个warps包含 thread 0;线程id可由块的索引和grid的索引得到;
 5:在每一个指令分发时间,SIMT单元选择一个等待执行的warp并将下一条指令分发给该warp中的活动线程。在同一时间,一个warp的线程执行同一条指令,因此,当所有在warp中的32个线程都认同它们的执行路径时,执行效率最优;如果一个warp的线程从一个独立于数据的条件选择语句变量处分散(指执行路径),warp会连续的执行每一个分支路径而禁止未在此路径上的线程执行,当所有的路径执行完成,线程会汇聚到后面共同的执行路径下。分支仅在一个warp内发生,不同的warps 独立的执行而不管它们执行的是共同的代码路径或分立的代码路径.
 6:SIMT架构类似于单指令控制多处理元素的SIMD向量组织方式.一个主要的不同点在于,SIMD向量组织向软件公开SIMD的宽度(处理元素的个数)而SIMT指令指定单一线程的执行和分支行为,这和SIMD向量机形成对比;SIMT能让程序员为独立于标量线程的线程级并行代码,也允许为协作线程编写独立于数据的并行代码。为了确保正确性,程序员可以忽略SIMT本质上的行为,然而,通过注意那些很少而又在一个warp中被分离的代码却能得到实质的性能提升。实际上,这类似于传统编码中的线性缓存,当设计正确性而又必须被认为是高性能的代码结构时,缓存行的大小可被安全的忽略,而在另一方面,向量组织需要软件来并入向量并手动管理分支。
每个多处理器都有如下四种类型的片上存储器:
 1:每个处理器上有一组本地 32 位寄存器;
 2:由所有标量处理器核心共享的并行数据缓存或者是共享存储器(share memory),share memory就位于此处;
 3:被所有标量处理器核心共享的constant cache ,可加速从常量内存空间的读取操作,constant memory 是设备内存的一个只读区,属于,全局内存,由gpu所有的线程共享
4:被所有标量处理器核心共享的纹理cache ,可加速从纹理内存空间的读操作,纹理内存区是设备内存的一块只读区域,每个多处理器存取一个称为texture unit 的纹理缓存变量,texture 单元实现了不同的寻址模式和过滤方法。

局部和全局存储空间是设备内存的读写区域而不是缓存;
 5:一个多处理器一次能处理的块数目,被称为每个多处理器活动块数目,被激活的块数目依赖于每个线程需要多少个寄存器和给定内核中每个块需要的share memory。因为多处理器的寄存器和共享存储器分配给被激活块中的所有线程。如果一每个多处理器能利用的share memory 和regsters 还不够一个block使用,那么内核将运行失败;每个多处理器的最多能激活块数目,最多能激活warp数目和最大运行的线程数在附录A中给出;
 6:如果一个warp中有多于一个的线程同时对全局或者共享存储的同一地址执行一个非原子warp 写指令,对于该地址串性话写指令的数量和顺序都是无法确定的,但是必定能保证至少一次写操作成功;如果一个warp中有多于一个的线程同时对全局内存的同一地址进行读,写,修改操作,那么,对该地址的每一次读,写,修改操作都能串行执行,但是它们执行的顺序是未知的;

多设备:
 1:使用多个GPU作为cuda设备的应用程序如果在多GPU系统上运行,只需要保证多个GPU的型号相同。
 2:系统使用SLI模式时,所有的GPU都在驱动级融合而在运行时设备是分离的,下面的描述是一些特别的注意事项。
 a:在一个GPU设备A上分配内存,可能会耗尽其它GPU的内存资源,因为这样,内存分配可能不容易成功;
b:当一个direct3D应用程序运行于SLI模式,应用程序可能为了使用CUDA-DIrect3D的互用性而创建Direct3D设备 
阅读(2405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~