并行处理

深入浅出计算机组成原理:GPU(下)-为什么深度学习需要使用GPU?(第31讲)

柔情痞子 提交于 2019-11-28 17:47:39
一、引子 上一讲,我带你一起看了三维图形在计算机里的渲染过程。这个渲染过程,分成了顶点处理、图元处理、栅格化、片段处理,以及最后的像素操作。这一连串的过程, 也被称之为图形流水线或者渲染管线。 因为要实时计算渲染的像素特别地多,图形加速卡登上了历史的舞台。通过3dFx的Voodoo或者NVidia的TNT这样的图形加速卡, CPU就不需要再去处理一个个像素点的图元处理、栅格化和片段处理这些操作。而3D游戏也是从这个时代发展起来的。 你可以看这张图,这是“古墓丽影”游戏的多边形建模的变化。这个变化,则是从1996年到2016年,这20年来显卡的进步带来的。 二、Shader的诞生和可编程图形处理器 1、无论你的显卡有多快,如果CPU不行,3D画面一样还是不行 不知道你有没有发现,在Voodoo和TNT显卡的渲染管线里面,没有“顶点处理“这个步骤。在当时,把多边形的顶点进行线性变化,转化到我们的屏幕的坐标系的工作还是由CPU完成的。 所以,CPU的性能越好,能够支持的多边形也就越多,对应的多边形建模的效果自然也就越像真人。而3D游戏的多边形性能也受限 于我们CPU的性能。无论你的显卡有多快,如果CPU不行,3D画面一样还是不行。 2、1999年NVidia推出的GeForce 256显卡 所以,1999年NVidia推出的GeForce 256显卡,就把顶点处理的计算能力

Kafka集成SparkStreaming

有些话、适合烂在心里 提交于 2019-11-28 15:04:00
Spark Streaming + Kafka集成指南 Kafka项目在版本0.8和0.10之间引入了一个新的消费者API,因此有两个独立的相应Spark Streaming包可用。请选择正确的包, 请注意,0.8集成与后来的0.9和0.10代理兼容,但0.10集成与早期的代理不兼容。 注意:从Spark 2.3.0开始,不推荐使用Kafka 0.8支持。 Spark Streaming从Kafka接收数据,转换为spark streaming中的数据结构Dstream。数据接收方式有两种 :1 使用Receiver接收的旧方法:2使用Direct拉取的新方法(在Spark 1.3中引入)。 https://spark.apache.org/docs/1.6.3/streaming-kafka-integration.html https://spark.apache.org/docs/2.3.1/streaming-kafka-0-10-integration.html Receiver方式 Received是使用Kafka高级Consumer API实现的。与所有接收器一样,从Kafka通过Receiver接收的数据存储在Spark Executor的内存中,然后由Spark Streaming启动的job来处理数据。然而默认配置下,这种方式可能会因为底层的失败而丢失数据

进程和线程,并发和并行,同步和异步,高并发和多线程,理一理概念

你离开我真会死。 提交于 2019-11-28 07:08:14
1.1:线程和进程 根本区别: 进程是 操作系统资源 分配的基本单位,线程是 任务调度和执行 的基本单位 开销方面: 每个进程都有自己独立的代码和数据空间,程序之间的切换开销较大。 线程可以看作是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间开销小。 所处环境: 一个操作系统能同时运行多个进程(程序)。 在一个进程中,可以有多个线程同时执行。 内存分配方面: 系统在运行的时候会为每个进程分配不同的内存空间。 对线程而言,系统不会为线程分配内存(线程使用的资源,来自于其所属进程的资源),线程组之间只能共享资源。 包含关系: 没有线程的进程可以看作是单线程。一个进程可以包含多个线程 线程是进程的一部分 ,所以线程也称为轻量级进程 1.2:并发和并行 并发: 指应用能 交替执行 不同的任务,类似于多线程的原理。 并行: 指应用能够 同时执行 不同的任务 1.3:同步和异步 通常是用来形容一次方法调用。 同步: 必须等方法调用返回以后,才能继续调用 异步: 更像是一个消息的传递,调用者不必等待该方法的调用完成,可以继续执行后面相关的调用。 1.4:什么是高并发编程? 高并发,是指短时间内能同时并行处理很多请求和访问。 比如,12306抢票和淘宝双11活动。 想要系统能够适应高并发状态,则需要全面优化,包括:硬件、网络、系统架构、开发语言选取

