设备作为一组多处理器(multiprocessors)来实现,如图3-1所示。每个多处理器具有单指令多数据(SIMD)架构:在任何给定的时钟周期,多处理器的每个处理器执行相同的指令,但操作在不同的数据上。
每个多处理器具有下列四种类型的芯片内存储器:
1、每个处理器有一组本地32位寄存器
2、并行数据高速缓存或称为共享内存(shared memory),由所有处理器共享并实现共享内存空间
3、只读常量高速缓存(constant cache),由所有处理器共享并加速从常量内存空间的读取,实现为设备内存的只读区域
4、只读纹理高速缓存(texture cache),由所有处理器共享并加速从纹理内存空间的读取,实现为设备内存的只读区域
本地和全局内存空间为设备内存的读写区域,且无高速缓存。
每个多处理器通过纹理单位(texture unit)访问纹理高速缓存,其中纹理单位实现2.3一节提到的各种寻址模式和数据筛选。
具有芯片共享内存的一组SIMD多处理器。
线程块网格是通过调度块在多处理器上执行来在设备上执行的。每个多处理器一批接一批地处理块批。一个块仅由一个多处理器处理,所以共享内存空间驻留在芯片共享内存中,从而导致非常快的内存访问。
因为多处理器的寄存器和共享内存划分给块批的所有线程,所以每个多处理器一批可以处理多少块取决于给定内核每秒需要多少寄存器以及每块需要多少共享内存。如果每个多处理器没有足够的可用寄存器或共享内存来处理至少一个块,则内核将无法启动。
在一个批次内并被一个多处理器处理的块称为活动(active)块。每个活动块划分到称为warp的SIMD线程组中:其中每个warp包含相同数量的线程,称为warp大小,并以SIMD方式由多处理器执行。活动warp——比如所有活动块中的所有warp——是分时的:线程调度器(thread scheduler)定期从一个warp切换到另一个warp,以便最大化多处理器计算资源的使用。半warp(half-warp)是一个warp的第一半或第二半。
块划分为warp的方式始终相同;每个warp包含线程ID连续递增的线程,其中第一个warp包含线程0。2.2.1一节介绍线程ID与块中的线程索引如何相关联。
块中warp的执行顺序没有定义,但其执行可以同步以协调全局或共享内存访问,如2.2.1所述。
线程块网格中块的执行顺序没有定义,且块之间没有同步机制,所以在网格执行期间,来自同一网格的两个不同块中的线程无法通过全局内存安全地互相通信。
如果对于warp的多个线程,由warp执行的非完整(non-atomic)指令写入全局或共享内存中的相同位置,则此位置发生的序列化写入数目及其发生顺序没有定义,但会保证其中一个写入成功。如果由warp执行的完整(atomic)指令(参见4.4.6)读取、修改并写入warp多个线程的全局内存中的相同位置,则对此位置的每个读取、修改和写入都会发生,且全部序列化,但发生的顺序没有定义。
设备的计算能力(compute capability)由主要修订号和次要修订号来定义。
具有相同主要修订号的设备具有相同的核心架构。附录A中列出的设备都具有计算能力1.x(其主要修订号为1)。
次要修订号与核心结构的增量改进相对应,其中可能包括新功能。
各种计算能力的技术规范在附录A中给出。
使用多个GPU作为CUDA设备在多GPU系统上由应用程序运行时,仅当这些GPU具有相同的类型时,才能保证工作。但是,如果系统处于SLI模式,则只有一个GPU可以用作CUDA设备,因为在驱动器堆栈的最低层,所有GPU都熔合在一起。需要在控制面板中关闭SLI模式,CUDA才能将每个GPU看作单独的设备。
GPU将一些DRAM内存指定为所谓的主表面(primary surface),主表面用于用户查看的显示设备的显示刷新。当用户通过更改显示的分辨率或位深度(使用NVIDIA控制面板或Windows中的显示控制面板)来启动显示的模式开关(mode switch)时,主表面所需的内存量将随之变化。例如,如果用户将显示分辨率从1280x1024x32位更改为1280x1024x32位时,系统必须将7.68MB而非5.24MB指定为主表面。(运行时启用了反混淆的全屏图像应用程序需要更多的显示内存作为主表面。)在Windows中,可以启动显示模式开关的其他事件包括启动全屏DirectX应用程序、按下Alt+Tab将任务切换出全屏DirectX应用程序或按下Ctrl+Alt+Del锁定计算机。
如果模式开关增加主要表明所需的内存量,系统可能必须抽调指定给CUDA应用程序的内存分配,从而导致这些应用程序的崩溃。
|
|
|
|
|
|
|
|
|