GPU平台并行计算

news/2024/9/23 8:15:40/

1、GPU架构概述

  • GPU是一种众核架构,非常适合解决大规模的并行计算。
  • GPU是CPU的协处理器,必须通过PCIe总线与基于CPU的主机(Host)相连来进行操作,形成异构架构,如下图所示。其中CPU为主机端(Host),负责逻辑控制、数据分发,GPU为设备端(Device),负责并行数据的密集型计算。其中,ALU为算数运算单元。
    CPU-GPU异构架构
  • GPU架构是围绕一个流式多处理器(SM)的可扩展阵列搭建的。下图是英伟达公司的Fermi架构SM的示意图,SM的关键组件包括GPU核心、共享内存/一级缓存、寄存器文件、加载/存储单元、特殊功能单元和线程束调度器
  • GPU的每个SM都支持数百个线程并发执行,每个GPU有多个SM,这表示一个GPU可以并发执行数千个线程。
  • 当启动一个内核网格(Grid)时,它的线程块(block)被分布在了可用的SM上执行。
  • 多个block可能会被分配到同一个SM上。
    NVIDIA Fermi SM结构

2、CUDA 并行计算

  • CUDA 是英伟达公司推出的通用并行计算平台和编程模型,它利用英伟达的GPU能够实现并行计算。
  • CUDA可以通过CUDA加速库、编译器指令、应用编程接口以及标准程序语言的扩展(包括C、C++、Fortan、Python)来使用。

CUDA线程模型

  • 线程(Thread)是GPU的最小执行单元,能够完成一个逻辑操作,每个线程都有自己的指令地址计数器和寄存器状态,利用自身的数据执行当前的指令
  • 而线程束(Warp)是GPU的基本执行单元,包括32个线程,GPU每次调用线程都是以线程束为单位的,在一个线程束中,所有的线程按照单指令多线程(SIMT)方式执行,即所有线程执行相同的指令。
  • 多个线程束位于一个最高维度为3的线程块(Block)中,同一个线程块中的所有线程,都可以使用共享内存来进行通信、同步。
  • 线程块又通过一个最高维度为3的网格(Grid)来管理。
    CUDA 线程模型

CUDA 内存模型

  • CUDA内存模型中,有两种类型的存储器:不可编程存储器和可编程存储器,
    • 前者并不对开发人员开放存取接口,包括一级缓存和二级缓存;
    • 后者可以显式地控制数据在内存空间中的存取,包括寄存器、共享内存、本地内存、常量内存、纹理内存以及全局内存。
      CUDA 内存结构
  • 寄存器:
    • 速度最快,分配于每个线程中,数量有限,如果一个核函数使用了超过了限定数量的寄存器,将会溢出到本地内存,降低算法性能。
  • 本地内存:
    • 本地内存用来存放寄存器溢出的内存,本地内存访问符合高效内存访问要求。
  • 共享内存:
    • 比本地内存和全局内存有更高的带宽和更低的延迟。它由线程块分配,生命周期伴随着线程块,线程块中的每个线程都可以共享其存储空间。
    • 一个块内的线程可以通过共享内存进行通信合作。常用的方式是将全局内存读进共享内存中,而读取的方式是每个线程负责读取某一个位置的数据,读完之后块内的所有线程都能够使用整个共享内存中的数据。
    • 读取全局内存到共享内存时要注意同步,在CUDA C中使用线程同步函数__syncthreads()来实现同步。
    • 核函数中存储在共享内存的变量通过修饰符__shared__修饰。
  • 常量内存:
    • 用修饰符__constant__修饰
    • 必须在全局空间内和所有核函数之外声明,对同一编译单元的所有线程核函数可见
    • 只读
  • 纹理内存:
    • 只读
    • 适合访问二维数据
  • 全局内存:
    • 是GPU中最大、延迟最高、最常使用的内存,贯穿程序的整个生命周期。
    • 对全局内存访问时,必须注意内存访问的两个特性:对齐内存访问和合并内存访问
    • 当一个线程束中全部的32个线程访问一个连续的内存块时,满足合并访问,效率非常高。
      合并访问和非合并访问示意图

http://www.ppmy.cn/news/307011.html

相关文章

Windows系统下实现Fortran语言的GPU计算

1.安装 visual studio2015ivf2017update4 2.安装Windows SDK 10,这一步取决于第三步安装PGI时是否提示需要安装WindowsSDK 3.安装PGI CE 18.4 注意事项: 1.三个软件必须安装在同一个盘下,否则安装后的PGI CE 无法编译。因为Windows10 SD…

CUDA学习笔记 —— (三)GPU计算性能与线程关系

文章目录 概述CPU运行GPU运行单线程GPU 1block 多线程运行多block多线程结果比对 概述 我们通过一个例子,相同的计算,我们分别在CPU,GPU单线程,GPU单block多线程,GPU多block多线程来运行对比。看GPU是如何大幅提升运算…

CPU与GPU计算能力比较

本文对比几个算法分别在CPU上计算,与GPU上计算的耗时。 测试环境: CPU: Intel(R)_Core(TM)_i7-7700_CPU__3.60GHz x 8 GPU: NVIDIA GeForce GTX 1050 一,FFT计算的性能分析。 1,dft离散傅里叶变换的公式如下。 X为源数据&am…

GPU 计算 - GPU 优化简介

GPU 优化简介 原文 - An Introduction to GPU Optimization 采用 GPUs 加速简单的计算任务. 计算机处理的很多任务都会遇到大量的计算,耗时较多的问题;而且,随着数据集越来越大,耗时将更多. 解决方法之一是,使用线程…

GPU并行效率问题——通过MPS提升GPU计算收益

现象描述 使用V100_32G型号的GPU运行计算程序时,发现程序每5秒能够完成一次任务,耗费显存6G。 鉴于V100 GPU拥有32G的显存,还有很多空闲,决定同时运行多个计算程序,来提升GPU计算收益。 然而,这一切都是想当…

GPU计算(一)

简单描述 图形处理、也就是显示核心,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。 包括市面上的游戏本也是带有独立显卡的&…

MXNet使用GPU计算

GPU上的存储 在MXNet中,mx.cpu()代表所有的物理CPU和内存,而mx.gpu()只代表一块GPU和相应的显存。(cpu对应内存,gpu对应显存) 可以通过NDArray的context属性来查看该NDArray所在的设备。 x.context 我们可以通过多种方法创建NDArray到GPU…

python调用显卡计算_Anaconda GPU计算入门指南

摘要:随着人工智能时代的到来,计算能力变得越来越重要。GPU计算已经成为了必然的趋势,对于机器学习爱好者来说要想训练一个高质量的神经网络,使用GPU无疑是最佳选择。 GPU计算已成为数据科学领域的重要组成部分。计算需求的不断增长,使得GPU计算逐渐流行起来。此外,现在每…