Skip to content

Latest commit

 

History

History
并行处理
通过使用多核进行并行处理,无需处理更快的处理器,就可让程序在给定时间执行更多的计算。将问题划分成独立的子单元,使用多核并行处理。
主要内容:
并行处理原理
使用pyhton库multiprocessing并行处理简单问题
使用接口ProcessPoolExecutor
通过Cython和openMP使用多线程进行并行编程
使用theano和tensorflow自动实现并行性
使用Theano,Tensorflow和numba在GPU中执行代码
一.并行处理原理
要让程序并行的运行,必须将问题划分为可彼此独立运行的子单元。如果一个问题的各个子单元是完全彼此独立的,这个问题就是高度并行的。
进程间通信开销非常高,可能严重影响并行性,在并行程序中,处理数据通信的方式有两种:共享内存,分布式内存。
在共享内存中,各个子单元访问相同的内存空间。这种方法的优点是无需显示地处理通信。然而多个进程试图同时访问并修改相同的内存单元,将会出现问题,因此,必须使用同步技术避免这样的冲突。
在分布式内存模型中,每个进程都与其他进程完全分开,并由自己的内存空间,必须显示处理进程间的通信。
以共享内存方式实现并行的一种常见方式是使用线程。线程是进程的独立子任务,共享内存等资源。线程生成多个执行上下文并共享空间,而进程提供多个上下文,必须显示处理通信。
python能够生成并处理线程,但使用线程不能改善性能。由于python解释器的设计,每次只有一个python指令在运行,这种机制称为全局解释器锁。每当线程执行python语句,都获取一个锁,完事儿之后再释放。
有些python实现没有使用GIL,如Jython和IronPython。
通过使用进程可以完全避开GIL,每个进程都有自己的解释器。进程缺点:启动新进程通常比线程慢,消耗的内存更多。进程间通信速度更慢。灵活性更高,可伸缩性更佳。
(2.图形处理单元)GPU
GPU是为了高效的运行与图形相关的操作而设计的,这是通过采用高度并行的体系结构来实现的。
GPU专门用于执行浮点运算。使用特殊编程平台CUDA和openCL。
cuda(COMPUTE UNIFIED DEVICE ARCHITECTURE),是NVIDIA专用技术。CUDA提供工具NVCC,可用来编译使用CUDAc语言编写的GPU程序。
OPENCL是一种开放技术,使用它编写的并行程序可针对各种目标平台进行编译,对非nvida设备来说,这是个好平台。
gpu编程两大挑战:1.将数据写入内存以及从内存读取数据的成本2.实现算法以充分发挥GPU体系结构的作用。
GPU可极大地提高单位时间内可执行的操作数(吞吐量),需要更多时间准备数据。cpu生成单个结果更快。
二.使用pyhton库multiprocessing并行处理简单问题
(1.使用多个进程)
标准模块multiprocessing可用来生成多个进程,以快速并行化简单任务,同时避免GIL问题。
如mt_pro.py所示
三.使用接口ProcessPoolExecutor
从python3.2开始,可使用模块concurrent.futures中的接口Executor来并行执行python代码。ProcessPoolExecutor类的用法。
如pro_pool_execu.py所示
使用monte carlo 计算pi的近似值
如monte_carlo.py
(2.同步和锁)
虽然multiprocessing使用的是进程(这些进程有自己的内存区域),但它也允许将变量和数组定义为共享内存。要定义共享变量,可使用multiprocessing.Value,并传入一个表示变量数据类型的字符串(
i表示整型,d不是double,f表示float).要修改这种变量的内容,可使用属性value。具体如mul_var.py
四.通过Cython和openMP使用多线程进行并行编程
Cython通过OpenMP提供了一个便利的接口,能够实现共享内存式并行处理。OpenMP是一个规范兼API,设计用于编写多线程并行程序。OpenMP规范包括一系列C语言预处理器指令,用于管理线程以及提供通信模式,负载均衡和其他同步功能。
Cython并行示例见Cython_parallel.pyx
五.使用theano和tensorflow自动实现并行性
并行自动化
常规pyhton程序因GIL无法实现线程并行化。所以使用进程避开这种问题,但是启动慢。
使用cython代码可以提高速度,轻量级并行,多了一个额外的编译步骤。使用特殊库将代码自动转换为并行版本,从而高效执行。
实现并行自动化的包包括JIT编译器numexpr和Numba。
Theano定义张量,并编译成快速语言。很多操作都可以并行化,并可在CPU和GPU中运行。
Tensorflow是一个类似于Theano的库,在高效的C++引擎中执行操作。
Theano代码示例如theano_dmeo.py
Theano能够自动并行化代码-使用openMP和BLAS线性代数例程等专用包实现基于元素的操作和矩阵操作。可使用配置选项
如test_theano.py
theano是将函数编译成c语言代码,再编译成机器码
六.使用Theano,Tensorflow和numba在GPU中执行代码
如theano_gpu_demo.py和tensorflow_gpu_demo.py所示