接着上周未完的话题 避不开的数据拷贝。

既然处理器是通用机器,就没有专属数据,所以数据都要从别处调来,这就涉及到了数据搬运,就有了外设的概念。由于不同外设和处理器一起共享数据存储,时间会花在两方面:

  • 时间会花在检索自己需要的数据上,这是算法和数据结构的领域;
  • 时间会花在数据搬运上,这是拓扑,总线,网络,协议的领域;

“尽量不拷贝” 和 “尽量不传输数据” 都是尽量不移动数据的实例,而不是醉心于让拷贝和传输变得更快。为了不移动数据却又能使用数据,要将思路转换为传递控制信号或直接传递结果,让数据保持在 “原地”。 这需要更多的通路组织更智能的网络。

近年来如日中天的零拷贝,设备内存,片商存储等概念值得一提,但在软件领域,其实人们一直在恪守这些信念。不外乎两个观点:

  • 内存观点,固定 buffer,比如统一往一个 buffer-ring 里送;
  • 程序观点,离散 buffer,比如将离散的 buffer 串成一个 queue;

在这里插入图片描述

总之都是数据能不动就不动,实在要动就少动,如果有谁写了一个程序,频繁做 memcpy,势必要被优化掉,不管是针对程序,还是针对人。

可以审视从初学编程到使用 Linux 内核的 splice/tee,基本就是上图的过程,从一开始果真把 queue 当成一个实体 queue,copy 内存往里排队,到最后直接在两个 fd 之间非 copy 传递数据,见证了逐渐让数据不移动的过程。

同理,当外设能力反超 CPU,而软件成为瓶颈后,外设硬件当然要走一遍同样的路,近年来的 Device Memory TCP 就是其中一例:
在这里插入图片描述

其它实例几乎同理。

还有一个问题,如果必须要搬运,数据搬运过程中为什么需要 buffer,为什么不能一镜到底,推而广之,为什么要接力,转介。这就要说到通用计算机处理数据的两类方式:

  • 流水线提高吞吐;
  • 并行化提高吞吐;

总之要有资源,且要资源全部动起来,这是一种通用资源组织理念,无论对硬件还是软件。

本质上还是因为通用机器以数据为中心,通用机器的数据都从别处搬来,效率高低取决于搬运的方式,如果有搬运和处理部件闲置,就一定要想办法将它用起来。
定量讲,如果增加一倍的通用处理资源,理论上应该增加一倍的吞吐。举例说明,将数据从 A 搬到 B:
在这里插入图片描述

可见并行方式就是一镜到底,这并不是问题的核心所在。问题的核心在于分割时间还是分割空间,本质上还是如何在时空展开的问题,这就涉及到数据的语义。

如果数据是严格保序的,通用机器需无条件满足该约束,典型例子是通用处理器,即 CPU,它的处理资源必须在时间维度分割成流水线,作为数据的串行指令在其中接力通过。另一个对面的例子,内存数据是不保序的地址映射,因此它是并行结构,每一个 bit 都有一条地址线和数据线传输该 bit,这些线在空间维度并在一起。

这样看来,串行指令通过流水线执行,而数据则通过并行通道映射到目的地,似乎一想就通,但当真正传输数据而不仅仅是内存和 CPU 交互时,却纷纷拒绝并行,接受 stream 抽象,分层模型下 “纵然在 byte 级别存在 byte stream,但在 bit 级别依然并行传输” 的内存操作,等价为 “纵然在 byte 级别存在 byte stream,但在 packet 级别依然并行传输” 被忽视,也许是 packet 出现在 byte stream 之后,IP 从 TCP 分离而来之故,但 PCIe,USB 也是串行。

否则,若信道不识 stream,像内存地址般映射,并行传输就是自然而然的选择。

现如今,除了内存,芯片内部总线采用并行策略外,几乎都选择了串行,从大尺度的 TCP/IP,到微尺度的 PCIe,明确的理由似乎又要回到早期串行,并行之争里去寻址,不外乎:

  • 并行信号时钟同步困难,时钟偏移,线路干扰,布线成本高;
  • 串行时钟精准同步,抗干扰强,线路少,成本低,适合长距离;

把这些往大尺度 TCP/IP 延申,也能解释 MPTCP 的实现粒度为什么做不细,本质上是一回事。所以,最终的通用策略是:

  • 传输网络以并行的方式构建,业务数据在其特定的某条路径上串行传输。

但这只是通用策略,值得注意的是例外,若并行劣势均克服,串行就没优势了,这也是我认可数据中心网络并行多路径传输的原因:

  • 拓扑规则,ECMP 路径一致,RTT 短,同步存储开销小,负载分担,拥塞均衡。

总之,数据中心传输可像内存和内部总线那般并行,但其它场景不具备这特征,不管是广域网,USB,PCIe,还是 nvlink。更微观意义上,串行并行依然保持着嵌套,PCIe,nvlink 虽串行,但它们均采用多通道并行捆绑实现更高的带宽,整个数据搬运结构在全局看来依然维持着规整。

尽量不搬运数据,非要少量搬运,上面介绍了如何高效搬运。进一步优化思路就很明确,像以往专用设备那样独占数据,让数据和处理一体化,就滑向跷跷板的另一端了。

浙江温州皮鞋湿,下雨进水不会胖。

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

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

相关文章

娃哈哈经销商“大洗牌”:砍掉年销300万以下经销商

文 | 大力财经据第一财经报道,娃哈哈在宗馥莉“铁腕”策略推动下,正经历经销商体系的重大变革,陆续砍掉年销低于300万元的经销商,方式有时颇为激进,“一刀切”的做法引发诸多争议,部分经销商反馈存在款项未…

drippingblues靶机通关练习笔记

前言 将靶机导入到vmware虚拟机上 靶机下载地址:https://download.vulnhub.com/drippingblues/drippingblues.ova 将网段都设置为nat 信息收集 ip端口扫描 netdiscover -r 192.168.25.1/24 --确定ip nmap -A -p- 192.168.25. kalid的ip:1…

QT第三讲- 机制、宏、类库模块

文章目录 🧩 一、Qt核心机制与类库 🔧 1. 元对象系统(Meta-Object System) ⚡ 2. 信号与槽(Signals & Slots) • 通信机制 📦 3. 属性系统(Property System) 动态属性 例程 类的附加信息 Q_CLASSINFO 例程 🌐 二、全局定义与容器 📝 1. 全局数据类型与函数…

(LeetCode 每日一题) 869. 重新排序得到 2 的幂 (哈希表+枚举)

题目&#xff1a;869. 重新排序得到 2 的幂 思路&#xff1a;哈希表枚举。先预处理出所有的2的幂数&#xff0c;用哈希表来存储。 C版本&#xff1a; class Solution { public:// 哈希表存储所有 2的幂数 按升序排列的形式unordered_set<string> st;// 预处理出所有的2…

WebAssembly技术详解:从浏览器到云原生的高性能革命

引言&#xff1a;WebAssembly的诞生与使命 2015年&#xff0c;当Mozilla、Google、Microsoft和Apple四大浏览器厂商联合发布WebAssembly&#xff08;Wasm&#xff09;技术预览时&#xff0c;业界尚未意识到这将开启Web性能的新纪元。作为继HTML、CSS、JavaScript之后的第四种We…

性能解析案例

异步io是内核fd与应用程序直接的关系io 多路复用1.检测io是否就绪2.read/write消息队列kafka&#xff1a;1.典型应用 &#xff1a;异步处理&#xff0c;系统解耦&#xff0c;流量削峰&#xff0c;日志处理2.核心原理&#xff1a;kafka体系结构以及读写流程3.具体操作&#xff1…

青龙峡拔韭菜

我们一年四季&#xff0c;除了冬天不往山里进&#xff0c;其余季节&#xff0c;只要天气允许&#xff0c;我们都会进山。在山里拔韭菜&#xff0c;是我们百做不烦的一件事。今年大旱&#xff0c;从五月份上山找韭菜&#xff0c;没有如愿。直到入秋后&#xff0c;我们再次去青龙…

5、docker镜像管理命令

1、命令总览命令&#xff08;含关键参数&#xff09;作用出现频率备注docker buildx build --platform … -t … --push .一次构建并推送多平台镜像高频需先 docker buildx create --usedocker buildx build -o typedocker,destxxx.tar .构建后离线导出 tar 包中频只导出单平台…

阿里云ECS云服务器临时升级带宽方法

阿里云ECS云服务器临时升级带宽方法一、背景与需求二、原理三、操作步骤步骤 0: 准备工作步骤 1: 创建弹性网卡 (ENI)步骤 2: 创建并绑定弹性公网IP (EIP)步骤 3: SSH登录ECS并切换到高速通道 (eth1)步骤 4: 执行你的高带宽任务步骤 5: 任务完成&#xff0c;切回默认网卡 (eth0…

Java语言简介

一.Java语言的起源 Java语言的前身是Oka语言,是美国Sun Microsystems公司于1991年推出的,仅限于公司内部使用的语言。1995年,Sun公司将Oak语言更名为Java语言,并正式向公众推出。这之后,Java语言不断更新,其类库越来越丰富,性能逐步提升,应用领域也显著拓展,已成为当今…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-视频列表与视频播放

在现代Web开发中&#xff0c;视频播放功能已成为许多网站的基本需求。本文将基于Vue.js框架&#xff0c;详细讲解如何实现一个视频列表与播放器交互的功能模块。这个组件可以让用户点击列表中的视频项来播放对应的视频&#xff0c;并支持再次点击关闭播放器。功能概述我们实现的…

详解 Seaborn:让数据可视化更简单高效的 Python 库

在数据科学领域&#xff0c;可视化是理解数据、挖掘规律的重要手段。今天要为大家介绍的 Seaborn 库&#xff0c;正是数据可视化领域的一把 “利器”。它基于 Matplotlib 开发&#xff0c;却凭借更简洁的接口和更美观的默认样式&#xff0c;成为众多数据分析师的首选工具。下面…

Cesium1.95中如何高效管理 1500 个高频实体

一、建议&#xff1a;不要频繁创建/销毁&#xff0c;而是复用对象&#xff1b;​​​​使用 CallbackProperty更新位置而不是删了重建&#xff1b;​​​​对大量 Billboard / Polyline / Label&#xff0c;优先使用对应的 *Collection&#xff0c;然后批量更新&#xff1b;​​…

全面了解机器语言之kmeans

深入理解 KMeans 聚类算法&#xff1a;原理、实现与应用在机器学习领域&#xff0c;聚类算法作为无监督学习的核心技术之一&#xff0c;一直以来都是数据挖掘和模式识别的重要工具。其中&#xff0c;KMeans 算法以其简洁的原理、高效的计算性能和广泛的适用性&#xff0c;成为最…

纳米陶瓷与光子集成:猎板PCB定义下一代VR硬件的技术蓝图

虚拟现实&#xff08;VR&#xff09;设备正从“视觉沉浸”向“多感官无感交互”演进&#xff0c;其底层PCB技术面临带宽、算力密度与动态可靠性的三重挑战。作为国内高端PCB技术的引领者&#xff0c;​​猎板PCB​​以材料革新、光电子融合与智能响应为核心&#xff0c;构建了适…

Linux ssh-keygen系列命令与ssh命令的使用

关联文章 Linux ssh 免密登录配置&#x1f44d;对日开发 TeraTerm 批量向各台服务器传输文件SSH 教程&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; 目录一. ssh-keygen相关命令1.1 简介1.2 生成密钥1.3 ssh-copy-id 上传公钥到指定的服务…

从C++0基础到C++入门 (第二十五节:指针【所占内存空间】)

目录 一. 指针所占内存空间 1.1 验证指针大小的代码示例 1.2 不同系统架构下的差异 1.3 指针大小与类型无关 1.4 空指针的大小 1.5 多级指针的大小 1.6 实际应用中的注意事项 一. 指针所占内存空间 指针在内存中占用的空间大小取决于系统架构和编译环境。 32位系统中指…

Windows选择文件自动删除及输入框自动打字的解决办法

觉得有帮助麻烦您动动发财的小手点赞、收藏、加关注&#xff0c;感谢&#xff01; 运行环境&#xff1a;windows10 现象&#xff1a;鼠标点击任何文件&#xff0c;上下键选择任何文件都会自动放入回收站并弹警告框&#xff0c;鼠标放入输入框会自动打一串字符&#xff0c;删除…

大模型 MCP服务案例详细讲解

大模型与 MCP(Model Context Protocol)服务器的交互是一个双向、异步、流式的过程,涉及协议解析、函数调用、实时数据交换等关键环节。下面我将详细解释整个交互流程,结合具体示例和时序图说明。 🔄 核心交互流程图 #mermaid-svg-Adxo4FoP4oRzAJdV {font-family:"tr…

MVCC和日志

MVCC是一种并发控制的方法&#xff0c;在数据库管理系统中&#xff0c;实现对数据库的并发访问&#xff0c;在编程语言中实现事务内存主要是为了提高数据库并发性能&#xff0c;更好的处理读写冲突&#xff0c;做到即使有读写冲突时&#xff0c;也能做到不加锁&#xff0c;非阻…