并行计算模型

像其他专业行话一样,并行计算也有自己的行话。行话就像个大坑,坑中的人需要在其中浸淫很久,才能逐渐适应其语境,然而很多行话的使用常常是草率与不精确的。有时候把鬼都听不懂的行话理解了,再跟别人说鬼话,大概也是开启第二天性的方法。(按照农历来算,这个月是鬼月)

一、并行计算内存与CPU结构

统一内存访问 (UMA)

  • 目前最常由对称多处理器 (SMP) 机器表示
  • 相同的处理器
  • 对内存的访问和访问时间相等
  • 有时称为 CC-UMA - 缓存相干 UMA。缓存一致性意味着如果一个处理器更新了共享内存中的位置,则所有其他处理器都知道该更新,缓存一致性是在硬件级别实现的。

非一致性内存访问 (NUMA)

  • 通常通过物理链接两个或多个 SMP 来实现
  • 一个 SMP 可以直接访问另一个 SMP 的内存
  • 并非所有处理器对所有内存的访问时间都相等
  • 跨链路的内存访问速度较慢
  • 如果保持了缓存一致性,那么也可以称为 CC-NUMA - 缓存一致性 NUMA

分布式内存

  • 与共享内存系统一样,分布式内存系统差异很大,但有一个共同的特性。分布式内存系统需要一个通信网络来连接处理器间内存。
  • 处理器有自己的本地内存。一个处理器中的内存地址不会映射到另一个处理器,因此所有处理器之间没有全局地址空间的概念。
  • 由于每个处理器都有自己的本地内存,因此它可以独立运行。它对其本地内存所做的更改对其他处理器的内存没有影响。因此,缓存一致性的概念不适用。
  • 当一个处理器需要访问另一个处理器中的数据时,程序员的任务通常是明确定义数据的通信方式和时间。任务之间的同步同样是程序员的责任。
  • 用于数据传输的网络“结构”差异很大,尽管它可以像以太网一样简单。

混合分布式共享内存

  • 共享内存组件可以是共享内存机和/或图形处理单元 (GPU)。
  • 分布式内存组件是多个共享内存/GPU 机器的联网,这些机器只知道自己的内存,而不知道另一台机器上的内存。因此,需要网络通信才能将数据从一台机器移动到另一台机器。
  • 目前的趋势似乎表明,在可预见的未来,这种类型的内存架构将继续盛行,并在计算的高端增加。
  • 当今世界上最大、最快的计算机采用共享和分布式内存架构。

二、并行计算经典分类方法

  • 自 1966 年以来一直使用的更广泛使用的分类法之一称为弗林分类法。
  • 弗林分类法根据多处理器计算机架构如何沿着指令流数据流这两个独立的维度进行分类来区分多处理器计算机架构。这些维度中的每一个都只能具有两种可能状态中的一种:单个多个
  • 根据弗林说法,下面的矩阵定义了 4 种可能的分类:

单指令,单数据 (SISD)

  • 串行(非并行)计算机
  • 单条指令:在任何一个时钟周期内,CPU 只执行一个指令流
  • 单一数据:在任何一个时钟周期中,只有一个数据流被用作输入
  • 确定性执行
  • 这是最古老的计算机类型
  • 示例:老一代大型机、小型计算机、工作站和单处理器/核心 PC。

单指令多数据 (SIMD)

  • 一种并行计算机
  • 单条指令:所有处理单元在任何给定的时钟周期内执行相同的指令
  • 多个数据:每个处理单元可以对不同的数据元素进行操作
  • 最适合于具有高度规律性的特殊问题,例如图形/图像处理。
  • 同步(锁步)和确定性执行
  • 两种类型:处理器阵列和矢量管道

多指令、单数据 (MISD)

  • 一种并行计算机
  • 多指令:每个处理单元通过单独的指令流独立地对数据进行操作。
  • 单一数据:单个数据流被馈送到多个处理单元。
  • 这类并行计算机的实际例子很少(如果有的话)。
  • 一些可以想象的用途可能是:
    • 在单个信号流上运行多个频率滤波器
    • 多种加密算法试图破解单个编码消息。

多指令、多数据 (MIMD)

  • 一种并行计算机
  • 多指令: 每个处理器可能正在执行不同的指令流
  • 多个数据:每个处理器可能正在处理不同的数据流
  • 执行可以是同步的或异步的,确定性的或非确定性的
  • 目前,最常见的并行计算机类型 - 大多数现代超级计算机都属于这一类。
  • 示例:大多数当前的超级计算机、联网的并行计算机集群和“网格”、多处理器 SMP 计算机、多核 PC。
  • 注意许多 MIMD 架构还包括 SIMD 执行子组件

