多核系统中三种典型锁竞争的加速比分析

news/2024/7/8 2:44:40
 
多核系统中三种典型锁竞争的加速比分析
目录
1.1      引言... 1
1.2      任务粒度因子与锁粒度因子... 2
1.3      固定式锁竞争中的加速比分析... 3
1.4      随机锁竞争中的加速比分析... 3
1.5      分布式锁竞争的加速比分析... 4
1.6      结论... 5
1.7      参考文献:... 5
 
1.1 引言
在多核系统中,衡量程序性能的一个重要指标就是加速比,加速比定义如下:
S(n) 单处理器上最优串行化算法计算时间 / 使用n个处理器并行计算时间
众所周知,关于加速比有一个阿姆达尔定律,说的是加速比方面的事情,即加速比S(n) 和串行部分所占比例f 有关,而与CPU 核数n 无关,也就是说
                               
当处理器个数n 趋近于无穷大时,有以下等式。
                                                  
阿姆达尔定律的提出让整个软件界灰心了许多年,因为只要串行比例为5 %,那么不论增加多少处理器,加速比最多也只能达到20 。
若干年后一个叫Gustafson 的人提出了和阿姆达尔定律不同的意见,得到了一个新的加速比公式如下:
                               
其中的K 是一个常数,表示串行执行时间所占的比例。
按照Gustafson 定律,加速比显然和CPU 核数n 是成正比的,CPU 核数越大,加速比也越大。
Gustafson 定律的前提条件假设串行化代码的规模是固定的,计算规模是随CPU 核数增加而增加的。实际情况中,共享资源访问的计算量和程序的计算规模是成正比的,如果共享资源通过锁保护操作而变成串行化执行的话,那么串行化代码的规模将随程序规模的增加而线性增加,这样将导致不符合Gustafson 定律的前提条件,而是符合阿姆达尔定律的前提条件。最终得出的加速比将是按照阿姆达尔定律计算出结果。
因此如何消除锁竞争造成的串行化执行就成了程序员需要解决的问题,下面就来先看一下几种不同类型的锁竞争形式对加速比指标的具体影响,在锁竞争的情况中,任务粒度因子和锁粒度因子是影响加速比的重要因素之一,因此需要先看一下任务粒度因子和锁粒度因子的概念。
1.2 任务粒度因子与锁粒度因子
在一个有锁保护操作的程序中,每个任务中的计算可以分为如下图所示的几部分:
图1 :任务内的计算分类
其中
t s - 表示锁内计算时间,大小由共享资源的操作时间决定,与共享资源类型有关,并且与程序员的程序设计有关。
t l - 表示 Lock操作和Unlock操作耗费的时间,如果CPU核的速度固定,那么它为一常量。
t p - 表示锁外可并行计算部分耗费的时间,大小与具体的应用类型及程序员的分解有关
为了形象地表示出各段计算间的比例关系,引入两个概念:任务粒度因子和锁粒度因子。
1.        任务粒度因子
任务粒度因子主要是用来反映一个任务的计算量大小,由t l是常量,因此把任务内的有效计算和t l的比值叫做任务粒度因子,记为:
     
2.        锁粒度因子
锁粒度因子反映了一个任务内锁操作的粒度关系,用锁内计算和t l的比值来表示锁粒度因子,记为:
1.3 固定式锁竞争中的加速比分析
在一个固定式锁竞争情况中,是由若干个同时创建的对等任务竞争同一把锁,在这种固定式竞争环境中,假设每个任务都执行一次锁内操作,锁竞争一定会发生并因锁竞争而导致任务排队串行执行锁操作及锁内计算。固定式锁竞争属于实际情况中的常见现象,比如使用前面提到过的OpenMP来创建任务,如果在任务中使用了锁操作的话,那么它就是一种固定式锁竞争。
固定式锁竞争的情况在这篇文章: 多核编程中的锁竞争难题 里做过分析,如果用前面的任务粒度因子和锁粒度因子代入的话,可以得到 固定式锁竞争的加速比如下:
1.4 随机锁竞争中的加速比分析
在实际情况中,除了上节讲过的固定式锁竞争情况外,锁竞争还有一种随机竞争的形式,在多核编程中的任务随机竞争模式的概率分析 一文中对随机锁竞争做过分析。
在随机锁竞争中,各个对等任务运行锁计算的时间是随机的。比如在服务器软件中,各个任务创建后,每个任务都在循环地做同样的计算,而各个任务的运行时间受网络客户端的影响,其处理时间不是固定的,而是随机的,这样将导致各个任务在竞争同一把锁时出现随机竞争现象。
随机锁竞争情况下的加速比期望值如下:
 
 
n        随机锁竞争最坏情况下的加速比
上面计算出的加速比是期望值,在最坏情况下,实际上有 的概率所有的任务都处于锁内计算状态,在这种最坏情况下,只有一个任务在运行,因此加速比为1,如果考虑锁计算开销,那么加速比为
在最坏的情况下,加速比将小于1。
1.5 分布式锁竞争的加速比分析
在一个分布式锁竞争环境中,有多个任务竞争多把不同的锁,不妨设有m个任务竞争r把不同的锁。
如果任务数量m足够大的话,那么运行锁外计算的任务数量将会大于CPU核数,导致每个CPU核上都有任务在运行,此时的多CPU效率为
 
可以看出这种情况下的加速比和CPU核数成正比,并和任务粒度因子有关,任务粒度因子越大,那么加速比也越大。此时加速比和锁粒度没有任何关系。这是分布式锁竞争和普通锁竞争的最大区别。
如果任务数量m不够大,运行锁外计算的任务数量小于CPU核数的话,那么需要计算在有多少个进行锁竞争的任务在运行。

为方便起见 ,令k为运行锁内计算的任务数量,那么这k个任务在竞争r把锁,假设有

鈥?鈥濆簲鐢ㄧ▼搴忎腑鐨勬湇鍔″櫒閿欒銆?hr width=100% size=1 color=silver>
鍙傛暟鏃犳晥銆?/i>
璇存槑: 鎵ц褰撳墠 Web 璇锋眰鏈熼棿锛屽嚭鐜版湭澶勭悊鐨勫紓甯搞€傝妫€鏌ュ爢鏍堣窡韪俊鎭紝浠ヤ簡瑙f湁鍏宠閿欒浠ュ強浠g爜涓鑷撮敊璇殑鍑哄鐨勮缁嗕俊鎭€?

寮傚父璇︾粏淇℃伅: System.ArgumentException: 鍙傛暟鏃犳晥銆?br>
婧愰敊璇?

鍙湁鍦ㄨ皟璇曟ā寮忎笅杩涜缂栬瘧鏃讹紝鐢熸垚姝ゆ湭澶勭悊寮傚父鐨勬簮浠g爜鎵嶄細鏄剧ず鍑烘潵銆傝嫢瑕佸惎鐢ㄦ鍔熻兘锛岃鎵ц浠ヤ笅姝ラ涔嬩竴锛岀劧鍚庤姹?URL:

1. 鍦ㄤ骇鐢熼敊璇殑鏂囦欢鐨勯《閮ㄦ坊鍔犱竴鏉♀€淒ebug=true鈥濇寚浠ゃ€備緥濡?

<%@ Page Language="C" Debug="true" %>

鎴?

2. 灏嗕互涓嬬殑鑺傛坊鍔犲埌搴旂敤绋嬪簭鐨勯厤缃枃浠朵腑:







璇锋敞鎰忥紝绗簩涓楠ゅ皢浣跨粰瀹氬簲鐢ㄧ▼搴忎腑鐨勬墍鏈夋枃浠跺湪璋冭瘯妯″紡涓嬭繘琛岀紪璇戯紱绗竴涓楠や粎浣胯鐗瑰畾鏂囦欢鍦ㄨ皟璇曟ā寮忎笅杩涜缂栬瘧銆?br>
閲嶈浜嬮」: 浠ヨ皟璇曟ā寮忚繍琛屽簲鐢ㄧ▼搴忎竴瀹氫細浜х敓鍐呭瓨/鎬ц兘绯荤粺寮€閿€銆傚湪閮ㄧ讲鍒扮敓浜ф柟妗堜箣鍓嶏紝搴旂‘淇濆簲鐢ㄧ▼搴忚皟璇曞凡绂佺敤銆?/code>

