精华内容
参与话题
问答
  • C#并行编程-Task

    千次阅读 2016-10-22 17:39:08
    C#并行编程-Task 菜鸟学习并行编程,参考《C#并行编程高级教程.PDF》,如有错误,欢迎指正。 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步...
    展开全文
  • 并行计算

    2017-05-07 20:06:50
    维基百科: ...并行计算(英语:parallel computing)一般是指许多指令得以同时进行的计算模式。在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式...相对于串行计算,并行计算可以划分成时间并行和空间

    维基百科:
    https://zh.wikipedia.org/wiki/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97

    1.概念
    并行计算(英语:parallel computing)一般是指许多指令得以同时进行的计算模式。在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决[1]。

    2.基本体系结构
    相对于串行计算,并行计算可以划分成时间并行空间并行。时间并行即流水线技术,空间并行使用多个处理器执行并发计算,当前研究的主要是空间的并行问题
    以程序和算法设计人员的角度看,并行计算又可分为数据并行任务并行。数据并行把大的任务化解成若干个相同的子任务,处理起来比任务并行简单。

    展开全文
  • 并行网关

    千次阅读 2020-06-24 20:52:22
    并行网关在实际运用中的重要性,本文通过一个做饭的例子形象说明,这也是工作流引擎、工作流系统中比较重要的环节。

    1、并行网关

    假设现在我们想在旁边放一份沙拉。无论如何,如果你想要沙拉,你可以像我们在图1.1中所做的那样建模。

    图1.1:准备沙拉和主菜。

    在这里,我们介绍了另一个符号:(文本)注释;这是一个您可以与任何流对象(在本例中是任务)关联的工件。你可以输入任何文本;在我们的示例中,我们输入了执行相关任务的平均时间。任务时间的总和等于流程的运行时间,意大利面的运行时间为48分钟,牛排的运行时间为43分钟。祝贺您:您已经基于关键数据分析了您的第一个流程!

    不过,这意味着要等23分钟甚至28分钟才能开始吃东西。难以忍受的!你真的很饿,但你能做什么?也许你不会先准备沙拉,然后再做意大利面或牛排,但你会同时做这两件事——同时做。适当的符号是并行网关,或简称和网关,如图1.2所示。

    图1.2:同时准备沙拉和主菜。

    将任务画成并行并不意味着必须同时处理。与图1.1所示的示例相反,在开始其他任务之前也不是必须准备沙拉。然而,并行准备确实使我们的总时间减少了10分钟。使任务尽可能并行化是经典的流程优化。

    如示例所示,该进程不仅是并行的(它使用了and split),而且路径稍后还会同步(an and merge)。原因很容易理解:你只能在主菜和配菜都准备好之后才能开始吃。

    令牌的概念如何应用于此流程的实例?令牌在开始事件时产生,它运行choose recipe任务,然后插入and split。每个路径都从网关中出现一个令牌。这意味着在本例中有两个令牌:第一个令牌进入xor分割,其传出路径取决于所选的菜谱。

    假设我们想做意大利面。令牌进入任务并停留15分钟。同时,第二个令牌进入第二个,准备沙拉任务,它只停留10分钟。10分钟后,它移到合并处。传入路径的数量决定了网关正在等待的相关令牌的数量,因此在这里,它等待相同流程实例的两个令牌。

    在我们的场景中,第二个令牌在10分钟后到达and merge,而第一个令牌在cook pasta中总共停留了15分钟。这意味着and合并将等待到第一个令牌到达—额外的5分钟。此时,令牌愉快地合并为单个令牌,该令牌将继续沿着传出路径运行。

    这听起来是不是太抽象或太专业了?它不是,这和你自己的做法是一样的:沙拉准备好了,但意大利面还没有,所以你等着。当意大利面最终做好时,你就可以吃了。

    那么,为什么使用这个看似复杂的符号概念呢?例如,每年信用机构创建9000万个流程实例,这些并不是按照严格的顺序执行的,他们有重叠,为了每天正确地定义和执行这种复杂的流程及其各种并行操作、分支、合并和同步,令牌方法就对对概念设计和实现是非常有帮助,而且非常必要。我们希望到目前为止,流程实例与令牌并不完全相同:许多令牌可以在单个流程实例的范围内运行。

    用下面的问题检查你的理解:

    问题:图1.3显示了相同的过程,但是由于缺少空间,省略了and merge,并且从prepare沙拉任务的路径直接通向xor合并。如果我们实例化这个过程,并决定支持意大利面,会发生什么?

    图1.3:在这个过程中发生了什么?

    答:在and分割时生成令牌,然后像往常一样进行克隆。当我们完成准备沙拉,令牌通过xor合并和吃饭执行,五分钟后,意大利面也做好了,它的令牌通过xor合并,并再次执行!这不是我们想要的行为。

    问题:图1.4显示了一个只包含两个任务的流程。实例化后,流程实例存活多久?

    图1.4:流程实例存在多长时间?

    答:它存在45天,这与进程的运行时间相对应。即使在and split中生成的令牌在30天后通过task 1,然后被上端事件使用,第二个令牌仍然在task 2中驻留15天,流程实例继续存在,直到低端事件使用第二个令牌为止。

    注意:只要流程中有一个令牌存在,流程实例就存在!在使用所有生成的令牌之前,该实例无法完成。

     


    本文会持续更新,欢迎关注,技术支持:盘古BPM 

    展开全文
  • 并行Linq

    千次阅读 2020-04-15 08:57:57
    并行LINQ 并行查询 .NET4在System.Linq名称空间中包含一个新类ParalleIEnumerable ,可以分解查询的工作使其分布在多个线程上。尽管Enmerable类给IEnunerable<T>接口定义了扩展方法,但 ParalleIEnumerable 类...
    • 并行LINQ
    1. 并行查询

    .NET4在System.Linq名称空间中包含一个新类ParalleIEnumerable ,可以分解查询的工作使其分布在多个线程上。尽管Enmerable类给IEnunerable<T>接口定义了扩展方法,但

    ParalleIEnumerable 类的大多数扩展方法是ParallelQuery<TSource>类的扩展。一个重要的例外是AsParallel()方法,它扩展了IEnumerable<TSource>接口,返回ParallelQuery<TSource>类,所以正常的集合类可以以平行方式查询。

    例:

        const int arraySize = 100000000;

                var data = new int[arraySize];

                var r = new Random();

                for (int i = 0; i < arraySize; i++)

                {

                    data[i] = r.Next(40);

                }

        现在可以使用LINQ查询筛选数据,获取筛选数据的总和。该查询用where子句定义了一个筛选器,仅会中对应值小于20的项,接着调用聚合函数Sum()方法 。与前面的LINQ查询的唯一区别是,这次调用了AsParallel()方法。

        var sum = (from x in data.AsParallel()

                                       where x < 20

                                       select x).Sum();

    与前面的LINQ查询一样,编译器会修改语法,以调用AsParallel()、Where()、Select()和Sum()方法。AsParallel()方法用ParallelEnumerable类定义,以扩展IEnumerable<T>接口,所以对简单的数据调用它。AsParallel()方法返回ParallelQuery<TSource>。因为返回的类型,所以编译器选择的Where()方法是ParallelEnumerable.Where(),而不是Enumerable.Where()。在下面的代码中Select()和Sum()方法也来自ParallelEnumerable类。与Enumerable类的实现代码相反,对于ParallelEnumerable类,查询是分区的,以便多个线程可以同时处理该查询。数组可以分为多个部分,其中每个部分由不同的线程处理,以筛选其余项。完成分区的工作后,就需要合并,获得所有部分的总和。

            var sum=data.AsParallel().Where(x=>x<20).Select(x=>x).Sum();

        运行这行代码就会启动任务管理器,这样就可以看出系统的所有CPU都在忙碌。如果删除AsParallel()方法,就不可能使用多个CPU。当然,如果系统上没有多个CPU,就不会看到并行版本带来改进。

    1. 分区器

    AsParallel()方法不仅扩展了IEnumerable<T>接口,还扩展了Partition类。通过它,可以影响要创建的分区。

        Partitioner类用System.Collection.Concurrent命名空间定义,并且有不同变体。Create方法接受实现了IList<T>类的数组或对象。根据这一点,以及类型的参数loadBalance和该方法的一些重载版本,会返回一个不同的Partitioner类型。对于数组,.Net4包含派生自抽象基类OrderablePartitioner<TSource>的DynamicPartitionerForArray<TSource>类和StaticPartitionerForArray<TSource>类。

    var q1 = (from x in Partitioner.Create(data).AsParallel()

                          where x < 20

                         select x).Sum();

     也可以调用WithExecutionMode()和WithDegreeOfParallelism()方法可以传递ParallelExecutionMode的一个Default值或者ForceParallelism值。默认情况下,并行LINQ避免使用系统开销很高的并行机制。对于WithDegreeOfParallelism()方法,可以传递一个整数值,以指定并行运行的最大任务数。

    例:

      const int arraySize = 100000000;

                var data = new int[arraySize];

                var r = new Random();

                for (int i = 0; i < arraySize; i++)

                {

                    data[i] = r.Next(40);

                }

                Stopwatch watch = new Stopwatch();

                watch.Start();

                //一种写法,没有添加动态负载均衡,执行完所需要的时间1300毫秒

                var q1 = (from x in Partitioner.Create(data).AsParallel()

                          where x < 80

                         select x).Sum();

            //第二种写法,添加了动态负载均衡,执行完所需要的时间为660毫秒。

    var q1 = (from x in Partitioner.Create(data,true).AsParallel()

                          where x < 80

                         select x).Sum();

                watch.Stop();

                Console.WriteLine(watch.ElapsedMilliseconds.ToString());

    1. 取消

    .Net提供了一种标准方式,来取消长时间运行的任务,这也适用于并行LINQ。要取消长时间的查询,可以给查询添加WithCancellation()方法,并传递一个CancellationToken令牌作为参数。CancellationToken令牌从CancellationTokenSource类中创建。该查询在单独的线程中运行,在该线程中,捕获一个OperationCancelException类型的异常。如果取消了查询,就触发这个异常。在主线程中,调用CancellationTokenSource类的Cancel()方法可以取消任务。

      const int arraySize = 100000000;

                var data = new int[arraySize];

                var r = new Random();

                for (int i = 0; i < arraySize; i++)

                {

                    data[i] = r.Next(40);

                }

                var cts = new CancellationTokenSource();

                new Thread(() =>

                    {

                        try

                        {

                            var sum = (from x in data.AsParallel().WithCancellation(cts.Token)

                                       where x < 80

                                       select x).Sum();

                            Console.WriteLine("query finished, sum: {0}", sum);

                        }

                        catch (OperationCanceledException ex)

                        {

                            Console.WriteLine(ex.Message);

                        }

                    }).Start();

                Console.WriteLine("query started");

                Console.Write("cancel? ");

                int input = Console.Read();

                if (input == 'Y' || input == 'y')

                {

                    // cancel!

                    cts.Cancel();

                   }

     

    展开全文
  • 并行和并发的区别

    千次阅读 多人点赞 2019-05-13 09:40:22
    并行和并发有什么区别? 并行(parallelism),是同一时刻,两个线程都在执行。 并发(concurrency),是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。 并行 并发 【Java面试题与答案...
  • 问题:exe应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。 原因查找: 1)开始→所有程序→附件→右键命令提示符→以管理员身份运行 ...
  • 任务并行VS数据并行

    2019-09-29 05:34:03
    并行计算中,有两种并行的方法:任务并行(task-parallelism)和数据并行(data-parallelism)。 任务并行:将许多可以解决问题的任务分割,然后分布在一个或者多个核上进行程序的执行。 数据并行:将可以解决问题...
  • 并行软件 在运行共享内存系统时,会启动一个单独的进程,然后派生(fork)出多个线程,所以当我们谈论共享内存程序时,我们指的是正在执行任务的线程。 需要在进程、线程之间平均分配的任务从而满足使得每个进程/...
  • C#并行编程(1):理解并行

    万次阅读 2019-04-13 08:41:12
    C#并行编程(1):理解并行 什么是并行 并行是指两个或者多个事件在同一时刻发生。 在程序运行中,并行指多个CPU核心同时执行不同的任务;对于单核心CPU,严格来说是没有程序并行的。并行是为了提高任务执行效率...
  • C#并行编程(3):并行循环

    万次阅读 2019-04-13 08:43:57
    C#并行编程(3):并行循环 初识并行循环 并行循环主要用来处理数据并行的,如,同时对数组或列表中的多个数据执行相同的操作。 在C#编程中,我们使用并行类System.Threading.Tasks.Parallel提供的静态方法...
  • 并行or串行

    2019-01-15 08:30:41
    记得在很小的时候,就读过一个著名的烧水泡茶的例子,例子的细节自己记不太清楚了,但这个例子的结论,就是做事情时应该尽可能的让能并行的事情并行进行,这样以提高工作效率。 然而,到真正参加工作之后,特别是...
  • 吃个快餐都能学到串行、并行、并发

    千次阅读 多人点赞 2019-07-10 08:22:45
    Java 多线程系列文章第 3 篇
  • 并行计算及并行算法

    万次阅读 多人点赞 2018-06-13 22:27:31
    一、并行计算  简单地说,并行计算就是在并行计算机上所做的计算。从普通意义上讲,它和常说的高性能计算、超级计算等是同义词。并行计算的初衷是为了努力仿真自然世界中一个序列中含有众多同时发生的、复杂且相关...
  • 并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案。 1、执行sql:select /*+ parallel(a,4) */ * from tf_f_user a where ...
  • 2.3 tensorflow单机多GPU并行

    万次阅读 热门讨论 2019-06-30 14:30:40
    现在很多服务器配置都是单机上配有多个GPU卡。tensorflow默认占用全部的gpu的显存,但是只在第一块GPU上进行计算,这样对于显卡的利用率不高。 1. 指定运行GPU,不占用其他gpu的显存。 import os ...
  • spark 并行

    千次阅读 2018-07-30 21:47:49
    1.1、指定并行的task数量 spark.default.parallelism 参数说明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。 参数调优建议:Spark作业的默认task...
  • 增加并行测试的好处

    万次阅读 2020-08-17 10:08:00
    快速质量是大多数CIO的新口头禅。作为响应,Development Operations已经发展了其软件生命周期-变得更加敏捷和更具可扩展性,同时试图提供完美的体验。作为响应,公司不断向...
  • 并行排序

    千次阅读 2019-04-20 14:05:34
    并行排序算法是计算机并行计算能力大大发展之后,为了提高排序效率而提出的算法。 原有的的排序算法都是给定了数据再进行排序,排序的效率很大程度上取决于数据的好坏,例如快速排序、归并排序。并行排序则是一类...
  • 并行算法

    千次阅读 2019-04-23 19:22:44
    并行算法就是用多台处理机联合求解问题的方法和步骤,其运行过程是将给定的问题首先分解成若干个尽量相互独立的子问题,然后使用多台计算机同时求解他,从而最终求得原问题的解。 1.并行算法设计 并行算法设计...

空空如也

1 2 3 4 5 ... 20
收藏数 100,820
精华内容 40,328
关键字:

并行