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

news/2024/7/8 2:47:05
 
无锁编程与分布式编程那个更适合多核 CPU
 
前一篇文章 多核系统中三种典型锁竞争的加速比分析讲过了三种典型锁竞争情况下的加速比情况,特别是分布式锁竞争的加速比和CPU核数成正比,有很好的加速比性能。由于近些年在学术界中,无锁编程属于研究热点。那么使用无锁编程是不是可以取得更好的加速比性能呢?或者说无锁编程是不是更适合多核CPU系统呢?
无锁编程主要是使用原子操作替代锁来实现对共享资源的访问保护,举个例子,要对某个整数变量进行加1操作的话,用锁保护操作的代码如下:
int a = 0;
Lock();
a+= 1;
Unlock();
 
如果对上述代码反编译可以发现 a+=1;被翻译成了以下三条汇编指令:
mov         eax,dword ptr [a]
add         eax,1
mov         dword ptr [a],eax
 
 
如果在单核系统中,由于在上述三条指令的任何一条执行完后都可能发生任务切换,比如执行完第1条指令后就发生了任务切换,这时如果有其他任务来对a进行操作的话,当任务切换回来后,将继续对a进行操作,很可能出现不可预测的结果,因此上述三条指令必须使用锁来保护,以使这段时间内其他任务无法对a进行操作。
需要注意的是,在多核系统中,因为多个CPU核在物理上是并行的,可能发生同时写的现象;所以必须保证一个CPU核在对共享内存进行写操作时,其他CPU核不能写这块内存。因此在多核系统中和单核有区别,即使只有一条指令,也需要要加锁保护。
如果使用原子操作来实现上述加1操作的话,例如使用VC里的InterlockedIncrement来操作的话,那么对a的加1操作需要以下语句
InterlockedIncrement (&a);
这条语句最终的实际加1操作会被翻译成以下一条带lock前缀的汇编指令:
lock xadd   dword ptr [ecx],eax
 
使用原子操作时,在进行实际的写操作时,使用了lock指令,这样就可以阻止其他任务写这块内存,避免出现数据竞争现象。原子操作速度比锁快,一般要快一倍以上。
使用lock前缀的指令实际上在系统中是使用了内存栅障(memory barrier),当原子操作在进行时,其他任务都不能对内存操作,会影响其他任务的执行。因此这种原子操作实际上属于一种激烈竞争的锁,不过由于它的操作时间很快,因此可以看成是一种极细粒度锁。
在无锁(Lock-free)编程环境中,主要使用的原子操作为CAS(Compare and Swap)操作,在VC里对应的操作为 InterlockedCompareExchange 或者 InterlockedCompareExchangeAcquire如果是 64 位的操作,需要使用 InterlockedCompareExchange64 或者 InterlockedCompareExchangeAcquire64 。使用这种原子操作替代锁的最大的一个好处是它是非阻塞的。
按照微软 MSDN 的说明, InterlockedCompareExchange 带有全局的内存栅障 (full memory barrier) ,在使用了 full memory barrier 的情况下,即使不是访问同一内存变量的原子操作也会发生竞争,从竞争形式上来讲,会发生固定式锁竞争或随机锁竞争现象,并且无法实现分布式锁竞争的竞争模式,比起使用普通锁的竞争会更激烈,因此最终得到的加速比会比上一篇文章里讲的固定式锁竞争还要糟糕。
对于象 InterlockedCompareExchangeAcquire 这类的原子操作,没有使用 full memory barrier ,因此性能理论上会比使用 full memory barrier 的原子操作好很多(由于目前这类原子操作只有在特定的机器才支持,具体性能到底如何没有测试过,微软的 MSDN 里也对性能方面作出说明)。但是如果采用固定式锁竞争形式,其加速比仍然是按照前面的固定式锁竞争的加速比公式来计算:

由于原子操作速度比锁快,其实相比于普通锁操作,相当于加锁解锁时间

鈥?鈥濆簲鐢ㄧ▼搴忎腑鐨勬湇鍔″櫒閿欒銆?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/3657763.html

相关文章

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官方的说明…

.NET Framework 3.0 版本命名與部署 QA

.NET Framework 3.0 版本命名與部署 Q&A译者&#xff1a;奚江华2006 年 7 月原文网址 :http://msdn.microsoft.com/winfx/learning/netfx3faq/default.aspx在 2006 年 6 月&#xff0c;微软副总裁 S. Somasegar 宣布 WinFX 将更名为 .NET Framework 3.0&#xff0c;请知道…

只通过拉近特征之间的距离来训练REID 模型

在正常的行人重识别深度学习的模型中&#xff0c;都是先将行人图片经过backbonne网络&#xff0c;提取特征&#xff0c;然后再将特征和Linear层进行了链接&#xff0c;然后根据输出的分类概率&#xff0c;来反馈&#xff0c;对网络进行优化。我就在想&#xff0c;可不可以不经过…