鍫嗘爤璺熻釜:

[ArgumentException: 鍙傛暟鏃犳晥銆俔   System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData) +388134   System.Drawing.Image.FromStream(Stream stream) +8   Dottext.Admin.UploadWord.SaveFile(HttpPostedFile File) +32   Dottext.Admin.UploadWord.Page_Load(Object sender, EventArgs e) +76   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34   System.Web.UI.Control.OnLoad(EventArgs e) +99   System.Web.UI.Control.LoadRecursive() +47   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061


鐗堟湰淇℃伅: Microsoft .NET Framework 鐗堟湰:2.0.50727.832; ASP.NET 鐗堟湰:2.0.50727.832

http://www.niftyadmin.cn/n/3657765.html

相关文章

Python 字典update

x1 {q:12, w:13, e:14} x2 {q:22, w:77} x1.update(x2) print(x1) 上面的是一个程序例子&#xff0c;x1.update(x2)&#xff0c; 代表如果x2中的键和x1中有相同的部分&#xff0c;则将x1中对应的键所对应的值更新为x2中的这个键值。上述程序的运行结果为&#xff1a; {q: 2…

无锁编程与分布式编程那个更适合多核CPU?

无锁编程与分布式编程那个更适合多核CPU&#xff1f;前一篇文章多核系统中三种典型锁竞争的加速比分析讲过了三种典型锁竞争情况下的加速比情况&#xff0c;特别是分布式锁竞争的加速比和CPU核数成正比&#xff0c;有很好的加速比性能。由于近些年在学术界中&#xff0c;无锁编…

pytorch 使用多块显卡训练模型

一般的程序都是默认了单块显卡训练模型&#xff0c;如果batch_size过大的话&#xff0c;单块显卡是不好使的&#xff0c;这就需要多块显卡并行训练了&#xff0c;如何实现呢&#xff0c;特别简单 &#xff1a; net nn.DataParallel(net).cuda() 上面这行代码就可以实现了&am…

OpenMP中的任务调度

OpenMP中的任务调度OpenMP中&#xff0c;任务调度主要用于并行的for循环中&#xff0c;当循环中每次迭代的计算量不相等时&#xff0c;如果简单地给各个线程分配相同次数的迭代的话&#xff0c;会造成各个线程计算负载不均衡&#xff0c;这会使得有些线程先执行完&#xff0c;有…

pytorch 多卡并行计算保存模型和加载模型 (遗漏module的解决)

今天使用了多卡进行训练&#xff0c;保存的时候直接是用了下面的代码&#xff1a; torch.save(net.cpu().state_dict(),epoch1.pth) 我在测试的时候&#xff0c;想要加载这个训练好的模型&#xff0c;但是报错了&#xff0c;说是字典中的关键字不匹配&#xff0c;我就将新创建…

SD2.0大会的一些随想

SD2.0大会的一些随想29号一早就赶到了九华山庄&#xff0c;CSDN的潘微微很热情地帮我安排好了住宿&#xff0c;然后就是去主会场听演讲&#xff0c;我到会场的时候已经比较晚了&#xff0c;好像是google的演讲快要讲完了&#xff0c;接着就是陈榕的演讲&#xff0c;谈到了关于技…

model.train() model.eval() with torch.no_grad()

model.train() : 使得droupout 层起作用&#xff0c; 前相传播的时候会更新means 和var&#xff0c;而且会自动计算梯度 model.eval(): 会使得droupout 和前向传播的时候&#xff0c; droupout 不起作用&#xff0c; means 和var这样的统计数据值不会更新&#xff0c;但是依然…

好用的Google Analytics分析服務

好用的Google Analytics分析服务你有网站或Blog吗&#xff1f;如何收集访客造访的统计分析情报呢&#xff1f;答案是Google Analytics分析服务上星期祭司收到Google Analytics分析服务的邀请&#xff0c;而什么是Google Analytics分析服务呢&#xff1f;以下是Google官方的说明…