流水线式并行加速

  入门级的并行加速一般会以一个大数组的计算来举例。这种并行加速的方式适用于大量数据的复杂计算,而且这些计算必须是重复的。然而大多数的程序并不会遇到大量数据的相同计算,这种入门级的并行加速就显得无用武之地。

  其实并行加速的模型是对一个任务矩阵进行分块。这个矩阵有2个维度:时间维度和空间维度。

  入门级的并行加速是对空间维度进行分片。而大多数的程序并不会同时触发一大批的任务。这些任务是随机启动的。入门级的并行加速要求任务同时启动,那么就必须对随机出现的任务进行缓存。而任务触发的周期有长有短,为了防止缓存长时间不能充满,还需要一个定时器进行强制触发。虽然看起来很好地解决了问题,但是使用这种并发结构必然导致响应延迟,CPU的负载不均匀,降低服务器的处理能力。

  相对高级的方法是使用线程池。线程池很好地消除了对同时启动的限制。但是无限线程池容易会造成内存大量消耗,不知道什么时候内存就可能耗尽,实际运行的线程也就是进程绑定的CPU逻辑核心数,并不能无限加速。固定线程池能很好地控制运行线程数量,防止大量线程交换造成过多的计算,但是固定线程池在IO处理的时候力不从心。使用线程池虽然高级一些,却不是理想的解决办法。

  具有工程意义的并行加速主要是对时间维度进行分片。将一个长任务分解成一系列的步骤,每一步骤根据计算量和IO调用的情况分别设置固定数量的线程。线程之间的数据采用队列或映射进行传送。收到请求之时,可以立即开始处理。

  特殊的情况下,线程之间的数据可以采用其它容器实现。比较特别的是映射。映射会自动清除同一个键下,未被处理的旧数据。这一特性在互联网服务中是匪夷所思的,因为互联网服务不会在未触发异常的情况下主动清除未完成的用户请求。映射主要适用于窗口任务的传递。操作系统只有一个显示线程。这个线程的优先级最低,而且睡眠时也会暂停。如果对窗口任务使用队列传递,就很容易在难以预料到的情况下触发内存溢出导致显示异常,甚至把操作系统都卡死。这时,使用映射作为数据传输的载体就能非常简单地避免内存溢出。

  对时间维度进行任务分割的方式,非常适合处理随机产生的高并发请求。这种架构的名称即是流水线。

  一条流水线可以包含2种抽象的成员类型:工作组和传送器。

  工作组即是业务代码中对特定任务片段的实现,并以指定数量的线程承载运行。

  传送器是将上游工作员的计算结果(半成品数据)传递到下游工作员的子程序,一般是具有阻塞功能的容器。

  工作组中的每一个线程称为工作员。

  由于每个工作组都只执行完整业务的某个片段,每个工作组的业务代码都相对简单,这就提高了业务代码片段的维护性。

  工作组中的工作员数量经计算或测试来决定,对业务中执行时间较短的部分设置少量工作员,对业务中执行时间较长的部分设置大量工作员,合理安排线程数量,可充分发挥CPU的算力。

  由于传送器的存在,监视线程能够检测到任务积压的情况,这就可以提前预判内存溢出和超时异常,及时止损,清理掉那些没有希望完成的请求或暂停受理请求,保障系统稳定性。

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

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

相关文章

blender 使用“Shape Keys”(形状键)

【Blender教程】形态键动画_哔哩哔哩_bilibili 准备人头模型 首先需要一个人头的基础网格模型,包含眼睛、嘴巴等部位进入编辑模式,确保顶点布局合理,待会儿需要移动这些顶点设置相对形状关键帧 切换到物体数据属性面板,选择Shape Keys选项卡默认情况下只有一个基础形状关键帧点…

uniapp 分包