三、并行编程模型

并行编程模型作为硬件和内存架构之上的抽象而存在。

  • 通常使用几种并行编程模型:
    • 共享内存(无线程)
    • 线程
    • 分布式内存/消息传递
    • 数据并行
    • 混合
    • 单程序多数据 (SPMD)
    • 多程序多数据 (MPMD)

共享内存模型

  • 在此编程模型中,进程/任务共享一个公共地址空间,它们异步读取和写入该地址空间。
  • 各种机制(如锁/信号量)用于控制对共享内存的访问、解决争用以及防止竞争条件和死锁。
  • 这可能是最简单的并行编程模型。
  • 从程序员的角度来看,这个模型的一个优点是缺乏数据“所有权”的概念,因此不需要明确指定任务之间的数据通信。所有进程都能看到共享内存,并具有对共享内存的平等访问权限。程序开发通常可以简化。
  • 就性能而言,一个重要的缺点是,理解和管理数据局部性变得更加困难:
    • 将数据保留在处理它的进程的本地,可以节省内存访问、缓存刷新和当多个进程使用相同数据时发生的总线流量。
    • 不幸的是,控制数据局部性很难理解,并且可能超出普通用户的控制范围。

在独立的共享内存计算机上,本机操作系统、编译器和/或硬件为共享内存编程提供支持。例如,POSIX标准提供了一个使用共享内存的API,UNIX提供了共享内存段(shmget、shmat、shmctl等)。

线程模型

  • 此编程模型是一种共享内存编程。
  • 在并行编程的线程模型中,单个“重量级”进程可以有多个“重量级”并发执行路径。
  • 例如:
    • 主程序 a.out 计划由本地操作系统运行。a.out 加载并获取运行所需的所有系统和用户资源。这就是“重量级”的过程。
    • a.out执行一些串行工作,然后创建一些任务(线程),这些任务(线程)可以由操作系统同时调度和运行。
    • 每个线程都有本地数据,但也共享 a.out 的全部资源。这样可以节省与为每个线程复制程序资源相关的开销(“轻量级”)。每个线程还受益于全局内存视图,因为它共享 a.out 的内存空间。
    • 线程的工作最好描述为主程序中的子程序。任何线程都可以与其他线程同时执行任何子程序。
    • 线程通过全局内存(更新地址位置)相互通信。这需要同步构造,以确保多个线程不会在任何时候更新相同的全局地址。
    • 线程可以来来去去,但 a.out 仍然存在,以提供必要的共享资源,直到应用程序完成。

实现

  • 从编程的角度来看,线程实现通常包括:
    • 从并行源代码中调用的子例程库
    • 嵌入在串行或并行源代码中的一组编译器指令

在这两种情况下,程序员都负责确定并行度(尽管编译器有时可以提供帮助)。

  • 线程实现在计算领域并不新鲜。从历史上看,硬件供应商已经实现了自己的专有线程版本。这些实现彼此之间有很大的不同,使得程序员很难开发可移植的线程应用程序。
  • 不相关的标准化工作导致了两种截然不同的线程实现:POSIX 线程和 OpenMP。

POSIX 

  • 由 IEEE POSIX 1003.1c 标准 (1995) 指定。仅限 C 语言。
  • Unix/Linux 操作系统的一部分
  • 基于库
  • 通常称为 Pthreads。
  • 非常明确的并行性;要求程序员非常注意细节。

OpenMP 

  • 行业标准,由一组主要的计算机硬件和软件供应商、组织和个人共同定义和认可。
  • 基于编译器指令
  • 可移植/多平台,包括 Unix 和 Windows 平台
  • 在 C/C++ 和 Fortran 实现中可用
  • 可以非常容易和简单地使用 - 提供“增量并行性”。可以从序列号开始。
  • 其他线程实现很常见,但此处不讨论:
    • Microsoft 线程
    • Java、Python 线程
    • GPU 的 CUDA 线程

分布式内存/消息传递模型

  • 此模型演示了以下特征:
    • 在计算过程中使用自己的本地内存的一组任务。多个任务可以驻留在同一台物理机器上和/或跨任意数量的机器。
    • 任务通过发送和接收消息来通过通信交换数据。
    • 数据传输通常需要每个进程执行协同操作。例如,发送操作必须具有匹配的接收操作。

