Parallel Computing - 一文讲懂并行计算

目录

  • Throughput/Latency
  • Serial Computing
  • Parallel Computing
  • Types of parallel computers
  • Simple 4-width SIMD
  • Amdahl's law
  • Types of parallelism
    • **Data Parallel Model**
    • Task parallel
  • Partitioning
    • Domain Decomposition
    • Functional Decomposition
  • Communications
    • Example that does not need communication
    • Example that need communication
  • Synchronization
    • Barrier
  • Granularity
    • Fine-grain Parallelism
    • Coarse-grain Parallelism
  • How expensive is memory I/O
  • Solving the problem
    • Just add more stuff for the GPU to do
    • Latency Hiding
  • Coalesced Global memory access
  • Host/Device Transfers and Data Movement
    • Avoid transfers
    • Pinned Host Memory

在本章中,我们将回顾一些有关并行计算的概念。但更加强调 GPU。

Throughput/Latency

在讨论性能之前,我们先回顾一下一些概念。

  • 吞吐量:单位时间内计算任务的数量。即:一分钟内 1000 笔信用卡付款。
  • 延迟:调用操作和获得响应之间的延迟。即:处理信用卡交易所需的最长时间为 25 毫秒。
    在优化性能时,一个因素(例如吞吐量)的改进可能会导致另一因素(例如延迟)的恶化。

Serial Computing

这是老办法,我们遇到一个问题,我们把它们分解成一个个小块,然后一个接一个地解决。
在这里插入图片描述

Parallel Computing

从最简单的意义上来说,并行计算是同时使用多个计算资源来解决计算问题。
在这里插入图片描述

Types of parallel computers

根据弗林分类法,并行计算机有 4 种不同的分类方法。
下面是一些经典的例子

  • SISD:非常旧的计算机(PDP1)
  • MIMD:超级计算机
  • SIMD:Intel 处理器、Nvidia Gpus
  • MISD:确实很少见。
    对于 GPU,它们通常是 SIMD 类型的处理器。不同的处理单元执行相同的指令,但在共享内存的不同部分。
    在这里插入图片描述

Simple 4-width SIMD

下面我们有一个 4 宽度的 SIMD。这里的所有处理器都在同时执行“add”指令。
在这里插入图片描述当您听说 GPU 有 5000 个核心时,请不要被愚弄,它可能只是说它有 5000 个 ALU(算术逻辑单元)。 GPU 可同时执行的最大任务数通常在 Nvidia 上称为“warp size”,在 AMD 上称为“wavefront”,通常是按块/网格组织的 32 宽 SIMD 单元。

可能发生的一个有趣的问题是,如果您有一条分支(if)指令,并且每个处理元素决定不同的事情。如果发生这种情况,您将受到处理处罚。这种效应称为发散。为了解决这个问题,您必须尝试尽量减少波动前(cuda 中的wrap)上分支指令的使用。
如果您需要这种分支分配,您可以使用 opencl 中的“select”来编译为单个指令(原子),这样就不会发生发散问题。
在这里插入图片描述

Amdahl’s law

Amdahl’s Law指出潜在的程序加速(理论延迟)由可以并行化的代码 p 的比例定义:
在这里插入图片描述

  • S : 整个任务执行延迟的理论加速
  • p: 可以并行化的代码的一部分。
  • 处理器数量
    从该定律可以得到:加速受到不可并行工作部分的限制,即使使用无限数量的处理器,速度也不会提高,因为串行部分会受到限制。
    在这里插入图片描述
    程序的总执行时间T分为两类:
  • 执行不可并行串行工作所花费的时间
  • 进行可并行工作所花费的时间
    这里还缺少一些重要的东西。阿姆达尔定律没有考虑内存延迟等其他因素。

Types of parallelism

Data Parallel Model