在uniapp项目中的根目录下找到pages.json文件夹: {"pages": [ {"path": "pages/index/index","style": {"navigationBarTitleText": "index"}}],// 分包"subPackages": [{"root"…

Lua中文语言编程源码-第二节,更改lbaselib.c基础库模块, 使Lua支持中文关键词(与操作相关的)

源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lbaselib.c,是Lua的基础库模块。 增加中文保留字标识符列表,保留英文保留字标识符列表。 搜索luaB_collectgarbage函数: 控制和查询Lua垃圾回…

算法中出现的一些报错及其处理办法

Exception in thread “main” java.lang.UnsupportedOperationException 源代码是 Scanner s new Scanner(System.in);int target s.nextInt();Set<Integer> set new HashSet<>();for(int i0;i<target;i)set.add(s.nextInt());List<Integer> list s…

基础练习题之函数

前言 这些题目来自与一些刷题网站,以及c primer plus,继续练习 第一题 给你一个数&#xff0c;让他进行巴啦啦能量&#xff0c;沙鲁沙鲁&#xff0c;小魔仙大变身&#xff0c;如果进行变身的数不满足条件的话&#xff0c;就继续让他变身。。。直到满足条件为止。 巴啦啦能量…

SQLiteC/C++接口详细介绍之sqlite3类(十五)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 47.sqlite3_set_authorizer 用法&#xff…

11.进程的同步与互斥

11.进程的同步与互斥 计数信号量及其初始化 和王道里面学的PV操作一摸一样,带个count变量,带个阻塞队列 //D:\code\x86\code\start\start\source\kernel\include\ipc\sem.h #ifndef OS_SEM_H #define OS_SEM_H#include "tools/list.h"/*** 进程同步用的计数信号量*…

BswM模块配置指导

文章目录 BswM配置的分类自动配置:通信控制Rule:CC_ComMChannel_Rx自动配置:Ecu状态处理自动配置:模块初始化其他配置总结BswM模块是基础软件的模式管理模块,模式/状态控制都是由BswM模块进行,其实现的方式是通过 “请求-仲裁-执行”三步完成。本篇基于基本Can通信所用到…

string.h主要函数汇总

大家点击蓝色的连接就可以跳转查看了&#xff1a; strcpy,strncpy strchr strncmp strcmp strcat strncat strstr

2024计算机二级6

1.基本路径测试是属于白盒测试方法且是动态测试&#xff0c;静态测试不实际运行软件&#xff0c;主要通过人工进行分析。动态测试就是通常所说的上机测试&#xff0c;通过运行软件来检验软件中的动态行为和运行结果的正确性。百合测试的主要技术有逻辑覆盖测试、基本路径测试。…

UE5.1_自定义配置文件读取

UE5.1_自定义配置文件读取 读取配置文件时常规项目都会要求考虑的一个问题,然我接触过的UE类项目还真没考虑过,最近有个想法,奈何比较费劲,利用网上的教程跟进一下试试? 先基于Actor创建c++类(应该大家都会的吧),然后就是一下代码: MyConfig.h // Fill out your c…

CSS其他属性

文章目录 1. vertical-align1.1. 概念1.2. 常用值1.3. 作用1.4. 出现的情况一1.4.1. 原因1.4.2. 解决方案 1.5. 出现情况二1.5.1. 解决方案一1.5.2. 解决方案二1.5.3. 解决方案三 1.6. 出现情况三1.6.1. 原因1.6.2. 解决方案 2. 溢出效果2.1. 作用2.2. 属性名 3. 隐藏效果3.1. …

14双体系Java学习之数组

数组 ★小贴士 数组中保存固定数量的值&#xff0c;声明数组时需要制定数组中元素的类型&#xff0c;数组的长度在创建数组时设定。 保存数据的数据结构有很多&#xff0c;Java的标准函数库中就包含了许多复杂的数据结构&#xff0c;比如map、tree和set&#xff0c;以后会讲解的…

电脑那个部件坏了或者是哪个软件需要修复来看价钱

电脑维修价格表是多少&#xff1f; 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多&#xff0c;而且会以各种奇怪的方式出现问题&#xff0c;下面我们就来看看具体的充电方法。 电脑维修价格表&#xff1a; 1. 重新安装系统。 安装XP系统通常需…

uniapp sqlite时在无法读取到已准备好数据的db文件中的数据

问题 {“code”:-1404,“message”:“android.database.sqlite.SQLiteException: no such table: user (Sqlite code 1): , while compiling: select * from user, (OS error - 2:No such file or directory),http://ask.dcloud.net.cn/article/282”} at pages/index/index.vu…

行走的机器人

题目描述 Bob 对机器人进行了编程&#xff0c;让它在平面迷宫中行走。 迷宫有一些障碍。 空单元格由字符"."表示&#xff0c;障碍物由"#"表示。 迷宫中只有一个机器人。 它的起始位置用字符"S"表示。 这个位置没有任何障碍。 迷宫中也只有一个…

<Linux> 线程的同步与互斥

目录 前言&#xff1a; 一、资源共享问题 &#xff08;一&#xff09;多线程并发访问 &#xff08;二&#xff09;临界资源与临界区 &#xff08;三&#xff09;“锁” 是什么 二、多线程抢票场景 &#xff08;一&#xff09;并发抢票 &#xff08;二&#xff09;并发访…

Segment Routing IPv6简介

定义 SRv6&#xff08;Segment Routing IPv6&#xff0c;基于IPv6转发平面的段路由&#xff09;是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH&#xff08;Segment Routing Header&#xff09;&#xff0c;在SRH中压…

Ubuntu下安装microk8s用代理解决无法拉取镜像问题

首先安装microk8s: sudo snap install microk8s --classic得到输出&#xff1a; microk8s (1.28/stable) v1.28.7 from Canonical✓ installed设置 K8s 命令别名&#xff08;alias&#xff09; MicroK8s 支持的命令中&#xff0c;我们会相对高频的使用 microk8s.kubectl 这个…

渗透测试与HTTP中的PUT请求

PUT 请求用于向服务器更新指定资源&#xff0c;可以理解为对服务器上的资源进行修改操作。使用 PUT 请求方式会覆盖原有的资源内容&#xff0c;因此需要谨慎使用。 在渗透测试中&#xff0c;有可能服务端会暴露PUT请求的api&#xff0c;如修改用户权限的api&#xff0c;例如HT…