【并行计算】【《并行程序设计导论》笔记】第二章:并行硬件和并行软件

本文主要是介绍【并行计算】【《并行程序设计导论》笔记】第二章:并行硬件和并行软件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 2.1|背景知识
        • 冯·诺依曼结构
      • 2.2|对冯·诺依曼模型的改进
        • 指令级并行
          • 多发射
        • 硬件多线程
          • 同步多线程
      • 2.3|并行硬件
        • SIMD系统
          • 向量加法
          • 向量处理器
            • 向量寄存器
            • 向量指令
            • 交叉存储器
            • 步长存储器访问和硬件散射/聚集
            • 向量编译器
            • 可扩展性
          • 图形处理单元(GPU)
        • MIMD系统
          • 共享内存系统
          • 分布式内存系统
        • Cache一致性
          • 监听Cache一致性协议
          • 基于目录的Cache一致性协议
          • 伪共享
      • 2.5|输入和输出
        • 假设与规则

因上努力

个人主页:丷从心·

系列专栏:并行计算

果上随缘


2.1|背景知识

冯·诺依曼结构
  • 主存和 C P U CPU CPU之间的分离称为冯·诺依曼瓶颈

2.2|对冯·诺依曼模型的改进

指令级并行
多发射
  • 多发射处理器通过复制功能单元来同时执行程序中的不同指令
  • 如果功能单元是在编译时调度的,则称该多发射系统使用静态多发射,如果是在运行时间调度的,则称该多发射系统使用动态多发射
  • 一个支持动态多发射的处理器称为超标量
硬件多线程
同步多线程
  • 同步多线程是细粒度多线程的变种,通过允许多个线程同时使用多个功能单元来利用超标量处理器的性能
  • 通过指定优先线程能够在一定程度上减轻线程减速的问题,优先线程是指有多条指令就绪的线程

2.3|并行硬件

SIMD系统
  • 典型的冯·诺依曼系统是单指令流单数据流系统
向量加法
  • 有两个数组 x x x y y y,每个都有 n n n个元素,把 y y y中的元素加到 x x x
for (i = 0;i < n;i++)x[i] += y[i]
  • 假如 S I M D SIMD SIMD系统中有 n n n A L U ALU ALU,能够将x[i]y[i]加载到第 i i i A L U ALU ALU中,然后让第 i i i A L U ALU ALUx[i]y[i]相加,最后将结果存储在x[i]
  • 在经典的 S I M D SIMD SIMD系统中, A L U ALU ALU必须同步操作,即在下一条指令开始执行之前,每个 A L U ALU ALU必须等待广播
向量处理器
向量寄存器
  • 向量寄存器是能够存储由多个操作数组成的向量,并且能够同时对其内容进行操作的寄存器,向量的长度由系统决定
向量指令
  • 只需要一次加载、一次加法和一次存储操作就能完成对长度为vector_length的数据块的操作
交叉存储器
  • 内存系统由多个内存“体”组成,每个内存体能够独立访问
  • 在访问完一个内存体之后,再次访问它之前需要有一个时间延迟,如果向量中的各个元素分布在不同的内存体中,那么在装入 / / /存储连续数据时能够几乎无延迟地访问
步长存储器访问和硬件散射/聚集
  • 程序能够访问向量中固定间隔的元素
  • 散射 / / /聚集是对无规律间隔的数据进行读(聚集)和写(散射)
向量编译器
  • 向量编译器擅长于识别向量化的代码
  • 能识别出不能向量化的循环而且能提供循环为什么不能向量化的原因
可扩展性
  • 向量处理器不能处理不规则的数据结构和其他的并行结构,这对可扩展性是个限制
图形处理单元(GPU)
  • 通过在每个 G P U GPU GPU处理核中引入大量的 A L U ALU ALU来使用 S I M D SIMD SIMD并行
  • 为了避免内存访问带来的延迟, G P U GPU GPU严重依赖硬件多线程
MIMD系统
  • M I M D MIMD MIMD系统通常是异步的,没有全局时钟
共享内存系统
  • 在拥有多个多核处理器的共享内存系统中,互联网络可以将所有的处理器直接连到主存,称为一致内存访问 U M A UMA UMA系统,或者也可以将每个处理器直接连到一块内存,通过处理器中内置的特殊硬件使得各个处理器可以访问内存块中的其他块,称为非一致内存访问 N U M A NUMA NUMA系统
分布式内存系统
  • 网格提供一种基础架构,使地理上分布的计算机大型网络转换成一个分布式内存系统
Cache一致性
  • 在多核系统中,各个核的 C a c h e Cache Cache存储相同变量的副本,当一个处理器更新 C a c h e Cache Cache中该变量的副本时,其他处理器中 C a c h e Cache Cache的副本也应该更新
监听Cache一致性协议
  • 监听协议的想法来自于基于总线的系统,当多个核共享总线时,总线上传递的信号都能被连接到总线的所有核“看”到
  • 广播会通知其他核包含该变量的整个 C a c h e Cache Cache行已经更新
  • 监听 C a c h e Cache Cache一致性协议是不可扩展的,对于大型系统,它会导致性能的下降
基于目录的Cache一致性协议
  • 目录存储每个内存行的状态,这个数据结构是分布式的,每个核 / / /内存对负责存储一部分的目录
  • 目录表示局部内存对应高速缓存行的状态
  • 当一个高速缓存行被读入时,与这个高速缓存行相对应的目录项就会更新
  • 当一个变量需要更新时,就会查询目录,并将所有包含该变量高速缓存行置为非法
伪共享
  • C P U C a c h e CPU \ Cache CPU Cache是由硬件来实现的,硬件是对高速缓存行进行操作的,而不是对单独的变量进行操作
  • 伪共享不会引发错误结果,但是它能引起过多不必要的访存,降低程序的性能

2.5|输入和输出

  • 当多个进程能够访问stdoutstderrstdin时,输入的分布和输出的顺序是非确定的
假设与规则
  • 当并行程序需要输入 / / /输出时,做一些假设并遵循一些规则
  • 在分布式内存程序中,只有进程 0 0 0能够访问stdin,在共享内存程序中,只有主线程或者线程 0 0 0能够访问stdin
  • 在分布式内存和共享内存系统中,所有进程 / / /线程都能够访问stdoutstderr
  • 只有一个进程 / / /线程会尝试访问一个除stdinstdout或者stderr外的文件

这篇关于【并行计算】【《并行程序设计导论》笔记】第二章:并行硬件和并行软件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949200

相关文章

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java之并行流(Parallel Stream)使用详解

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集... 目录Java并行流(Parallel Stream)1. 核心概念与原理2. 创建并行流的方式3. 适

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如