在此模型上,共享内存对所有节点都是可见的,但每个节点都处理该共享内存的部分内容。这就是我们通常使用 GPU 要做的事情
在这里插入图片描述
数据并行方法的主要特点是编程相对简单,因为多个处理器都运行相同的程序,并且所有处理器大约在同一时间完成其任务。当每个处理器正在处理的数据之间的依赖性最小时,此方法是有效的。例如,向量加法可以从这种方法中受益匪浅。

Task parallel

任务并行方法的主要特点是每个处理器执行不同的命令。与数据并行方法相比,这增加了编程难度。由于处理时间可能会根据任务的分割方式而有所不同,因此需要一些同步。如果任务完全不相关,问题就会容易得多。
在这里插入图片描述

Partitioning

设计并行程序的第一步是将问题分解为可以分配给多个任务的离散工作“块”。这称为分解或划分。有两种在并行任务之间划分计算工作的基本方法:

  • 域分解:
  • 功能分解。

Domain Decomposition

在这种类型的分区中,与问题相关的数据被分解。然后,每个并行任务都处理一部分数据。
在这里插入图片描述

Functional Decomposition

在这种方法中,重点是要执行的计算,而不是计算所操纵的数据。问题根据必须完成的工作进行分解。然后,每个任务执行整体工作的一部分。
在这里插入图片描述

Communications

通常一些并行问题需要节点(任务)之间进行通信。这又是一个与问题相关的问题。需要考虑的一些要点:

  • 通信总是意味着开销
  • 通信频繁需要节点(任务)同步,需要较大的开销
    当您需要将数据发送到 GPU 来执行某些计算,然后将结果传回 CPU 时,就意味着需要进行通信。

Example that does not need communication

某些类型的问题可以分解并并行执行,几乎不需要任务共享数据。例如,想象一下图像处理操作,其中黑白图像中的每个像素都需要反转其颜色。图像数据可以轻松地分配给多个任务,然后这些任务彼此独立地完成各自的工作。这些类型的问题通常被称为“尴尬并行”,因为它们非常简单。需要很少的任务间通信。

Example that need communication

大多数并行应用程序并不是那么简单,并且确实需要任务彼此共享数据。例如,3-D 热扩散问题需要任务了解具有相邻数据的任务计算出的温度。相邻数据的更改会直接影响该任务的数据。

Synchronization

管理工作顺序和执行工作的任务是大多数并行程序的关键设计考虑因素。同步总是会影响性能,但当任务需要通信时总是需要同步。
同步类型

  • Barrier(用于 OpenCl)
  • Lock/semaphore 锁/信号量
  • Synchronous communication operations 同步通讯操作

Barrier

这是一种同步机制,每个任务都执行其工作,直到到达屏障。然后它会停止或“阻塞”,直到所有任务都到达同一点。当最后一个任务到达屏障时,所有任务都会同步。

Granularity

这是关于计算和通信之间的比率。有 2 种粒度

Fine-grain Parallelism

通信多于计算
在这里插入图片描述

Coarse-grain Parallelism

计算多于沟通
在这里插入图片描述
最有效的粒度取决于算法及其运行的硬件环境。但是……通常通信的延迟比计算的延迟更大。例如,将数据复制到 GPU 或从 GPU 复制数据。所以我们更喜欢粗粒度,这意味着大量的计算和很少的 GPU/CPU 通信。

How expensive is memory I/O

正如心理实验一样,想象一个处理元素(节点/任务)在 1 秒内做出语句(即 V:=1+2+3/4)。但如果需要读/写 GPU 全局内存,则需要更多时间。考虑下表。
顺便说一句,我们考虑到数据已经在 GPU 上,将数据发送到 GPU 是另一个问题。
在这里插入图片描述在此表中,我们有不同的内存类型,其中全局内存是 GPU 内存,私有内存和本地内存是位于每个核心内部的内存,常量也是全局内存,但专门用于读取速度更快。现在检查以下示例。
在这里插入图片描述
在这种情况下,我们的计算结果是 整个时间的 1 86 \frac{1}{86} 861 。这很糟糕,这意味着我们的 ALU 工作在 A L U e f i c i e n c y ALU_{eficiency} ALUeficiency= 1 86 ∗ 100 \frac{1}{86}*100 861100 A L U e f i c i e n c y ALU_{eficiency} ALUeficiency=1.1%。
现在想象一下,我们需要处理更多的数据,而不是 int(4 字节)x,y 将是 long(8 字节)。
在这里插入图片描述
现在情况变得更糟了。我们的计算结果是整个时间的 1 172 \frac{1}{172} 1721 。这很糟糕,这意味着我们的 ALU 工作在 A L U e f i c i e n c y ALU_{eficiency} ALUeficiency= 1 172 ∗ 100 \frac{1}{172}*100 1721100 A L U e f i c i e n c y ALU_{eficiency} ALUeficiency=0.58%。

如果我们想与某些原始顺序算法相比提高性能,这可能意味着两件事:

  • 原来的顺序算法一定比这个内存I/O延迟慢很多。
  • 您需要在 GPU 内执行更多操作才能稀释该时间。

Solving the problem

Just add more stuff for the GPU to do

我们可能想到的第一件事是添加更多要完成的处理,这实际上会花费比内存延迟更多的时间。同样,如果处理时间加上内存延迟小于原始顺序 CPU 版本,您将获得加速。
在这里插入图片描述在这种情况下,您现在拥有 100% 的 Alu 效率,但这仅在现实生活中当您处理令人尴尬的并行问题时才会发生。例如大矩阵乘法、密码分析等…

Latency Hiding

更好的技术是使用 GPU 上下文切换机制来隐藏此延迟。这是通过向 GPU 发出并行代码标志来实现的,表明它正在等待可用的内存请求。当这种情况发生时,等待可用内存的处理元素组将进入池。与此同时,GPU 可以启动另一个工作组来执行,但最终会暂时停止。这个想法是,当这种情况发生时,一些工作项将具有可用的内存,这将具有最小化整个延迟的效果。
在这里插入图片描述
所以我们用工作组(work group)来溢出我们的计算单元
在这里插入图片描述
然后,我们隐藏内核访问全局内存的长内存延迟时间,因为当 GPU 分配要执行的工作组时,有些工作组可能是可用的。顺便说一句,当您的工作组位于波前(或warp)内时,这将起作用.
在这里插入图片描述

Coalesced Global memory access

主机向GPU发送数据后,内存将位于全局内存上,每个线程(计算单元)都会访问数据。我们已经讨论过这很慢,但有时您需要这样做。每次内核在全局内存上读/写时,它实际上是在访问一块内存。合并访问是指访问相邻地址上的数据。
在这里插入图片描述
因此,这意味着使用较少的线程消耗相邻内存块来访问内存比使用大量的线程消耗随机地址更快。

Host/Device Transfers and Data Movement

到目前为止,我们仅考虑数据已位于 GPU(全局内存)上时的性能。这忽略了 GPU 编程中最慢的部分,即从 GPU 获取数据和从 GPU 取出数据。
在这里插入图片描述
我们不应该仅使用内核的 GPU 执行时间相对于其 CPU 实现的执行时间来决定是运行 GPU 还是 CPU 版本。当我们最初将代码移植到 GPU 时,我们还需要考虑通过 PCI-e 总线移动数据的成本。
因为 GPU 是插入 PCI-e 总线的,所以这很大程度上取决于 PCI 总线的速度以及有多少其他东西正在使用它。

host/device transfer latency 是尝试在 GPU 上加速算法时的主要困难。

发生这种情况是因为,如果您的顺序算法计算的时间小于此主机/设备传输的时间,则无需做太多事情。但有一些…

Avoid transfers

这是最明显的一个,但您至少需要一个,对吗?因此,宁愿进行一次大传输,也不愿进行多次小传输,特别是在程序循环中。

Pinned Host Memory

默认情况下,主机 (CPU) 数据分配是可分页的。 GPU 无法直接从可分页主机内存访问数据,因此当调用从可分页主机内存到设备内存的数据传输时。发生这种情况是因为操作系统为其所有设备提供了虚拟地址,并且您的驱动程序需要使用这些页面来获取真实地址。 GPU 驱动程序必须首先分配一个临时页面锁定或“固定”主机数组,将主机数据复制到固定数组,然后将数据从固定数组传输到设备内存,如下所示。
在这里插入图片描述
如图所示,固定内存用作从设备到主机传输的暂存区域。我们可以通过直接在固定内存中分配主机阵列来避免可分页和固定主机阵列之间的传输成本。
您不应该过度分配固定内存。这样做会降低整体系统性能,因为它会减少操作系统和其他程序可用的物理内存量。很难提前判断多少才算是太多,因此与所有优化一样,测试您的应用程序及其运行的系统以获得最佳性能参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java调用chatgpt接口,实现专属于自己的人工智能助手

文章目录 前言导包基本说明请求参数响应参数创建请求和响应的VO类 代码编写使用最后说明 前言 今天突然突发奇想,就想要用java来调用chatget的接口,实现自己的聊天机器人,但是网上找文章,属实是少的可怜(可能是不让发吧)。找到了…

ESP32 web 对接华为云平台--MQTT协议

文章目录 前言一、MQTT协议二、如何使用MQTT协议对接华为云1.注册华为云账号2.设备接入中创建资源空间3.如何连接4.通过MQTT.fx工具做初步对接4.1 设置连接信息4.2 连接平台 5.查看平台设备信息 三. 设备测对接平台1.ESP测引入MQTT库2.编码2.1前端编码修改2.2 后端接口修改 3.M…

element-plus+vue3表单含图片(可预览)(线上图片)

一、要实现的效果: 二、如果期间出现这样的效果(表格穿透过来了),加上了这行代码就可以了: preview-teleported“true” 如果仅测试用,建议使用线上图片链接的形式,免得本地地址不生效&#xf…

SSH 的两种认证方式

SSH(Secure Shell)提供了几种不同的认证方式,其中两种最常见的方式是密码认证和密钥认证。以下是它们的详细介绍: 密码认证: 原理:用户在连接时输入用户名和密码,然后将密码传输到远程服务器进行…

数学实验-Matlab使用(1)

使用方法以及笔记均在文件中 class1_func1.m function f class1_func1(x) % f为输出,输出有多个时需要用中括号以矩阵的方式包起来 % x为输入f sin(x)class1_func2.m function [a,b,u,v] class1_func2(x,y)[a,b] eig(x)[u,v] eig(y)class1.m % 当语句后有…

yolov9从头开始训练

yolov9从头开始训练 一、准备数据集 数据集相关文件存放布局如下 yolov9-datasets ├── train │ ├── images │ │ ├── image.jpg │ │ ├── │ └── labels │ ├── image.txt │ ├── ├── valid │ ├── images │ │ ├── image.jpg │ │ ├─…

吴恩达deeplearning.ai:模型选择交叉验证测试集的训练方法

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 在上一节中,我们了解了如何利用测试集来评估模型性能。今天我们来进一步完善这个想法,让你使用该技术自动选择一个更好的模型。 文章目录 模型选择交叉验证 Cross Va…

SpringBoot 框架(上)

SpringBoot SpringBoot概述依赖管理自动配置SpringBoot 注解使用ConfigurationImport(value {Cat.class,Dog.class})ImportResource(locations "classpath:beans.xml") yaml 标记语言概述基本语法数据类型字面量对象数组 使用细节 Rest 风格请求处理概述注意事项 接…

vue2 开发记录

