`

CUDA-寄存器使用

    博客分类:
  • CUDA
阅读更多

1.重要概念

存储带宽:在一定时间内从DRAM读出或写入的数据量

延迟:响应一个获取内存的请求所花费的时间,这个时间通常是上百个处理器周期

2.SM,SP,Grid,Block,thread,warp

    从硬件角度讲:SM(流多处理器),一个SM可以看作是一个多线程的CPU核,一个GPU包含多个SM,一个SM包含有多个SP(流处理器),1.x硬件,一个SM包含8个SP,2.0是32个,2.1是48个,3.0和3.5是192个。这意味着每个SM在任何时刻都能同时运行这些数目的硬件线程。

 

    从软件角度讲:Grid,Block,Thread是线程(thread)的组织形式,最小的逻辑单位是thread,若干个线程组成一个block,block被加载到SM上运行,多个block组成整体的grid。最小的硬件执行单位是warp(线程束),当前一个线程束包含32个线程。

参考
http://blog.csdn.net/zhuxianjianqi/article/details/8905678

 3.寄存器的用法

   CPU与GPU架构的一个主要区别就是CPU与GPU映射寄存器的方式。CPU通过使用寄存器重命名和栈来执行多线程;GPU利用多线程隐藏了内存获取与指令执行带来的延迟,GPU不使用寄存器重命名机制,而是致力于为没一个线程都分配真实的寄存器。因此当需要上下文切换时,所需要的操作就是将指向当前寄存器组的选择器(或指针)更新,以指向下一个执行的线程束的寄存器组,因此几乎是零开销。

   每个SM能调度若干个线程块。在SM层,线程块即若干个独立线程束的逻辑组。编译时会计算出每个内核线程所需要的寄存器数目。所有的线程块都具有相同大小,并拥有已知数目的线程,每个线程块需要的寄存器数目也就是已知和固定的。因此,GPU就能为在硬件上调度的线程块分配固定数目的寄存器。

   然而在线程层,这些细节对程序员是完全透明的。如果一个内核函数中的每个线程需要的寄存器过多,在每个SM中GPU能够调度的线程块的数量就会受到限制,因此总的可以执行的线程数量就会受到限制。开启的线程数量过少就会赵成硬件无法被充分利用,性能急剧下降,但开启过多又意味着资源可能短缺,调度到SM上的线程块数量会减少。

     根据硬件的不同,每个SM可供所有线程使用的寄存器空间大小也不同,分别有8KB,16KB,32KB以及64KB.牢记,每个线程中的每个变量会占用一个寄存器。

     总之,在编写GPU程序是,为了充分发挥硬件性能和程序速度,应考虑好寄存器数,线程数,SM调度的线程块数等的关系。同时最大化地利用寄存器。

分享到:
评论

相关推荐

    CUDA-By-Example里的Julia修复包(patched)

    2. **设备内存模型**:CUDA中存在多种内存类型,包括全局内存、共享内存、常量内存、纹理内存和寄存器。理解这些内存的特性、访问速度和使用策略对于优化代码至关重要。 3. **CUDA核函数(Kernel)**:核函数是执行...

    cuda-使用cuda并行加速实现之scan.zip

    3. **Memory Hierarchy**:CUDA提供了多种内存层次,包括寄存器、共享内存、全局内存等。合理地使用内存层次可以显著提高性能。例如,对于频繁访问的小数据集,可以存储在共享内存中以减少全局内存访问。 4. **...

    CUDA-C++-编程指南.pdf

    - **内存层次结构**:包括全局内存、共享内存、寄存器等,不同的内存类型具有不同的访问特性和延迟。 - **异构编程**:支持 CPU 和 GPU 之间的协同工作,通过流式异步操作提高效率。 - **异步 SIMD 编程模型**:...

    cuda-handbook.rar_cuda_cuda学习

    2. **CUDA内存层次**:CUDA有五种不同的内存类型,包括全局内存、共享内存、常量内存、纹理内存和寄存器。理解这些内存类型的区别及其访问速度和使用场景是优化CUDA程序的关键。 3. **CUDA API**:CUDA提供了丰富的...

    CUDA-API教程,CUDA编程基础教程

    4. **全局内存和共享内存**:CUDA中的内存系统分为多种类型,包括全局内存、共享内存、寄存器和纹理内存。全局内存是所有线程都能访问的,但速度相对较慢;共享内存则位于每个SM上,访问速度快,适合线程块内部的...

    cuda-TSP:使用 CUDA 扩展在 C 中实现旅行商问题

    - CUDA是NVIDIA为程序员提供的一个软件开发工具包,它允许开发者直接使用C/C++语言编写程序,然后在GPU上运行这些程序。 - CUDA的核心概念包括:主机(Host)代码和设备(Device)代码、线程块(Thread Block)、...

    CUDA-programming.zip_GPGPU_OpencL_cuda_opencl cuda_opencl+cuda

    总的来说,这个压缩包中的“cuda程序设计.ppt”很可能会涵盖CUDA编程基础、CUDA与OpenCL的对比、如何使用CUDA进行GPGPU编程以及可能的CUDA和OpenCL的联合应用。通过深入学习这些内容,开发者可以掌握利用GPU进行并行...

    cuda-optimization-tips-tricks-and-techniques.pdf

    1. **内存优化**:优化内存访问模式,减少内存访问的不连续性和数据碎片,如使用预取和缓存策略,以及利用同步内存(shared memory)和寄存器(registers)降低全局内存访问。 2. **CPU-GPU数据传输**:通过固定CPU...

    Aspects Related to Data Access and Transfer in CUDA - Slides - 2

    CUDA中的内存层次结构包括寄存器、L1缓存、L2缓存和全局内存。其中,寄存器速度最快但数量有限,全局内存最大但访问速度相对较慢。因此,合理地分配和使用内存对于提升计算性能至关重要。开发者需要根据应用程序的...

    cuda-training-examples:“使用CUDA CC ++进行加速计算的基础知识”课程中的代码示例

    1. **CUDA架构**:CUDA架构由GPU、主机CPU、全局内存、共享内存、寄存器、流式多处理器(SM,Streaming Multiprocessors)等组成。理解这些组件如何协同工作是学习CUDA编程的基础。 2. **CUDA设备和上下文**:CUDA...

    CUDA学习----sp, sm, thread, block, grid, warp概念 .docx

    2. SM(Streaming Multiprocessor):SM是GPU的大核,由多个SP以及其他资源如调度器、寄存器和共享内存等组成。SM是GPU执行并行计算的主要实体。每个SM内部的资源是有限的,这限制了能够并发运行的warp数量,进而...

    cuda入门教程-CUDA_Getting_Started_2.1_Windows

    开发者可以使用C语言,一种广泛使用的高级编程语言,来编程CUDA架构,从而在CUDA支持的处理器上以高性能运行程序。 CUDA架构及其相关软件的设计目标主要体现在以下几点: - **提供对标准编程语言的少量扩展**:如...

    CUDA-Raytracer:用CUDA编写的简单光线跟踪器,将其输出保存为.ppm文件,其中包括CPU版本供参考

    4. **全局内存、共享内存和寄存器**: 这是CUDA设备上的不同类型的存储。全局内存可供所有线程访问,但速度较慢;共享内存由线程块内的线程共享,速度较快;寄存器是最快速的,但数量有限。 5. **同步和原子操作**: ...

    CUDA——性能优化(一)

    全局内存访问通常伴随着显著的延迟,大约400-600个时钟周期,这远高于其他内存层次(如共享内存和寄存器)。为减轻这一问题,可以通过合并Warp的内存访问来提高带宽利用率。当多个线程以相同地址或相邻地址访问全局...

    cuda安装与使用 cuda博客 cuda入门资料

    3. **CUDA内存管理**:理解不同类型的内存(全局、共享、常量、纹理、寄存器)至关重要,因为它们在性能上有很大差异。全局内存是所有线程可访问的,但速度较慢;共享内存则快得多,但只能在同一个线程块内共享。 4...

    《GPU高性能运算之CUDA》-张舒-源代码

    6. **内存管理**:深入理解CUDA的内存层次,如寄存器、L1缓存、L2缓存、全局内存和共享内存的特性,以及如何进行内存分配和管理以提高效率。 7. **错误处理与调试**:介绍CUDA程序的错误检测和调试方法,包括使用...

    Shane Cook - CUDA Programming -olvasOM

    CUDA中的内存层次结构包括全局内存、常量内存、纹理内存、共享内存以及寄存器等不同类型的内存区域。每种类型都有其独特的特性和用途: - **全局内存**:位于GPU的显存中,用于存储大部分数据。 - **常量内存**:...

    cuda regisger 测试

    测试了CUDA中寄存器,共享内存,和全局内存的创建。 。

    NVIDIA_CUDA_C_ProgrammingGuide(CUDA 编程指南)

    - 寄存器:线程可以使用寄存器来存储临时变量,寄存器访问速度最快,但数量有限。 - 常量内存:用于存储只读数据,访问速度较快,但容量较小。 - **异构编程** - CUDA 支持在同一程序中混合使用 CPU 和 GPU,即...

Global site tag (gtag.js) - Google Analytics