精华内容
下载资源
问答
  • 并发计算和并行计算区别
    千次阅读
    2017-01-21 14:07:14

    关于CUDA并行计算的所有博客,我已迁移至segmentfault社区-CUDA编程专栏,这里是本文的链接:https://segmentfault.com/a/1190000008186637

    写在前面

    上一篇文章中,我们学习了如何在CUDA中隐藏数据传输,而其中用到的主要技术就是并发计算。这时你可能会问,这个专栏不是CUDA并行计算吗?怎么又说什么并发计算呢?其实,这里所说的“CUDA并行计算”并不是纯粹的并行计算,而是并行计算与并发计算相结合的一种技术。那么这两者的区别又是什么呢?我觉得是时候讲一下两者的区别与联系了,否则会对之后的学习产生误导。

    区别

    我在网上看到很多讲并发计算与并行计算区别的文章,感觉很多讲得不是很抽象就是不全面,因此我决定自己好好总结一下。闲话少说,先看一张图。

    methods

    仔细看一下这张图,先有个大概印象再继续往下读。

    loading … …

    看完上面的图之后,这是我总结的几点:

    • 并发计算可以基于单处理器或者多处理器,基于单处理器时多个任务分时执行,轮流使用处理器;并行计算必须基于多处理器,多个任务同时使用多个处理器
    • 并发计算可以同时执行多个不同的任务;并行计算一般是同时执行多个相同的任务

    NOTE:为了更好地比较并行与并发计算,我加入了串行计算。

    • 从专注程度上来看,三者的排名如下:

    串行计算->并行计算->并发计算

    串行计算最老实也最死板,任何时候只做一件事,雷打不动,这件完成才能做下一件事;并行计算相比就没有那么专注了,它可以同时做多个相同的事情;并发计算就更没有那么专注了,它可以同时做多个不同的事情。

    联系

    并行计算与并发计算关系密切。我们在操作系统课程中所学到的并发大多是基于单处理器的,进程交替执行,表现出一种同时执行的外部特征。这种并发计算无法实现真正的加速效果。

    并行计算(纯粹的)通常是将一个较大的问题分为较小的多个子问题,然后同时处理这些子问题,类似于算法中的分治法。这种执行方式虽然可以获得较好的加速效果,但是还可以获得更好的加速效果。

    在基于多核的计算中,常常将并发计算与并行计算相结合,这样可以获得比并行计算更好的加速效果。在专栏的上一篇文章中,我们应用的就是这个技术。

    combine

    总结

    这篇文章主要介绍了并行计算与并发计算的区别与联系。如果要深入地学习并发计算,可以参考操作系统的相关书籍,比如比较经典的《操作系统精髓与设计原理》。在掌握了二者的区别与联系之后,我们会继续学习CUDA并行计算。

    参考资料

    1. 维基百科-Concurrent_computing
    2. 维基百科-Parallel_computing
    3. 操作系统精髓与设计原理 第六版, [美]William Stallings, 机械工业出版社
    更多相关内容
  • 云计算-并发系统的并行计算及性能分析.pdf
  • 并行计算或称平行计算是相对于串行计算来说的。所谓并行计算可分为时间上的并行空间上的并行。 时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。
  • 目录并发与并行的区别总结 并发与并行的区别 并发(concurrency)是说进程B的开始时间是在进程A的...Parallel Computing:并行计算 Concurrent programming:并发编程 再引用一张图Erlang 之父 Joe Armstrong画

    并发与并行的区别

    • 并发(concurrency)是说进程B的开始时间是在进程A的开始时间与结束时间之间,我们就说A和B是并发的。
    • 并行(parallelise)是并发的真子集,指同一时间两个进程运行在不同的机器上或者同一个机器不同核心上。

    在这里插入图片描述
    这里还要说明一下。

    并发和并行是相关的,但是是两个不同的概念

    • Parallel Computing:并行计算

    • Concurrent programming:并发编程

    再引用一张图Erlang 之父 Joe Armstrong画的图如下。

    在这里插入图片描述

    我画的如下。
    在这里插入图片描述

    只有一个咖啡机的时候,一台咖啡机其实是在并发被使用的。而有多个咖啡机的时候,多个咖啡机之间才是并行被使用的。

    • 并发,指的是多个事情,在同一时间段内同时发生了。
    • 并行,指的是多个事情,在同一时间点上同时发生了。
    • 并发的多个任务之间是互相抢占资源的。
    • 并行的多个任务之间是不互相抢占资源的、只有在多CPU的情况中,才会发生并行。
    • 否则,看似同时发生的事情,其实都是并发执行的。

    总结

    • 并发(concurrency)同时间(某段)
    • 并行(parallelise)同时刻(某点)

    并发和并行是相关的,但是是不同概念的。







    参考地址:漫小话

    展开全文
  • 并发和并行区别(图解)

    千次阅读 2022-04-18 18:01:02
    在学习多线程/进程编程时,我们经常会遇到并发和并行这两个名词,它们看起来是一个概念,都是“多个线程/进程同时执行”的意思,但实际上它们是有区别的,甚至说不是一码事。 很多教材也都解释了并发和并行区别,...

    在学习多线程/进程编程时,我们经常会遇到并发和并行这两个名词,它们看起来是一个概念,都是“多个线程/进程同时执行”的意思,但实际上它们是有区别的,甚至说不是一码事。

    很多教材也都解释了并发和并行的区别,例如:

    • 并行是指两个或者多个事件在同一时刻发生,而并发是指两个或多个事件在同一时间间隔发生。
    • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

    不过这种解释非常晦涩难懂,估计只有作者自己才能搞明白。这篇文章,我将站在一个大龄程序员的视角,使用通俗易懂的语言来重新剖析并发和并行的区别,并配上优雅的图片,以加深读者的理解。

    并发(Concurrency)

    早期计算机的 CPU 都是单核的,一个 CPU 在同一时间只能执行一个进程/线程,当系统中有多个进程/线程等待执行时,CPU 只能执行完一个再执行下一个。

    为了表述简单,下文我们将不再区分进程和线程,而将它们统一称为“任务”。在不同的场景下,一个任务可能是进程,也可能是线程。

    计算机在运行过程中,有很多指令会涉及 I/O 操作,而 I/O 操作又是相当耗时的,速度远远低于 CPU,这导致 CPU 经常处于空闲状态,只能等待 I/O 操作完成后才能继续执行后面的指令。

    为了提高 CPU 利用率,减少等待时间,人们提出了一种 CPU 并发工作的理论。

    所谓并发,就是通过一种算法将 CPU 资源合理地分配给多个任务,当一个任务执行 I/O 操作时,CPU 可以转而执行其它的任务,等到 I/O 操作完成以后,或者新的任务遇到 I/O 操作时,CPU 再回到原来的任务继续执行。

    下图展示了两个任务并发执行的过程:
    在这里插入图片描述

    图1:单核 CPU 执行两个任务

    虽然 CPU 在同一时刻只能执行一个任务,但是通过将 CPU 的使用权在恰当的时机分配给不同的任务,使得多个任务在视觉上看起来是一起执行的。CPU 的执行速度极快,多任务切换的时间也极短,用户根本感受不到,所以并发执行看起来才跟真的一样。

    操作系统负责将有限的 CPU 资源分配给不同的任务,但是不同操作系统的分配方式不太一样,常见的有:

    • 当检测到正在执行的任务进行 I/O 操作时,就将 CPU 资源分配给其它任务。
    • 将 CPU 时间平均分配给各个任务,每个任务都可以获得 CPU 的使用权。 在给定的时间内,即使任务没有执行完成,也要将 CPU 资源分配给其它任务,该任务需要等待下次分配 CPU 使用权后再继续执行。

    将 CPU 资源合理地分配给多个任务共同使用,有效避免了 CPU 被某个任务长期霸占的问题,极大地提升了 CPU 资源利用率。

    并行(Parallelism)

    并发是针对单核 CPU 提出的,而并行则是针对多核 CPU 提出的。和单核 CPU 不同,多核 CPU 真正实现了“同时执行多个任务”。

    多核 CPU 内部集成了多个计算核心(Core),每个核心相当于一个简单的 CPU,如果不计较细节,你可以认为给计算机安装了多个独立的 CPU。

    多核 CPU 的每个核心都可以独立地执行一个任务,而且多个核心之间不会相互干扰。在不同核心上执行的多个任务,是真正地同时运行,这种状态就叫做并行。

    例如,同样是执行两个任务,双核 CPU 的工作状态如下图所示:
    在这里插入图片描述

    图2:双核 CPU 执行两个任务

    双核 CPU 执行两个任务时,每个核心各自执行一个任务,和单核 CPU 在两个任务之间不断切换相比,它的执行效率更高。

    并发+并行

    在图2中,执行任务的数量恰好等于 CPU 核心的数量,是一种理想状态。但是在实际场景中,处于运行状态的任务是非常多的,尤其是电脑和手机,开机就几十个任务,而 CPU 往往只有 4 核、8 核或者 16 核,远低于任务的数量,这个时候就会同时存在并发和并行两种情况:所有核心都要并行工作,并且每个核心还要并发工作。

    例如一个双核 CPU 要执行四个任务,它的工作状态如下图所示:

    在这里插入图片描述

    每个核心并发执行两个任务,两个核心并行的话就能执行四个任务。当然也可以一个核心执行一个任务,另一个核心并发执行三个任务,这跟操作系统的分配方式,以及每个任务的工作状态有关系。

    总结

    并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力;并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力。

    单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。

    在多核 CPU 中,并发和并行一般都会同时存在,它们都是提高 CPU 处理任务能力的重要手段。

    展开全文
  • 假设有AB两个任务,则串行、并行并发区别如图1所示。 串行 AB两个任务运行在一个CPU线程上,在A任务执行完之前不可以执行B。即,在整个程序的运行过程中,仅存在一个运行上下文,即一个调用栈一个堆。程序会...

    原文转自:从串行到并行,从并行到分布式

    1. 概念

    假设有AB两个任务,则串行、并行、并发的区别如图1所示。

    串行

    A和B两个任务运行在一个CPU线程上,在A任务执行完之前不可以执行B。即,在整个程序的运行过程中,仅存在一个运行上下文,即一个调用栈一个堆。程序会按顺序执行每个指令。

    并行

    并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。比如,A和B两个任务可以同时运行在不同的CPU线程上,效率较高,但受限于CPU线程数,如果任务数量超过了CPU线程数,那么每个线程上的任务仍然是顺序执行的。

    并发

    并发指多个线程在宏观(相对于较长的时间区间而言)上表现为同时执行,而实际上是轮流穿插着执行,并发的实质是一个物理CPU在若干道程序之间多路复用,其目的是提高有限物理资源的运行效率。 并发与并行串行并不是互斥的概念,如果是在一个CPU线程上启用并发,那么自然就还是串行的,而如果在多个线程上启用并发,那么程序的执行就可以是既并发又并行的。

    而分布式和并行的区别如下:

    分布式

    分布式在并行处理的基础上,强调任务正在执行的物理设备,如处理器、内存等等硬件,在物理上是分开的。而并行计算是指在一台计算机上的计算,在物理上不分开。

    2. 例子

    假设有A,B两个任务,任务A需要计算1-100000之间所有质数的和,任务B需要计算100001-200000之间所有质数的和

    则采用串行的方法设计的程序如下:

    public class Main {
        //判断是否为质数
        private static boolean isPrime(int n) {
            if(n < 2) return false;
            if(n == 2) return true;
            if(n%2==0) return false;
            for(int i = 3; i < n; i += 2)
                if(n%i == 0) return false;
            return true;
        }
        //串行计算
        private static void serial() {
            long time1 = System.currentTimeMillis(), time2,time3;
            long count = 0;
            for(int i=1;i<=100000;++i){
                if(isPrime(i)) count+=i;
            }
            time2=System.currentTimeMillis();
            System.out.println("1-100000之间质数和为"+count+" 耗时:"+(time2- time1) + "毫秒");
            count = 0;
            for(int i=100001;i<=200000;++i){
                if(isPrime(i))
                    count+=i;
            }
            time3 = System.currentTimeMillis();
            System.out.println("100001-200000之间质数和为"+count+" 耗时:"+(time3 - time2) + "毫秒");
            System.out.println("总耗时:"+ (time3 - time1) + "毫秒");
        }
        //主函数
        public static void main(String[] args) {
            serial();
        }
    }

    在串行计算的程序中,只有一个CPU线程,且该线程按顺序执行AB两个任务。程序运行结果如下:

    采用并发的方法设计的程序如下:

    public class Main{
        private static boolean isPrime(int n) {
            if(n < 2) return false;
            if(n == 2) return true;
            if(n%2==0) return false;
            for(int i = 3; i < n; i += 2)
                if(n%i == 0) return false;
            return true;
        }
        public static void main(String[] args) {
            serialConcurrency();
        }
        private static void serialConcurrency() {
            long time = System.currentTimeMillis();
            //任务切换标识,1代表A任务,2代表B任务
            int task = 1;
            //计数器
            long count1 = 0, count2 = 0;
            int i=1,j=100001;
            while (true)
            {
                if(task == 1 && i++<=100000) {
                    if(isPrime(i)) count1+=i;
                    task = 2;
                }
                else if(task == 2 && j++<=200000) {
                    if(isPrime(j)) count2+=j;
                    task = 1;
                }
                else{
                    break;
                }
            }
            System.out.println("1-100000之间质数和为"+count1);
            System.out.println("100001-200000之间质数和为"+count2);
            System.out.println("总耗时:"+(System.currentTimeMillis() - time) + "毫秒");
        }
    }

    在并发计算的程序中,同样只有一个CPU线程,但是该线程会在AB两个任务之间进行切换,可以发现,并发计算的总耗时反而大于串行计算,这是因为CPU在任务切换过程中需要消耗一定时间。程序运行结果如下:

    采用并行的方法设计的程序如下:

    public class Main {
        public static boolean isPrime(int n) {
            if(n < 2) return false;
            if(n == 2) return true;
            if(n%2==0) return false;
            for(int i = 3; i < n; i += 2)
                if(n%i == 0) return false;
            return true;
        }
        public static void main(String[] args) throws InterruptedException {
            long time1 = System.currentTimeMillis(),time2;
            Task task1 = new Task(1,100000);
            Task task2 = new Task(100001,200000);
            Thread thread1 = new Thread(task1);
            Thread thread2 = new Thread(task2);
            thread1.start();
            thread2.start();
            while (thread1.isAlive() || thread2.isAlive()){
                Thread.sleep(1);
            }
            time2 = System.currentTimeMillis();
            System.out.println("总耗时:"+(time2 - time1)+"毫秒");
        }
    }
    class Task implements Runnable{
        private int start;
        private int end;
        Task(int start, int end) {
            this.start = start;
            this.end = end;
        }
        public void run() {
            long time = System.currentTimeMillis();
            long count = 0;
            for(int i=start;i<=end;++i){
                if(Main.isPrime(i)) count+=i;
            }
            System.out.println(String.format("%d-%d之间质数和为%d,耗时:%d毫秒",start,end,count,(System.currentTimeMillis()- time)));
        }
    }

     

    在并行计算的程序中,AB任务各占用一个CPU线程,AB任务同时执行,总共耗费的时间约等于AB任务的最长耗时,程序运行结果如下:

    3.总结

    由上表可知并行的总耗时是最小的,效率最高(如果AB两个任务耗时更接近,则并行计算的效率将更高)。但由于并行计算受限于CPU线程数,当计算量超出单台计算机的计算能力时,人们就开始考虑使用多台计算机同时处理一个任务,分布式计算应用而生。分布式计算将任务分解成许多小的部分,分配给多台计算机进行处理,从而整体上节约了计算时间。Hadoop的MapReduce就是一种分布式计算框架,我们之后会对MapReduce进行详细的探讨。

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

    2022-04-05 08:51:43
    并发和并行的主要区别在于:1.处理任务不同;2.存在不同;3.CPU资源不同; 一、处理任务不同 并发(Concurrent) 并发是一个CPU处理器同时处理多个线程任务。(宏观上是同时处理多个任务,微观上其实是CPU在多个线程...
  • 并行和并发区别

    千次阅读 2021-04-13 10:42:02
    一、并发 1.概念 当有多个线程在操作时,如果系统...二、并行 1.概念 当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时
  • 多线程并发和并行区别

    万次阅读 2020-09-13 14:35:34
     那么并行和并发又有什么区别?究竟改如何选择?滥用时又会有什么影响?   这些问题我分以下几篇文章进行详细说明:   1. 多线程并发和并行区别   2. parallelStream()并行滥用的后果   3
  • 操作系统中并发和并行区别

    千次阅读 2022-01-24 20:14:01
    · 并行是指两个或者多个事件在同一时刻发生,而并发是指两个或者多个事件在同一时间间隔发生 · 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件 二、c语言站长公众号解释: 1、并发 早期计算机的...
  • 并行计算&并发计算

    千次阅读 2017-03-16 12:38:09
    1. 概念 ...Parallel computing(并行计算) is a type of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can of
  • 并发和并行

    千次阅读 2022-03-28 07:49:49
    并发和并行
  • 多进程 进程就是正在进行的一个程序或者任务,而负责执行任务的是CPU,执行任务的地方是内存。与程序相比,程序只是一堆代码而已,而程序运行时的过程才是进程;另外同一个程序执行两次就是两个...并行计算才是真...
  • java8并行计算示例

    2021-04-29 19:01:23
    采用java8的并行计算,完成1到400亿的数列求和,并行计算完成时间3秒左右,采用普通计算完成时间13秒左右,效果明显
  • 并行和并发哪个好?并行和并发的概念和区别

    千次阅读 多人点赞 2020-05-20 19:45:29
    摘要:并发并行是两个既相似而又不相同的概念:并发性,又称共行性,是指能处理多个同时性活动的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一...
  • 并行和并发区别与联系

    千次阅读 2022-04-23 20:43:26
    在学习多线程/进程编程时,我们经常会遇到并发和并行这两个名词,它们看起来是一个概念,都是“多个线程/进程同时执行”的意思,但实际上它们是有区别的,甚至说不是一码事。 很多教材也都解释了并发和并行区别,...
  • 云计算-基于并行计算的点阵结构双尺度并发优化设计.pdf
  • 面试必考的:并发和并行有什么区别

    千次阅读 多人点赞 2019-04-30 10:02:55
    本文公众号来源:漫话编程 作者:漫话编程并发和并行不知道你们在面试的时候有没有被问过,反正我之前是被问过的。在学习多线程的时候我也曾经解释过并行和并发区别:入门Java...
  • 并行计算并行计算是相对于串行计算来说的可分为时间上的并行空间上的并行?时间上的并行就是指流水线技术而空间上的并行则是指用多个处理器并发的执行计算并行计算的目的就是提供单处理器无法提供的性能处理器能力...
  • 并发和并行有什么区别

    千次阅读 2021-04-14 23:50:25
    本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构文献引用请见100个问题搞定Java并发 解答 并发是关于正确有效地控制对...
  • 测试并发执行效率的测试程序,通过修改参数可以观察任务数量、并行传输数据量、并行子任务计算量对整个并发提升效率的影响。
  • (2)并发:泛指多个任务被 “同时” 执行,这个 “同时” 可以是人类感觉上的 “同时”(即退化的伪并行),也可以是真正意义上的 “同时”(即真并行)。至于是 人类感觉上的“同时”(伪并行)还是真正的 “同时...
  • 并行计算、分布式计算、网格计算与云计算都属于高性能计算(High PerformanceComputing,HPC)的范畴,主要目的在于对大数据的分析与处理,但它们却存在很多差异。电子海图云服务是基于高性能计算的理论技术、通过对...
  • 详解并发和并行意义

    万次阅读 多人点赞 2017-12-20 10:28:52
    很多人不是特别明白并发编程和并行编程的区别所在,有很多人很容易搞混淆,觉得二者近似相等,本文将用几个浅显易懂的例子,来说明一下什么是并发和并行。 1、任务与多任务  关于什么是进程,什么是线程,这里不...
  • 并行计算(Parallel Computing)    并行计算或称平行计算是相对于串行计算来说的。并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程。为执行并行计算,计算资源应包括一台配有多处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,913
精华内容 63,565
热门标签
关键字:

并发计算和并行计算区别