一步一步寫線程之十四并行編程和并行庫

一、并行編程

多線程和多進程編程,在早期一般是并發編程,現在基本是并行編程的基礎。或者干脆就叫并行編程也沒有什么可糾結的。但實際上并發編程和并行編程還是有著很大的不同。在前面的“多核和多CPU編程”系列中,已經對并發和并行的概念以及其不同進行了較深入的分析。如果有不太明白的,可以移步那個系列的文章。
這里之所以再次談起,主要是在寫線程的過程中,其實并發和并行往往是不分家的。一些常見的高并發處理的場景中,為了更好的利用多核和多CPU的優勢,往往會引入一些并行庫進行處理,目的只有一個,就是最大程度的壓榨CPU的潛力。
可是,并行庫的引入有利也有弊。最典型的就是一旦出現了線程間的問題,查找和定位問題就成了一個非常頭疼的故事。這個就需要非常有經驗的開發者不斷的進行各種分析和調度,甚至可以深入到庫內部進行查看問題的場景的發生路徑(前提是開源庫)。

二、并行庫和應用

這里不對并行的模式進行分析,只是介紹一下目前比較常見的并行庫:
1、OpenMp
這個可能是最常見的并行庫了,估計一般寫過并行程序的開發者或多或少都接觸過。簡單,易用。但功能上有一些限制,比如對非共享內存就有點不適應。
2、Intel TBB
TBB的應用因為有Intel背書,應用還是比較廣泛的,類似于圖的調度方式,更加靈活方便。抽象做的不錯。但可能和硬件關聯較強,畢竟誰家父母不喜歡自己家的孩子。

3、STL和Boost提供的并行庫
其實在這類庫提供的并行方式大多是基于函數接口方面的,更方便組合使用。特別是在c++11后提供了更多的并行算法如std::copy,std::find等等。

4、CUDA和OpenCL
這兩種比較偏向于GPU,當然OpenCL也支持CPU、FPGA等。OpenCL做為一種跨平臺的并行框架,支持的力度還需要加強。
其它并行庫還有,但多是比較專業了。

并行庫的應用,一般是對處理效率有著比較強的要求下才應用的。最常見的一般在大數據處理分析、圖像處理、音視頻處理以及一些科學計算等計算密集型與IO密集型緊密協調的情況下較多。
舉一個最常見的例子,需要對十張圖像進行灰度、編碼、壓縮等多道工序進行處理。那么并行庫的優勢就可以發揮出來。特別是當這個十張圖像的大小不一,壓縮的算法也要根據不同的情況進行壓縮時,那么處理時序就可以亂序(非輸入順序)進行處理。如果最終要求恢復時序,再做時序處理即可,如果不要求,則可以直接吐出結果。那么此時,對線程的處理就已經比較復雜了。那么如果增加到一百張、一千張甚至更多的圖像呢?
這樣做的結果,理論上講,單張處理最大的耗費時長即為十張圖像總處理的時長。這對于一些圖像處理算法,特別現在AI訓練時的意義可想而知。

三、例程

這里舉一個TBB的例子:

int main(){int ret = 0;broadcast_node<int> bNode(g);graph g;function_node< int, int > Sqr( g, 2, [](const int &data) {return data*data;} );function_node< int, int > Mul( g, 2, [](const int &data) {return data*3;} );function_node< int, int > Sum( g, 1, [&](const int &data ) -> int {return ret += v;} );make_edge( Sqr, Sum );make_edge( Mul, Sum );make_edge( bNode, Sqr );make_edge( bNode, Mul );for ( int i = 1; i < 20; ++i ) {bNode.try_put(i);}g.wait_for_all();std::cout << "result is " << ret << std::endl;return 0;
}

使用這種抽象的圖方式來組織并行線程間的數據流動非常有益,特別是在這些數據節點傳送時,需要動態切換的情況下,可以達到設計上的開閉原則而又不失靈活性。在Github上有不少使用TBB進行更高層的抽象應用的例子,推薦大家去學習一下。這些抽象的思想也可以應用在自己的多線程的應用上。

四、總結

