阅读背景:

多核编程技术1

来源:互联网 
串行比例f 串行时间k,把f看做n的函数,由于摩尔定律n上升, f下降,串行时间近似为常数。 Gustafson定律: S(n) = n + (1-n)K = K + (1-K)n,总时间是1,k串行执行时间<1. 如何实现串行比例f,随着内核数量增加,如何使得f降低呢?就是说串行部分在总执行部分的比例呢? 比如,队列排队,需要多处枷锁操作,如何来减少这样的锁呢? 1,减少串行执行代码, 2,减少锁的使用, 3,减少集中式锁竞争,避免出现多个进程竞争同一把锁。尽量使用多个队列,多个锁的形式,即分布式锁竞争。 4,负载均衡,1ms,4ms地进行并行效率不会高。 5,降低并行计算开销,例如,一个排序算法,单核执行,10ms,双核执行各6ms,多出2ms 计算开销。与算法设计的优劣有关。 ok,提高加速比的方法大致如上。 讲一下,锁竞争下的加速比。 集中式加速比。 加锁1~2千万次/s,至少相当于200条指指令,开销很大的。 任务粒度因子, 锁粒度因子,fk = ts/tl,锁粒度越小并行性越好。锁竞争越小。 单核与多核多线程的区别。 线程数量不少于cpu核数,考虑负载均衡*,任务调度,优先级抢占(<单核优先级不考虑任务调度,多核情况,高优先级任务可以利 用里一个核,所以高优先不一定先与地有限结束,) 不同架构cpu的影响。 Cache需要对齐的:如果没对齐会怎样??即为共享问题,对于同时访问同一行的cache时,会互斥,会加锁,产生乒乓现象。大幅降 低执行效率。 锁与原子操作: 原子操作,+1操作, add var;两个线程不能对同一个变量进行+1操作,实际上cpu会对变量进行,锁总线控制,就是互斥的, 广义原子操作,表示整个一系列操作是这个整体,不可分割,造作到一半的时候不可以打断的,即使打断也会从头开始。 进行读操作,没问题,如果对不变量进行写操作,就要用到原子操作。 CAS操作:(比较并交换炒作) CompareAndSwapt 有两个线程操作链表,线程1先读到指针Tail,线程2随后读到Tail并改到其他节点,线程1就不能随便进行写操作 了。 cas就是对应这样的一个操作,先比较是否与原值相等,不等则进行交换。不等则进行交换(当做出错情况),继续循环这样的操作,直到相等再进行写操 作 。cas是原子操作,不允许被打断!!LockFree编程。 状态比较复杂,容易出错。 TestAndSet操作:(测试是否等0,等零则至一) 线程切换时候经常进行这样的操作,多为系统底层所用,在应用层偶尔也会用到。 串行比例f 串行时间k,把f看做n的函数,由于摩尔定律n上升, f下降,串行时间近似为常数。



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: