`

CUDA-从GPU结构理解线程

    博客分类:
  • CUDA
阅读更多

   

原文地址: 
http://blog.csdn.net/sunmc1204953974/article/details/51074102

 

  在使用GPU线程时不是线程越多就越好,其实从硬件角度分析,支持CUDA的NVIDIA 显卡,都是由多个multiprocessors 组成。每个 multiprocessor 里包含了8个stream processors,其组成是四个四个一组,也就是两组4D的处理器。

     每个 multiprocessor 还具有 很多个(比如8192个)寄存器,一定的(比如16KB) share memory,以及 texture cache 和 constant cache

这里写图片描述

在 CUDA 中,大部份基本的运算动作,都可以由 stream processor 进行。每个 stream processor 都包含一个 FMA(fused-multiply-add)单元,可以进行一个乘法和一个加法。比较复杂的运算则会需要比较长的时间。

     在执行 CUDA 程序的时候,每个 stream processor 就是对应一个 thread。每个 multiprocessor 则对应一个 block。但是我们一个block往往有很大量的线程,之前我们用到了256个和1024个,远超一个 multiprocessor 所有的8个 stream processor 。

     实际上,虽然一个 multiprocessor 只有八个 stream processor,但是由于 stream processor 进行各种运算都有 latency,更不用提内存存取的 latency,因此 CUDA 在执行程序的时候,是以warp 为单位。

比如一个 warp 里面有 32 个 threads,分成两组 16 threads 的 half-warp。由于 stream processor 的运算至少有 4 cycles 的 latency,因此对一个 4D 的stream processors 来说,一次至少执行 16 个 threads(即 half-warp)才能有效隐藏各种运算的 latency。也因此,线程数达到隐藏各种latency的程度后,之后数量的提升就没有太大的作用了。

      还有一个重要的原因是,由于 multiprocessor 中并没有太多别的内存,因此每个 thread 的状态都是直接保存在multiprocessor 的寄存器中。所以,如果一个 multiprocessor 同时有愈多的 thread 要执行,就会需要愈多的寄存器空间。例如,假设一个 block 里面有 256 个 threads,每个 thread 用到20 个寄存器,那么总共就需要 256x20 = 5,120 个寄存器才能保存每个 thread 的状态。

     而一般每个 multiprocessor 只有 8,192 个寄存器,因此,如果每个 thread 使用到16 个寄存器,那就表示一个 multiprocessor 的寄存器同时最多只能维持 512 个 thread 的执行。如果同时进行的 thread 数目超过这个数字,那么就会需要把一部份的数据储存在显卡内存中,就会降低执行的效率了。

分享到:
评论

相关推荐

    Hands-On-GPU-Accelerated-Computer-Vision-with-OpenCV-and-CUDA-master.zip

    5. **并行编程**:CUDA编程涉及到线程块、网格、共享内存、同步等概念,学习者需要理解如何有效地组织和调度GPU上的计算任务,以实现最佳性能。 6. **OpenCV与CUDA结合**:结合OpenCV和CUDA,可以创建高效的混合...

    Hands-On-GPU-Programming-with-Python-and-CUDA-master.zip

    通过这个压缩包中的源代码,读者可以逐步深入学习GPU编程,从基础概念到高级技巧,最终能够熟练地利用CUDA和Python进行高性能计算。实践中遇到的问题,都可以通过源代码的示例找到解答,从而加深对GPU编程的理解,...

    CUDA-基于GPU加速的Levenberg-Marquardt曲线拟合实现-附项目源码-优质项目实战.zip

    通过这个优质项目实战,学习者不仅可以理解CUDA编程的基本原理,还能掌握如何利用GPU加速解决实际问题,尤其是Levenberg-Marquardt曲线拟合这类计算密集型任务。此外,源代码的分析和调试也能帮助提升阅读和理解复杂...

    CUDA-C 編程導讀

    **CUDA-C**是一种基于C语言的扩展编程模型,专门用于在支持CUDA的GPU上编写高性能应用程序。 #### 二、CUDA-C 版本更新 - **版本3.2变化概述**: - 简化了所有使用`cuParamSetv()`设置内核参数为`CUdeviceptr`...

    cuda-gdb.pdf

    调试者可以通过命令来检查程序的状态,比如查看内存和变量、观察纹理、使用info命令获取关于CUDA设备、流、瓦片、线程块、线程和上下文等的信息。 CUDA-GDB还允许用户在程序执行时进行单步执行,或者中断程序,这些...

    nvidia cuda-samples

    7. **动态并行性**:CUDA 3.0引入了动态并行性,允许GPU在运行时启动新的线程块,这在“dynamicParallelism”示例中得以体现。 8. **错误处理和调试**:CUDA编程中,正确处理错误和调试是必不可少的。CUDA-Samples...

    cuda-convnet2源码(截止2015-2-12)

    总结,CUDA-ConvNet2是一个强大的深度学习工具,其源代码揭示了深度学习模型在GPU上的实现细节,为理解和改进深度学习算法提供了宝贵的资源。通过深入研究和实践,开发者可以更好地掌握深度学习技术,推动计算机视觉...

    SDK_CUDA-Fortran_SDK_

    `cuda-gdb` 是一个 GPU 调试器,可以跟踪 GPU 线程执行情况,定位错误。 ### 6. 结合其他库和框架 CUDA-Fortran 可以与其他科学计算库(如 BLAS、LAPACK)或并行库(如 OpenMP)结合使用,以实现更复杂的计算任务...

    CUDA-Fortran-Book_nvidia_CUDA-Fortran_

    5. 流式多处理器(SM)和线程调度:理解GPU的硬件架构,优化线程执行效率。 6. 错误处理和调试:如何识别和解决CUDA编程中的错误,使用nvcc编译器的调试选项。 7. 性能分析和优化:使用nvprof等工具监控和分析程序...

    cuda-11.1.

    2. 性能提升:CUDA-11.1对多线程编程模型进行了优化,提高了并发性和并行度,使得在多GPU系统上的应用性能得到显著提升。 3. TensorRT集成:与TensorFlow标签相关,CUDA-11.1版本可能集成了最新的TensorRT,这是一...

    CUDA by Example: An Introduction to General-Purpose GPU Programming

    《CUDA by Example: An Introduction to General-Purpose GPU Programming》是一本深入浅出介绍CUDA编程的书籍,旨在帮助读者理解并掌握GPU(图形处理器)的通用计算能力。CUDA是NVIDIA公司推出的一种编程模型,它...

    CUDA技术的例子:通用的GPU编程简介CUDA by Example An Introduction to General-Purpose GPU Programming

    - **内存一致性模型**:CUDA提供了一套内存一致性模型,帮助开发者理解和预测多线程程序的行为。 - **异步执行**:通过异步执行API,可以在等待GPU完成计算的同时继续执行其他任务,提高了程序的整体效率。 #### 六...

    Supporting CUDA for an extended RISC-V GPU architecture.pdf

    这意味着开发了一个能够执行CUDA源代码的管道,该管道可以在RISC-V GPU上运行,包括多线程和原子操作等关键特性。这一进展对于那些希望在RISC-V硬件上利用GPU加速计算的开发者来说是一个重大突破,因为它打破了CUDA...

    CUDA-programming.zip_CUDA Programming_GPU编程技术

    2. **GPU架构**:CUDA编程的核心是理解GPU的架构,特别是流式多处理器(SMs)和CUDA线程模型。GPU包含多个处理单元,这些单元可以并行执行大量细粒度的任务。 3. **CUDA线程层次**:CUDA线程组织成块(Blocks)和...

    onnxruntime-linux-x64-gpu-1.16.2.tgz

    对于GPU加速,它会利用NVIDIA GPU的计算能力,通过CUDA和cuDNN库实现高效的模型推理。这在处理大量数据或高计算需求的场景下尤其有用,如图像分类、自然语言处理等任务。 在实际应用中,开发人员可以使用ONNX ...

    cuda-smi-master_GPU_源码

    学习CUDA SMI源码,开发者可以理解如何利用CUDA和NVML API进行GPU管理,这对于开发GPU相关的应用,如高性能计算、深度学习或者图形渲染等,是非常有价值的。同时,熟悉这些工具的内部工作原理也有助于优化应用程序,...

    CUDA-PSO-v2.0.tar.gz_CUDA P_CUDA_PSO_V2 _cuda pso_pso cuda

    Ring Topology是指GPU的线程块和线程在计算时的一种组织方式,可以有效利用硬件资源。Curand是NVIDIA提供的随机数生成库,通常用于模拟过程中的随机性需求,如初始化粒子的位置和速度。 在实际应用CUDA-PSO-v2.0时...

    TensorCores_CUDA-Fortran_

    7. **并行度与线程块配置**:合理配置CUDA的线程块尺寸和网格维度是充分利用TensorCores的关键。通过实验和分析,找到最佳的配置以最大化GPU的吞吐量。 8. **性能监控与优化**:使用NVIDIA的Nsight系统和Nsight ...

    pointpillars的cuda加速部署

    在自动驾驶和机器人技术领域,3D点云处理是至关重要的技术之一,因为它能提供环境的三维感知...然而,理解和优化CUDA代码可能需要一定的编程经验和对GPU计算的理解,因此在部署过程中可能需要投入一定的时间和精力。

    GPU-Z+CPU-Z+CUDA-Z Z家族软件

    GPU-Z、CPU-Z和CUDA-Z是三款在IT领域中非常知名的系统监控工具,它们各自专注于不同的硬件组件,为用户提供详尽的硬件信息和实时监控数据。这些工具对于硬件爱好者、系统管理员以及软件开发者来说都是不可或缺的资源...

Global site tag (gtag.js) - Google Analytics