并行编程学习笔记

 

 

线程化方法学的四个步骤。算法

1, 分析(Analysis)编程

a)       必须对程序结构十分熟悉,算法精通。缓存

b)       判断算法是否能够修改成并行算法。多线程

c)        经过调试工具,获取程序最耗时的地方。并发

d)       修改占用时间最多的算法,得到最大收益。dom

2, 设计与实现(Design and implementation)分布式

a)        函数

3, 测试正确性(Test for Correctness)工具

a)       知道全部线程化得错误,产生的缘由和产生的现象。性能

b)       学会使用线程调试工具和Debug调试工具。

4, 性能调优(Tune for Performance)

a)       线程化代码调优经常使用方法。

b)       学会使用线程调优软件。

 

 

开发方法:从串行到并行。先串行保证算法的正确,而后修改并行,跳过程序的性能。

 

理论模型:

 

并行随机访问机(Parallel Random Access Machine, PRAM)

问题核心:共享内存。共享内存致使两种类型的读操做限制和写操做限制:并发或者独占(Exclusive)。

内存访问模式

描述

并发读,并发写

(Concurrent Read, Concurrent Write,CRCW)

多线程同时写一个内存位置,而且多个线程同时写入一个内存位置

并发读,独占写

(Exclusive Write,Concurrent Read, CREW)

 

独占读,并发写

(Concurrent Write,Excusive Read, ERCW)

 

独占读,独占写

(Concurrent Write,Excusive Read, EREW)

 

 

 

分布式内存模型(Distributed-Memory)

经常使用可移植库:

l  PVM(Parallel Virutual Machine,并行虚拟机)

l  MPI(Message Passing Interface, 消息传递接口)。更多信息能够从Beowulf项目得到。

 

共享内存编程与分布式内存编程的比较

 

共有功能:

冗余工做:

1, 分布式确定会由于发送数据和接受数据产生执行开销。

2, 多线程产生数据产生冗余开销。

 

分解工做:

1, 分配工做到不一样的线程和进程中。

 

共享数据:

1, 部分数据根据程序须要被线程和进程共享。

 

工做的静态/动态分配:

1, 总执行时间大体等于每一部分工做的执行时间之和,应用于静态分配。

2, 当工做的数量远多于线程的数量,而且时间不能计算,应用于动态分配。

 

共享内存独有功能:

         局部变量和线程局部存储。Windows和POSIX线程都定义了线程局部存储(Thread-Local Storage, TLS) API。TLS的值在不一样函数之间保持不变,相似于静态变量。

 

内存效应:

         多核之间共享缓存,要处理缓存置换问题。

         多核之间独有缓存,效率比较低。

伪共享。线程的不一样变量被包含在同一条缓存线(Cache Line)中。根据缓存一致性原则,当某个线程更新缓存中的一个变量,若是另外一个线程但愿访问缓存线其余内容是,须要先将改缓存线写回到内存中。

                                                              

内存中的通讯:

对同一个内存区域,进行读写。

互斥:

         每次只容许一个线程访问相同的共享变量。

 

生产者和消费者:

 

读/写锁

 

 

缓存一致性协议参考文档:

http://yefeng.iteye.com/blog/210067

http://www.core.org.cn/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-823Computer-System-ArchitectureSpring2002/AECFE2BE-F2D5-4A44-867E-4BC83249E2EF/0/lecture18.pdf

相关文章
相关标签/搜索