避不開的數據拷貝(2)

接著上周未完的話題 避不開的數據拷貝。

既然處理器是通用機器,就沒有專屬數據,所以數據都要從別處調來,這就涉及到了數據搬運,就有了外設的概念。由于不同外設和處理器一起共享數據存儲,時間會花在兩方面:

  • 時間會花在檢索自己需要的數據上,這是算法和數據結構的領域;
  • 時間會花在數據搬運上,這是拓撲,總線,網絡,協議的領域;

“盡量不拷貝” 和 “盡量不傳輸數據” 都是盡量不移動數據的實例,而不是醉心于讓拷貝和傳輸變得更快。為了不移動數據卻又能使用數據,要將思路轉換為傳遞控制信號或直接傳遞結果,讓數據保持在 “原地”。 這需要更多的通路組織更智能的網絡。

近年來如日中天的零拷貝,設備內存,片商存儲等概念值得一提,但在軟件領域,其實人們一直在恪守這些信念。不外乎兩個觀點:

  • 內存觀點,固定 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;非阻…