并行程序

别说谁变了你拦得住时间么 提交于 2019-11-28 00:59:13
---恢复内容开始--- 一、大数据时代的现状 据统计,YouTube上每分钟就会增加500多小时的视频,面对如此海量的数据,如何高效的存储与处理它们就成了当前最大的挑战。 但在这个对硬件要求越来越高的时代,CPU却似乎并不这么给力了。自2013年以来,处理器频率的增长速度逐渐放缓了,目前CPU的频率主要分布在3~4GHz。实际上CPU与频率是于能耗密切相关的,我们之前可以通过加电压来提升频率,但当能耗太大,散热问题就无法解决了,所以频率就逐渐稳定下来了,而Intel与AMD等大制造商也将目标转向了多核芯片,目前普通桌面PC也达到了4~8核。 随着集成电路上的晶体管数据量越来越多,功耗的增加以及过热问题,使得在集成电路上增加更多的晶体管变得更加困难,摩尔定律所预言的指数增长必定放缓。因此,摩尔定律失效。 当前和未来五年,微处理器技术朝着多核方向发展,充分利用摩尔定律带来的芯片面积,放置多个微处理器内核,以及采用更加先进的技术降低功耗。 当然,多核并行计算不仅仅可以使用 CPU ,而且还可以使用 GPU (图形处理器),一个 GPU 有多大上千个核心,可以同时运行上千个线程。那怎么利用 GPU 做并行计算呢?可以使用英伟达的 CUDA 库。 什么时候用并行计算? 多核CPU——计算密集型任务: 尽量使用并行计算,可以提高任务执行效率。计算密集型任务会持续地将CPU占满

并发和并行的区别

狂风中的少年 提交于 2019-11-27 15:36:19
书本内容: 且参照原文 https://www.jianshu.com/p/cbf9588b2afb 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:并行是在一台处理器上“同时”处理多个任务,并发是在多台处理器上同时处理多个任务。如 hadoop 分布式集群。 所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。 当有多个线程在操作时,如果系统只有一个 CPU,则它根本不可能真正同时进行一个以上的线程,它只能把 CPU 运行时间划分成若干个时间段

并发与并行的区别

旧街凉风 提交于 2019-11-27 13:27:41
 很多人不是特别明白并发编程和并行编程的区别所在,有很多人很容易搞混淆,觉得二者近似相等,本文将用几个浅显易懂的例子,来说明一下什么是并发和并行。 1、任务与多任务 关于什么是进程,什么是线程,这里不打算多说,关于每一种开发语言的多线程处理技术语法上有所区别,原理很多类似,可以查阅相关的参考书。什么是任务呢?其实很简单,在我们生活中,比如我今天要学一首歌,要在操场上散步1000米,然后还要向老师电话汇报研究成果,这是今天的三个任务。在编程语言中,实现某一个任务的一般单元就是“函数”。 2、顺序执行 上面三个任务,如果在一般的单线程执行的程序里面,分别定义三个函数,然后依次顺序执行,即执行完第一个在执行第二个,然后执行第三个,即我先把一首歌学会,然后在操场上散步1000米,然后再给老师汇报,这样做效率低下。   我们可以有一个更加高效的办事方法,我在散步的时候,顺便打电话给老说汇报一下今天的成果,然后边散步边听歌,便跟着学,这样效果就高很多,这里的是“并行执行”。 3、并发和并行的一些理解——concurrency and parallellism 并发和并行都是完成多任务更加有效率的方式,但还是有一些区别的,并发(concurrency),并行(parallellism),可见他们的确是有区别的。下面通过一些具体的例子进行说明。   例子一:   假设一个有三个学生需要辅导作业

Java 8并行流的性能陷阱