el-select 如何修改选择项的样式/el-select-dropdown__item 文字上下显示 测试代码 <div stylemargin-left: 100px><!-- 测试代码--><el-select filterablesizemini><div classxxx-el-select><el-optionv-foritem in [{key:1,des:2,…

AVT Prosilica GC Vision Cameras 相机视觉说明使用安装。具体详情内容可参看PDF目录内容。

AVT Prosilica GC Vision Cameras 相机视觉说明使用安装。具体详情内容可参看PDF目录内容。

TikTok矩阵系统功能怎么写?常用源代码是什么?

TikTok矩阵系统的功能是如何编写的?又有哪些常用的源代码支撑这些功能呢?本文将通过五段源代码的分享&#xff0c;为大家揭开TikTok矩阵系统的神秘面纱。 一、TikTok矩阵系统的核心功能 TikTok的矩阵系统涵盖了多个核心功能&#xff0c;包括但不限于用户管理、内容分发、推…

【接口测试】HTTP协议介绍

目录 介绍 HTTP状态码 HTTP报文 请求方法 HTTP版本 HTTP标头 通用标头 请求标头 响应标头 get 编码 post 编码 RESTful风格 HTTPS 绝大多数的Web服务接口都是基于HTTP协议进行通信的&#xff0c;包括RESTful API和SOAP等。了解HTTP协议可以帮助测试人员理解接口的…

回溯算法题单✨✨✨

力扣&#xff1a; 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; LCR 080. 组合 - 力扣&#xff08;LeetCode&#xff09; LCR 082. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; LCR 083. 全排列…

【多线程】CAS详解

目录 &#x1f334;什么是 CAS&#x1f338;CAS 伪代码 &#x1f38d;CAS 是怎么实现的&#x1f340;CAS 有哪些应⽤&#x1f338;实现原子类&#x1f338;实现自旋锁 &#x1f333;CAS 的 ABA 问题&#x1f338;**什么是 ABA 问题**&#xff1f;&#x1f338;ABA 问题引来的 B…

【C++】核心编程--函数高级

文章目录 1. 函数的默认参数2. 函数占位参数3. 函数重载4. 注意事项 1. 函数的默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 //语法&#xff1a; 返回值类型 函数名 (参数 默认值){} #include<iostream> using namespace std; //函数默认参数 //如…

异常值检测-3σ法提交 代码注释

背景信息里面都给了相应的答案&#xff0c;但我们可以多了解一下代码的含义&#xff0c;而不是简单的复制粘贴 import pandas as pd import matplotlib.pyplot as plt from scipy import stats import numpy as npdata pd.read_csv("src/death.csv", index_colUnna…

ASPICE实操中的那点事儿-如何避免重复性测试

写在前面 ASPICE理解起来容易&#xff0c;毕竟是有条有理的。但实操起来&#xff0c;尤其是把ASPICE各过程域做全的时候&#xff0c;会遇到各种各样的问题&#xff08;不是技术问题有多难&#xff0c;而是该如何做选择&#xff0c;如何既能符合ASPICE要求&#xff0c;保证过程质…

智慧城市建设的新里程碑:公共服务电子支付大屏

随着科技的飞速发展&#xff0c;我们的生活正在经历前所未有的变革。电子支付的出现&#xff0c;无疑是这场变革中的一大亮点&#xff0c;它不仅改变了我们日常的支付方式&#xff0c;更成为智慧城市建设的重要一环&#xff0c;为公众提供了更加便捷、高效的服务体验。 在以前&…

python SHP2COCO

1. 将shp的标签数据转成coco # -*- coding: utf-8 -*- import os, json import cv2 from osgeo import gdal import numpy as np from osgeo import ogr, gdal, osr from shapely.geometry import box, shape from shapely.geometry.polygon import Polygon import collection…

Flutter 的状态管理

状态提升&#xff08;Lifting-state-up&#xff09; 把子组件的状态&#xff0c;提升到上级组件中&#xff0c;从而实现在多个组件之间共享和同步数据的效果 以 flutter counter demo&#xff0c;那个按按钮1 的来说&#xff0c;现在的 count 是几&#xff0c;不是存在页面显…