【C#】并行编程实战:实现数据并行(2)

news2024/11/24 22:58:20

        本章继续学习实现数据并行,本文主要介绍任务并行度和自定义分区策略相关内容。

        本教程对应学习工程:魔术师Dix / HandsOnParallelProgramming · GitCode        


2、任务并行度

        数据并行设计在系统的多个内核上以并行方式运行循环所带来的的优势,可以有效利用可用的 CPU 资源。我们可以使用另一个重要概念来控制循环中创建多少个任务:即 并行度(Degress of Parallelism)。

        并行度(Degress of Parallelism)

        整数,指定并行循环可以创建的最大任务数。默认值为64 。

        下面用示例来演示:

        private void RunByMaxDegreedOfParallelism()
        {
            int length = 10;
            var L = TestFunction.GetTestList(length);
            var options = new ParallelOptions { MaxDegreeOfParallelism = 2 };
            var result = Parallel.For(0, length, options, (i, state) =>
            {
                Debug.Log($"Log [{i}] => {L[i]} : In Task : {Task.CurrentId}");
            });
            Debug.Log($"ParallelFor Result : {result.IsCompleted} | {result.LowestBreakIteration}");
        }

        当我们把最大并行度设置为2时,打印结果如下:

 

        可见分成了2个任务执行,且非常有规律:Task 1 打印 0 ~ 4,Task 2 打印 5 ~ 9。同一个任务内都是顺序执行的,明显看得出来是分了2个任务。如果把最大并行度设置为1,结果如下: 

        看得出来在一个 Task 里顺序执行了。

        对于某些高级应用场景中,正在运行的算法不能跨越一定数量的处理器,需要限制每个算法只使用一定数量的处理器,就应修改此设置。

3、在并行循环中创建自定义分区策略

        分区(Partitionning)是数据并行中的另一个重要概念。为了在源集合中实现并行性,需要将其划分为较小的部分,成为范围(Range)或块(Chunk),这些部分可以由不同的线程同时访问。如果不进行分区,则循环将以串行方式执行。

        分区程序可以分为以下两类(也可以创建自定义分区程序):

  • 范围分区

  • 块分区

PLINQ 和 TPL 的自定义分区程序 | Microsoft Learn详细了解:PLINQ 和 TPL 的自定义分区程序icon-default.png?t=N5K3https://learn.microsoft.com/zh-cn/dotnet/standard/parallel-programming/custom-partitioners-for-plinq-and-tpl

3.1、范围分区

  • 主要适用于事先已知长度的集合。

  • 每个线程都有一个要处理的元素范围或源集合的开始和结束索引。

  • 创建范围时会损失一些性能,但没有同步开销。

如何:加快小型循环体的速度 | Microsoft Learn了解详情:如何:加速小循环体icon-default.png?t=N5K3https://learn.microsoft.com/zh-cn/dotnet/standard/parallel-programming/how-to-speed-up-small-loop-bodies?source=recommendations

3.2、块分区

        使用块分区时,每个线程都会拾取一个元素块,对其进行处理,然后返回以拾取另一个尚未被其他线程拾取的元素。

  • 主要用于链表(LinkedList)一类的集合,这些长度事先未知。

  • 可提供更好的负载平衡功能,以防集合不均衡。

  • 块大小取决于分区程序的实现,且存在同步开销(需要确保分配给两个线程的块不包含重复项)。

        /// <summary>
        /// 使用块分区进行并行
        /// </summary>
        private void RunByChunkPartitioning()
        {
            int length = 10;
            OrderablePartitioner<Tuple<int, int>> orderablePartitioner = Partitioner.Create(0, length);

            var result = Parallel.ForEach(orderablePartitioner, (range, state) =>
            {
                var startIndex = range.Item1;
                var endIndex = range.Item2;
                Debug.Log($"{Task.CurrentId} 分区:{startIndex} ~ {endIndex}");
            });
            Debug.Log($"Parallel.ForEach Result : {result.IsCompleted} | {result.LowestBreakIteration}");
        }

        分区结果如下:

         Partitioner.Create 的介绍参考以下文档,他会自动创建一个分区程序,传入分区下限和上限。

Partitioner.Create 方法 (System.Collections.Concurrent) | Microsoft Learn创建分区程序。 icon-default.png?t=N5K3https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent.partitioner.create?view=netstandard-2.1


        (未完待续)

        本教程对应学习工程:魔术师Dix / HandsOnParallelProgramming · GitCode        

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

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

相关文章

嵌入式系统:连接物理世界与数字世界的桥梁

目录 导语&#xff1a; 一. 什么是嵌入式系统&#xff1f; 二. 嵌入式系统的应用领域 三. 嵌入式系统的未来发展趋势 导语&#xff1a; 在当今数字时代&#xff0c;我们离不开各类智能设备的便利&#xff0c;它们在我们的生活中起着至关重要的作用。而这些设备中的关键技术…

基于Java+Swing+Mysql项目信息管理系统

基于JavaSwingMysql项目信息管理系统 一、系统介绍二、功能展示1.主页2.新增项目信息3.删除项目信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看项目列表、新增项目信息、删除项目信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示…

2023-最新-发布java工具包到 maven 中央仓库,不踩坑

说明 要想将自己的java工具提交到maven中央仓库并公开&#xff0c;但是maven中央仓库是不允许我们直接上传jar包到它上面的&#xff0c;因此我们只能将jar包发布到它指定的第三方maven仓库&#xff0c;然后这个仓库再将jar包同步到中央仓库。而sonatype的OSSRH仓库就是被认可的…

C++ day42

1、思维导图 2、 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person(int age,int num){this->age age;this->pnew int(num);}//拷贝构造函数Person(Person …

MKS SERVO4257D 闭环步进电机_系列11 STM32_脉冲和串口例程

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…

【java】线程池简介

线程池简介 一、什么是线程池 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。 二、线…

通过zOffice SDK实现灵活的数据统计

我们通过zOffice收集的业务数据&#xff0c;如何进行分析统计呢&#xff1f;或许我们会想到数据透视表或者筛选的方式&#xff0c;这当然可以&#xff0c;但是在某些场景下&#xff0c;通过透视表统计有一定的难度&#xff0c;不够灵活&#xff0c;而zOffice SDK给我们提供了丰…

使用autossh实现内网穿刺

前言 需要在客户公司部署一套系统&#xff0c;要求是能公网访问&#xff0c;但是客户那边没有公网IP。所以打算打算使用autossh实现内网穿刺。 准备 硬件&#xff1a; 我需要一台有独立ip的公网服务器82.82.82.82&#xff08;充当穿刺服务器&#xff09;&#xff0c;一台能…

EasyExcel时间处理时的bug,希望阿里不要不识好歹,尽快修复这个bug。

一、情况描述 我使用阿里的EasyExcel进行数据导入&#xff0c;但是我发现它录入的时间和表格上的数据不一样。Excel中录入的时间是7:30:00和21:20:00&#xff0c;但是实际读取的数据是7:30:00 上午&#xff0c;9&#xff1a;20&#xff1a;00 下午&#xff0c;导致我数据录入失…

【脚本工具】Python在MySQL批量造测试数据

测试过程中经常需要批量造一批数据&#xff0c;主要通过fake库来造测试数据&#xff0c;支持多国语言&#xff0c;注意使用的时候&#xff0c;各国具体情况 一、安装Faker 1、官方下载安装&#xff1a; URL&#xff1a;https://pypi.org/project/Faker/ 2、通过pip命令安装 …

5、Mysql事务原理

一、概述 事务&#xff1a;一组操作要么全部成功&#xff0c;要么全部失败&#xff0c;目的是为了保证数据最终的一致性。 数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可…

群辉助手Synology Assistant使用教程

下载 百度网盘链接直接下载即可 链接&#xff1a;https://pan.baidu.com/s/1XlQEcTCqBTsOgp-761jdOg?pwd5vyf 提取码&#xff1a;5vyf --来自百度网盘超级会员V5的分享 安装 直接双击安装&#xff0c;等待安装完成 能搜索到上图应用说明安装成功 使用 点击搜索按钮&…

浅谈餐饮业油烟在线监控系统的设计与研究

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;现阶段餐饮行业发展十分迅速&#xff0c;为了更好地提升餐饮油烟的监控力度&#xff0c;强化餐饮业油烟在线监控系统的设计成为重中之重。油烟在线监控系统的强化可以降低油烟的排放量&#xff0c;同时在排烟的…

【赠书】算力经济概念提出者的倾力之作,深刻诠释超级计算的未来!

目录 1.内容简介2.读者受众3.图书目录 如果说蒸汽机是工业革命的引擎&#xff0c;发电机是电气时代的引擎&#xff0c;那么计算机就是数字信息时代的引擎&#xff0c;而超级计算机是引领科学计算创新、攀登新高峰的引擎。 现在&#xff0c;公有云的发展如火如荼&#xff0c;云…

八、云尚办公系统-管理端-审批设置

云尚办公系统&#xff1a;管理端-审批设置 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;…

Android处理内存泄漏

么是内存泄漏&#xff1a; 在Android开发过程中&#xff0c;当一个对象已经不需要再使用了&#xff0c;本该被回收时&#xff0c;而另个正在使用的对象持有它引用从而导致它不能被回收&#xff0c;这就导致本该被回收的对象不能被回收而停留在堆内存中&#xff0c;内存泄漏就产…

STM32外设系列—HC-05(蓝牙)

文章目录 一、蓝牙简介二、使用方法2.1 接线2.2 AT指令 三、蓝牙APP四、实战项目4.1 添加文件4.2 配置需要传递的参数4.3 获取返回值4.4 发送光照强度4.5 控制程序4.6 手机端页面设计4.6.1 新建调试工程4.6.2 设置通信变量4.6.3 编辑控件4.6.4 添加LED控制开关4.6.5 添加光照强…

Vue 时间转换

文章目录 将秒转换成简单时间格式方式一 表格渲染方式二 js转换 将时间转换为字符串方式一 年、月、日、时、分、秒、星期等信息方式二 返回多久之前的时间 将秒转换成简单时间格式 方式一 表格渲染 element-ui 表格为例&#xff0c;duration 单位为秒 <el-table-column …

Openresty原理概念篇(十一) 为什么要避免使用 NYI?

一 JIT编译器的死穴&#xff1a;为什么要避免使用 NYI ? ① 问题引入 1) 那么到底有哪些操作可以被 JIT,哪些不能呢?2) 怎样才可以避免写出不能被 JIT 的代码呢? ② 上节回顾 ③ 什么是 NYI&#xff1f; NYI函数 NYI完整的列表 ④ NYI列表中string库函数 说明&am…

sonarqube安装以及jenkins集成sonarqube

一、sonarqube安装 docker方式安装sonarqube docker 方式安装是最简便的&#xff0c;我选择了这个安装方式 1、下载镜像 docker pull postgres:latest docker pull sonarqube2、 创建挂载目录 #用于postgres的挂载目录 mkdir -p /opt/postgres/postgresql mkdir -p /opt/po…