古人說:“工欲善其事,必先利其器”,牛頓說要站在巨人的肩膀上,道理都是想通的。程序的設計開發也是如此,前人做過了很多非常有益的工作,后來者不必非再重復造一個輪子。但說這話得有一個前提,你得知道怎么造輪子,并且明白其內部的貓膩。
學以致用,用而后思。不斷總結推進自己的編程水平和提高自己的編程思想,這才是王道。
并行編程并不是本系列文章的目的,這里把并行編程的相關進行基礎的分析介紹,主要目的是讓開發者明白,所謂并行框架的基石,仍然是多線(進)程編程。只要掌握了這些基礎,那么在后期的學習和應用中,就會游刃有余!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20795.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用Python處理DAX多條件替換

小A&#xff1a;白茶&#xff0c;救命啊~~~ 白茶&#xff1a;什么情況&#xff1f; 小A&#xff1a;是這樣的&#xff0c;最近不是臨近項目上線嘛&#xff0c;有一大波度量值需要進行類似的調整&#xff0c;一個兩個倒沒啥&#xff0c;600多個&#xff0c;兄弟&#xff0c;救命…

從JS角度直觀理解遞歸的本質

讓我們寫一個函數 pow(x, n)&#xff0c;它可以計算 x 的 n 次方。換句話說就是&#xff0c;x 乘以自身 n 次。 有兩種實現方式。 迭代思路&#xff1a;使用 for 循環&#xff1a; function pow(x, n) {let result 1;// 在循環中&#xff0c;用 x 乘以 result n 次for (let i…

Springboot中使用spel+自定義注解實現權限控制

使用spel+自定義注解實現權限控制的案例很多, 比如springsecurity,本文也是一同樣的方式實現權限校驗 定義注解 package com.example.demo.anno;import java.lang.annotation.ElementType; import java.lang.annotation.

opencv進階 ——(九)圖像處理之人臉修復祛馬賽克算法CodeFormer

算法簡介 CodeFormer是一種基于AI技術深度學習的人臉復原模型&#xff0c;由南洋理工大學和商湯科技聯合研究中心聯合開發&#xff0c;它能夠接收模糊或馬賽克圖像作為輸入&#xff0c;并生成更清晰的原始圖像。算法源碼地址&#xff1a;https://github.com/sczhou/CodeFormer…

如何快速找到 RCE

背景介紹 本文將分享國外白帽子在‘偵察’階段如何快速發現 RCE 漏洞的經歷。以Apache ActiveMQ 的 CVE-2023–46604 為特例&#xff0c;重點介紹如何發現類似此類的漏洞&#xff0c;讓我們開始吧。 快速發現過程 在‘偵察’階段&#xff0c;白帽小哥會保持每周更新一次目標…

1940java swing零售庫存管理系統myeclipse開發Mysql數據庫CS結構java編程

一、源碼特點 java swing 零售庫存管理系統 是一套完善的窗體設計系統&#xff0c;對理解SWING java 編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;&#xff0c;系統主要采用C/S模式開發。 應用技術&#xff1a;javamysql 開發工具&#xff1a;…

適合技術小白學習的項目1863java在線視頻網站系統 Myeclipse開發mysql數據庫web結構java編程計算機網頁項目

一、源碼特點 java在線視頻網站系統 是一套完善的web設計系統&#xff0c;對理解JSP java編程開發語言有幫助采用了java設計&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統采用web模式&#xff0c;系統主要采用B/S模式開發。 開發環境為TOMCAT7.0,Myeclipse8.5開發…

數據庫、數據表的基本操作

1.數據庫的基本操作 &#xff08;1&#xff09;創建數據庫 &#xff08;2&#xff09;刪除數據庫 &#xff08;3&#xff09;將數據庫的字符集修改為gbk gbk是漢字內碼擴展規范&#xff0c;是GB2312和GB13000的擴展&#xff0c;主要用于簡體中文。 &#xff08;4&#xff09;…

LabVIEW在高校電力電子實驗中的應用

概述&#xff1a;本文介紹了如何利用LabVIEW優化高校電力電子實驗&#xff0c;通過圖形化編程實現參數調節、實時數據監控與存儲&#xff0c;并與Simulink聯動&#xff0c;提高實驗效率和數據處理能力。 需求背景高校實驗室在進行電機拖動和電力電子實驗時&#xff0c;通常使用…

前端框架安全防范

前端框架安全防范 在現代Web開發中&#xff0c;前端框架如Angular和React已經成為構建復雜單頁面應用&#xff08;SPA&#xff09;的主流工具。然而&#xff0c;隨著應用復雜度的增加&#xff0c;安全問題也變得越來越重要。本文將介紹如何在使用Angular和React框架時&#xf…

Java中的synchronized關鍵字詳解

Java中的synchronized關鍵字詳解 1. 引言 在Java編程中&#xff0c;多線程是提高應用性能的重要手段之一。然而&#xff0c;多線程環境下共享資源的訪問控制成為必須面對的問題。synchronized關鍵字作為Java語言提供的一種同步機制&#xff0c;能夠有效地解決這一問題。本文將…

施耐德 BAS PLC 基本操作指南

CPU 型號 項目使用的 PLC 型號為&#xff1a;施耐德昆騰 Quantum 140 CPU 67160 P266 CPU &#xff0c;支持熱備冗余&#xff0c;內部存儲 1024K&#xff0c;支持 2 個 PCMCIA 擴展卡槽CPU 模塊自帶接口&#xff1a;MB 串口接口、MB 串口接口、USB 接口、以太網接口&#xff…

MATLAB算法實戰應用案例精講-【數模應用】聯合分析(附python和MATLAB代碼實現)

目錄 前言 算法原理 什么是聯合分析? 聯合分析的基本原理與步驟

【HarmonyOS】List組件多層對象嵌套ForEach渲染更新的處理

【HarmonyOS】List組件多層對象嵌套ForEach渲染更新的處理 問題背景&#xff1a; 在鴻蒙中UI更新渲染的機制&#xff0c;與傳統的Android IOS應用開發相比。開發會簡單許多&#xff0c;開發效率提升顯著。 一般傳統應用開發的流程處理分為三步&#xff1a;1.畫UI&#xff0c;…

TiDB-從0到1-分布式存儲

TiDB從0到1系列 TiDB-從0到1-體系結構TiDB-從0到1-分布式存儲TiDB-從0到1-分布式事務TiDB-從0到1-MVCC 一、TiDB-DML語句執行流程&#xff08;增刪改&#xff09; DML流程概要 1、協議驗證 用戶連接到TiDB Server后首先工作的是Protocol Layer模塊&#xff0c;該模塊會對用…

mysql表字段超過多少影響性能 mysql表多少效率會下降

一直有傳言說&#xff0c;MySQL 表的數據只要超過 2000 萬行&#xff0c;其性能就會下降。而本文作者用實驗分析證明&#xff1a;至少在 2023 年&#xff0c;這已不再是 MySQL 表的有效軟限制。 傳言 互聯網上有一則傳言說&#xff0c;我們應該避免單個 MySQL 表中的數據超過 …

內網滲透-在HTTP協議層面繞過WAF

進入正題&#xff0c;隨著安全意思增強&#xff0c;各企業對自己的網站也更加注重安全性。但很多web應用因為老舊&#xff0c;或貪圖方便想以最小代價保證應用安全&#xff0c;就只僅僅給服務器安裝waf。 本次從協議層面繞過waf實驗用sql注入演示&#xff0c;但不限于實際應用…

[數據集][目標檢測]輪胎檢測數據集VOC+YOLO格式439張1類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;439 標注數量(xml文件個數)&#xff1a;439 標注數量(txt文件個數)&#xff1a;439 標注類別…

mysql怎么部署雙機

MySQL的雙機部署是為了實現數據的高可用性和容錯性。以下是MySQL雙機熱備部署的基本步驟&#xff0c;我會盡量清晰地分點表示和歸納&#xff1a; 1. 環境準備 安裝MySQL&#xff1a;在兩臺服務器上分別安裝MySQL數據庫。確保版本兼容。 網絡配置&#xff1a;確保兩臺服務器之…

題目:判斷一個素數能被幾個9整除

題目&#xff1a;判斷一個素數能被幾個9整除 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should …