一步一步写线程之十四并行编程和并行库

一、并行编程

多线程和多进程编程,在早期一般是并发编程,现在基本是并行编程的基础。或者干脆就叫并行编程也没有什么可纠结的。但实际上并发编程和并行编程还是有着很大的不同。在前面的“多核和多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.mzph.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 …