实现:

  • 从编程的角度来看,消息传递实现通常包含一个子例程库。对这些子例程的调用嵌入在源代码中。程序员负责确定所有并行度。
  • 从历史上看,自 1980 年代以来,已经有各种消息传递库可用。这些实现方式彼此之间有很大的不同,使得程序员难以开发可移植的应用程序。
  • 1992 年,MPI 论坛成立,其主要目标是为消息传递实现建立标准接口。
  • 消息传递接口 (MPI) 的第 1 部分于 1994 年发布。第 2 部分 (MPI-2) 于 1996 年发布,MPI-3 于 2012 年发布。所有 MPI 规范均可在 MPI Documents 的网站上找到。
  • MPI 是消息传递的“事实上”的行业标准,几乎取代了用于生产工作的所有其他消息传递实现。几乎所有流行的并行计算平台都存在 MPI 实现。并非所有实现都包含 MPI-1、MPI-2 或 MPI-3 中的所有内容。

数据并行模型

  • 也可以称为分区全局地址空间 (PGAS) 模型。
  • 数据并行模型演示了以下特征:
    • 地址空间是全局处理的
    • 大多数并行工作都侧重于对数据集执行操作。数据集通常被组织成一个通用的结构,如数组或多维数据集。
    • 一组任务共同处理相同的数据结构,但是,每个任务都处理同一数据结构的不同分区。
    • 任务对其工作分区执行相同的操作,例如,“向每个数组元素添加 4”。
  • 在共享内存架构上,所有任务都可以通过全局内存访问数据结构。
  • 在分布式内存架构上,全局数据结构可以在逻辑上和/或物理上跨任务进行拆分。

实现:

  • 目前,基于数据并行/PGAS模型,在不同的开发阶段有几种并行编程实现。
  • Coarray Fortran:Fortran 95 的一小部分扩展,用于 SPMD 并行编程。依赖于编译器。详细信息:https://en.wikipedia.org/wiki/Coarray_Fortran
  • 统一并行 C (UPC):对 C 编程语言的扩展,用于 SPMD 并行编程。依赖于编译器。详细信息:https://upc.lbl.gov/
  • Global Arrays:在分布式数组数据结构的上下文中提供共享内存样式的编程环境。具有 C 和 Fortran77 绑定的公共域库。详细信息:https://en.wikipedia.org/wiki/Global_Arrays
  • X10:一种基于PGAS的并行编程语言,由IBM在Thomas J. Watson研究中心开发。详细信息:The X10 Programming Language
  • Chapel:一个由 Cray 领导的开源并行编程语言项目。详细信息:http://chapel.cray.com/

混合模型

  • 混合模型结合了多个前面描述的编程模型。
  • 目前,混合模型的一个常见示例是消息传递模型 (MPI) 与线程模型 (OpenMP) 的组合。
    • 线程使用本地节点数据执行计算密集型内核
    • 不同节点上的进程之间的通信使用 MPI 通过网络进行
  • 这种混合模型非常适合最流行的(当前)集群多核/众核计算机的硬件环境。
  • 另一个类似且越来越流行的混合模型示例是将 MPI 与 CPU-GPU(图形处理单元)编程结合使用。
    • MPI 任务在使用本地内存的 CPU 上运行,并通过网络相互通信。
    • 计算密集型内核被卸载到节点上的 GPU。
    • 节点本地内存和 GPU 之间的数据交换使用 CUDA(或等效工具)。
  • 其他混合模型很常见:
    • 带 Pthreads 的 MPI
    • 具有非 GPU 加速器的 MPI

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

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

相关文章

【MySQL 06】表的约束

文章目录 🌈 一、约束的概念🌈 二、空属性约束⭐ 1. 空值无法参与运算⭐ 2. 设置非空属性 🌈 三、默认值约束⭐ 1. 默认值使用案例⭐ 2. 同时设置 not null 和 default 🌈 四、列描述约束🌈 五、zerofill 补零约束&…

校园外卖平台小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,菜品信息管理,菜品分类管理,购买菜品管理,订单信息管理,系统管理 微信端账号功能包括:系统首页&a…

【python报错已解决】`IndexError: list index out of range`

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查索引范围2.2 方法二…

Java - IDEA开发

使用IDEA开发Java程序步骤: 创建工程 Project;创建模块 Module;创建包 Package;创建类;编写代码; 如何查看JDK版本 Package介绍: package是将项目中的各种文件,比如源代码、编译生成的字节码、配置文件、…

哈希表 - 三数之和

15. 三数之和 方法一&#xff1a;排序双指针 /*** param {number[]} nums* return {number[][]}*/ var threeSum function(nums) {const res [], len nums.length;// 将数组排序nums.sort((a, b) > a - b)for (let i 0; i < len; i) {let l i 1, r len - 1, iNum…

宝塔面板实现定时任务删除 logs文件 加条件删除 只删除一个月前的日志

我们在开发中难免用到了日志功能&#xff0c;随着日志越来越多导致占用我们的内存 下面是一个简单的 使用宝塔面板里面的定时任务来实现删除日志案例 第一步 首先我的日志文件目录 都在log文件夹里面&#xff0c; 每个月生成一个日志文件夹 文件夹命名是年月来命名的 第二…

Java面试八股之什么是AMQP协议

什么是AMQP协议 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;是一个开放标准的应用层协议&#xff0c;旨在为消息中间件提供一种统一的、标准的通信方式。它允许消息在分布式系统中的应用程序之间进行可靠的、异步的传递。AMQ…

【云原生】Pass容器研发基础——汇总篇

云原生基础汇总 系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了云计算学习的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;每个知识点的修正和深入主要参考各平台大佬的文章&#xff0c…

Linux2.6内核进程调度队列详细讲解

上图是 Linux2.6 内核中进程队列的数据结构&#xff0c;之间关系也已经给大家画出来&#xff0c;方便大家理解。 一个 CPU 拥有一个 runqueue。 Linux真正的调度方式是通过runqueue进行调度的&#xff0c;我们知道进程的优先级范围是根据nice值确定的&#xff0c;而nice值的范围…

Raspberry Pi Pico 2 上实现:实时机器学习(ML)音频噪音抑制功能

Arm 公司的首席软件工程师 Sandeep Mistry 为我们展示了一种全新的巧妙方法&#xff1a; 在 Raspberry Pi Pico 2 上如何将音频噪音抑制应用于麦克风输入。 机器学习&#xff08;ML&#xff09;技术彻底改变了许多软件应用程序的开发方式。应用程序开发人员现在可以为所需系统整…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…

JVM运行时数据区之虚拟机栈

【1】概述 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;&#xff0c;早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个的栈帧&#xff08;Stack Frame&#xff09;&#xff0c;对应着一次次的Java方法调用。 栈是运行…

Leetcode JAVA刷刷站(20)有效的括号

一、题目概述 二、思路方向 在Java中&#xff0c;要判断一个仅包含括号&#xff08;(, ), {, }, [, ]&#xff09;的字符串是否有效&#xff0c;你可以使用栈&#xff08;Stack&#xff09;数据结构来实现。栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的…

达梦数据库 逻辑备份还原

达梦的逻辑备份还原 1.背景2.要求3.实验步骤3.1 相关术语3.2 dexp逻辑导出3.2.1 使用dexp工具3.2.2 dexp相关参数含义3.2.3 四种级别导出3.2.3.1 FULL3.2.3.2 OWNER3.2.3.3 SCHEMAS3.2.3.4 TABLES 3.2.4 使用范例3.2.4.1 环境准备3.2.4.2 dexp逻辑导出 3.3 dimp逻辑导入3.3.1 使…

AI大模型赋能游戏:更智能、更个性化的NPC

参考论文&#xff1a;https://arxiv.org/abs/2403.10249 在传统游戏中&#xff0c;NPC&#xff08;非玩家角色&#xff09;的行为往往是预先设定好的&#xff0c;缺乏灵活性和变化性。然而&#xff0c;基于大模型的NPC可以利用其强大的推理和学习能力&#xff0c;实时生成对话…

汇编语言指令 jmp:jmp short、jmp near ptr、jmp far ptr

引言&#xff1a; 在8086CPU中&#xff0c;可以修改IP&#xff08;Instruction Pointer &#xff0c;指令指针寄存器&#xff09;或同时修改CS&#xff08;Code Segment&#xff0c;代码段寄存器&#xff09;和IP的指令称为转移指令&#xff0c;更通俗的说&#xff0c;转移指令…

React H5设置企业级v6版本路由的配置

路由配置是项目开发的必要一环&#xff0c;尤其是目前流行SPA&#xff0c;下面看看如何使用v6版本路由进行合理的H5路由配置 一、基本页面结构&#xff08;目录根据开发要求建&#xff0c;下面仅用于展示配置路由&#xff09; 二、具体文件实现 1. index.tsx import React f…

用python的manim库实现表格格式操作【table 下】

1.Table 是 Manim 中用于创建一个包含文本或其他 数学符号的表格的类 Table 是 Manim 中用于创建一个包含文本或其他 数学符号的表格的类它能够帮助你在场景中清晰地展示数据或信息。 参数解释 table: 一个二维数组或列表&#xff0c;表示表格中的内容。每个子列表代表表格的…

Spring Web MVC

1. Spring Web MVC Spring Web MVC是⼀个Web框架 1.1 MVC 举个例子理解: Controller相当于前台,接送请求,传给相关部门,部门派人处理,此时这就是Model MVC是一种思想,Spring进行了实现,称为Spring MVC Spring Boot是创建Spring MVC项目的一种方式而已 1.2 Spring MVC 而…