CUDA编程入门系列(二) GPU硬件架构综述

这篇具有很好参考价值的文章主要介绍了CUDA编程入门系列(二) GPU硬件架构综述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Fermi GPU

        Fermi GPU如下图所示,由16个SM(stream multiprocessor)组成,不同的SM之间通过L2 Cache和全局内存进行相连。整个架构大致分为两个层次,①总体架构由多个SM组成 ②每个SM由多个SP core(stream processor)组成。SP之间通过互连的网络和L1 Cache和Warp Scheduler等结构进行相连。 

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

二、GT200体系架构 

         下图为GT200体系架构,整体由10个TPC组成,每个TPC包含有三个SM

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

三、专业术语

        SPA: Streaming Processor Array 流处理器阵列

        TPC/GPC:Texture/Graphics Processor Cluster  纹理/图像 处理簇,相当于把多个SM作为一个小组形成一个簇。

         SM: Streaming Multiprocessor(每个SM包含32个Streaming Processor),是cuda线程块处理的基本单元。

        SP:Streaming Processor ,为CUDA的core 

四、Streaming MultiProcessor(SM)

        整体结构由32个SP和4个SFU(Special Function Units)组成,不同的SP之间通过互连网络interconnected network,L1 Cache和warp Scheduler等结构进行相连。

        warp是一个特殊的概念,实际中GPU上有多个线程,每32个线程称为一个warp,warp是并行结构中基本的运算单元,warp里面的所有线程都执行相同的命令。

        在实际CUDA编程时,通常把线程按照grid,block,thread来组织,其中grid的大小相对没有限制,而block的大小限制根据不同的GPU结构有所不同,一般来说上限为1024。块中的每32个线程称为一个warp,每个warp中的线程共享指令,如果每个线程执行的指令不同,会影响执行效率,所以在实际设计的时候,要保持每个warp执行相同的指令,以此来提高效率。

        SM中的 共享内存shared memory / L1 cache大小一般为64KB

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

五、 GPU程序架构

        当我们书写一个核函数时,我们把所有的线程称为一个网格grid,每个网格由多个块组成,每个块由多个线程组成(1024上限)。由于warp为32个线程的特殊结构,所以块的大小最好为32的倍数。 在实际执行中,同一个block块在同一个SM上进行,不会跨SM进行处理。

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

 

六、 内存类型

        每一个线程都有自己的local memory局部内存。

        每个块存在共享内存,这个共享内存的对象为同一个块内的所有线程,用于线程间的通信。共享内存的访问速度要远大于全局内存。

        运行一个GPU程序的话,存在一个全局内存,这个全局内存是所有线程都可以进行访问的,但是访问全局内存的速度要远大于访问共享内存的速度。

        CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

       不同的GPU含有不同大小的寄存器,寄存器的大小是固定的,如果每一个块需要的寄存器大小越大,那么活跃的块数量就会减少,这就使得并行度会下降,所以在设计程序的时候,要减少寄存器的使用。

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

 

        共享内存是位于块内的,大小约为64KB。共享内存是有自己的划分方式的,每4个字节或者32个比特为一个bank。

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

 

         以一个warp里面16个线程访问16个bank为例,如果每一个线程都访问不同的bank,那么这样的访问效率是最高的。如果16个线程中, 有不同的线程访问同一个bank,这就会造成bank conflict(我这里先初步理解为不同的线程访问同一个bank,要按照串行的方式进行访问,即一个线程访问完,另一个线程才能访问),串行的访问方式就会使得访问效率变低。

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

         所以在设计GPU程序的时候,如果要使用共享内存,那么则要尽量避免多个线程访问同一个bank的情况,避免串行访问,从而提高并行度。

 CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

        Bank Conflicts 的例子 - 向量求和的规约 

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

        假如我们用串行的方式进行向量求和,那么代码就是一个for循环,

         for(int i = 0; i < nums.size(); i++){ sum += nums[i]} 

        但如果这个向量的长度较长,使用串行的方式就会大大的影响运行速度。使用并行计算的话则会提高运行速度,这里图中的方法为二叉树算法。但上图存在bank conflict,因为不同的线程可能会访问同一个bank。其解决方法如下图所示:

CUDA编程入门系列(二) GPU硬件架构综述,硬件架构,python,人工智能

     文章来源地址https://www.toymoban.com/news/detail-722288.html

到了这里,关于CUDA编程入门系列(二) GPU硬件架构综述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《GPU并行计算与CUDA编程》笔记

    方法一:直接做累加(错误) 方法二:原子相加(分组bins越少,并行化程度越低,方法二适合用于分组bins很多的时候) 方法三:局部直方图 第一步:并行计算局部直方图; 第二步:把所有局部直方图每个分组bin使用Reduction(归约)并行累加起来行程一个总的直方图。

    2024年02月14日
    浏览(43)
  • CUDA编程:矩阵乘运算从CPU到GPU

    本文内容涉及到CUDA矩阵1D运算、2D运算、共享内存、CUBLAS的使用。 文中的全部code: https://github.com/CalvinXKY/BasicCUDA/tree/master/matrix_multiply V100上的测试对比: 运行内容“./matMul wA=1024 hA=256 wB=128 hB=1024” 矩阵 C = A x B的数学运算,是线性代数里面最基本的内容, 计算的基本公式如下

    2024年04月08日
    浏览(55)
  • CUDA编程之GPU图像数据结构的设计

    参考OpenCV中Mat和GpuMat的设计,对当前Image类设计了GPU版本,即GPUImage。 设计图像头。 其中指针指向的是GPU上的地址。引用计数用来实现浅拷贝以及显存的自动释放管理。不像OpenCV和Nppi,分通道和深度的做法。GPUImage的nChannel可以理解为通道*深度。 GPUImage用来管理CudaMalloc申请的

    2024年02月11日
    浏览(37)
  • GPU编程 CUDA C++ 线性代数求解器 cuSolver库

    cuSolver库较cuBLAS库更为高级,其能处理矩阵求逆,矩阵对角化,矩阵分解,特征值计算等问题。cuSolver库的实现是基于cuBLAS库和cuSPARSE库这两个基本库。cuSolver库的功能类似于Fortran中的LAPACK库:是Linear Algebra PACKage的简称。 以下以一个厄米矩阵的本征值(特征值)问题,代码示

    2024年02月05日
    浏览(50)
  • 【深度学习:入门】如何配置CUDA,使用gpu本地训练

    由于显卡的不同,需要先查看我们显卡及驱动最高支持的cuda。 进入cmd输入 nvidia -smi 版本支持向下兼容,为了保证能够和其他开发库版本兼容,这里使用的CUDN版本为11.6. CUDA Toolkit| NVIDIA Developer官网找到对应CUDA版本。(我这里选择的是CUDA11.6) 依次选择如下配置,点击Download下

    2024年02月08日
    浏览(44)
  • AI芯片架构体系综述:芯片类型CPU\GPU\FPGA\ASIC以及指令集CSIS\RISC介绍

    大模型的发展意味着算力变的越发重要,因为大国间科技竞争的关系,国内AI从业方在未来的一段时间存在着算力不确定性的问题,与之而来的是许多新型算力替代方案的产生。如何从架构关系上很好的理解计算芯片的种类,并且从计算类型、生态、流片能力等多角度评估算

    2024年02月04日
    浏览(51)
  • VS CUDA OpenCV编程 遇到gpu端核函数 应输入表达式的报错解决办法

    最近在做开发时,用到了cuda和opencv结合的使用方法。其中,cuda能够提供的公式就那么多,所以打算自己写一个核函数来实现自己想要实现的算法。结果遇到了核函数调用的时候报错,提示应输入表达式。 经过在网上查找,大家的解决办法基本上都说在cu文件中出现没事,可

    2024年02月08日
    浏览(54)
  • [架构之路-14]:目标系统 - 硬件平台 - CPU、MPU、NPU、GPU、MCU、DSP、FPGA、SOC的区别

    目录 前言: 一、通用指令程序控制 1.1 CPU(Central Processing Unit:中央处理单元/器) 1.2 MPU(Microprocessor Unit:微处理单元/器)-- 广义CPU 1.3 MCU(Mirco Controller Unit:微控制单元)-- 单片机 二、网络协议处理器NPU 2.1 npu = network processing units:网络处理单元 2.2 npu = neural-network proces

    2024年02月01日
    浏览(71)
  • CUDA编程模型系列三(矩阵乘)

    本系列教程将介绍具体的CUDA编程代码的细节 CUDA编程模型系列三(矩阵乘)

    2024年02月12日
    浏览(79)
  • 关于GPU显卡、CUDA版本、python版本、pytorch版本对应

    提示:算力、cuda版本、python版本、pytorch版本有一项不匹配都无法使用 一、查看自己计算机的当前cuda版本以及gpu的算力 二、根据算力下载对应的cuda版本 三、根据算力以及CUDA版本下载查看需要的pytorch版本 四、下载可以兼容上述Pytorch版本的python 五、下载上述pytorch版本 查看

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包