我的梦境 提交于 2019-11-27 09:41:01
并行化流被分成多个块,每个块独立处理,结果在最后汇总。 CPU密集型代码如下: private long countPrimes(int max) { return range(1, max).parallel().filter(this::isPrime).count(); } private boolean isPrime(long n) { return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0); } countPrimes 计算1到最大值之间的素数的数量。数字流由range方法创建,切换到并行模式,过滤掉非素数,剩余的计算总数。由于isPrime 方法极其无效且占用大量CPU,我们可以利用并行化并利用所有可用的CPU内核。 我们来看另一个例子: private List<StockInfo> getStockInfo(Stream<String> symbols) { return symbols.parallel() .map(this::getStockInfo) //slow network operation .collect(toList()); } 输入是一个股票代码列表,我们必须调用慢速网络操作来获取有关股票的一些细节。在这里

并发,并行和高并发

浪尽此生 提交于 2019-11-27 03:47:41
1.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有一个CPU,把CPU运行时间划分成若干个时间段,分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。这种方式我们称之为并发(Concurrent)。 并发=间隔发生 并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 并行=同时进行 高并发是互联网分布式系统架构设计中必须考虑的因素之一,通常是指通过设计保证系统能够同时并行处理很多请求。 区别:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 2.高并发是短时间内大量访问和请求,例如 12306 抢票和 天猫 双11 活动,想系统能够适应高并发状态,则需要全面优化优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……而多线程只是其中解决方法之一。 1.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有一个CPU,把CPU运行时间划分成若干个时间段,分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。这种方式我们称之为并发(Concurrent)。 并发=间隔发生 并行:当系统有一个以上CPU时

并行思维 [III]

时间秒杀一切 提交于 2019-11-26 21:44:23
书接上回: 并行思维 [I] , 并行思维 [II] 线程是什么玩意 对于并行程序设计来说,线程的重要性不言而喻。 现代操作系统是典型的基于抢占式调度机制的多任务操作系统。 所谓多任务,指同一时刻,允许操作系统内有多个应用程序运行。比如,我们可以在同一时刻,一边收听音乐,一边浏览网页。当然,计算机能做到的远不止于此。 所谓抢占式调度机制,指在操作系统强制让另外的应用程序运行之前,正在运行的应用程序究竟可以占用 CPU 多少时间。这正是为什么我们感觉多个应用程序同时运行的真正原因,即使在单核处理器上。举例来说,Windows 操作系统任务调度的时间间隔大约在 20 毫秒左右(注:这个极短的时间,人眼无法感知,而人眼又欺骗了大脑,我们就感觉有多个程序在同时运行。实践所知,人眼能感知的最小时间大概是 100 毫秒。因此,Windows Client UI 开发人员应当注意,千万不要让你的程序界面响应大于 100 毫秒。假如大于此数,客户就会感到界面顿卡,带来槽糕的用户体验。Web UI 可以适当放宽界限。但无论怎样,快速的响应策略应当成为实现良好用户体验的首选)。 每个正在运行的应用程序实例都是一个进程。进程通常相对独立于其他进程运行。尤其是程序所使用的内存资源。举个例子,浏览器一般都不能直接访问音乐播放器的内存资源。如果有这个需求,则需要通过其他手段来达到该目的。比如文件映射,IPC

并行思维 [II]

会有一股神秘感。 提交于 2019-11-26 21:43:18
书接上回: 并行思维 [I] 可伸缩性与加速比 可伸缩性是衡量应用程序加速比多少的尺度之一(注:加速比指应用程序串行化与并行化之间所花费时间之比,它表示并行化之后的效率提升结果)。2 倍的加速比表明并行程序仅需要花费串行程序的一半时间。比如理想情况下,运行在单处理器上的程序花费 30 秒,而在双核机器上运行仅需花费 15 秒。 我们总是期望运行在双核机器上的应用程序要比在单核上快的多。同理,运行在四核机器上也要比在双核上快的多。这就好像以前当 CPU 换代升级时,随着主频提升,我们的程序总是可以运行的更快。很不幸,大多数应用程序在步入多核时代后,性能不但没有提升,甚至有所降低。 假如我们增加更多的处理器核心数,而应用程序并没有获得额外的加速。从这点来看,该应用程序不具有可伸缩性。如果强制使用另外的处理器核心,通常会造成性能下降。因为这时分布式和同步的开销开始凸显威力。 更多关于可伸缩性的指导方针,楼主强烈推荐这篇文章: 可伸缩性原则 。 应用程序到底有多少并行性可言? 如小标题所说,应用程序到底有多少并行性呢?答案是视情况而定(废话)。 显然,这个问题取决于解决问题的多寡和发现并恰当利用并行算法的能力。我们先前大部分讨论(更多讨论请参见: 并行思维 [I] )都围绕着如何在昂贵和稀有的并行计算机上编写高性能程序。随着多核处理器时代的到来,许多方面已经发生变化