成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DotNet并行計算的使用誤區二

開發 后端
.NET是一個微軟開發的編程環境,里面可以使用C#,VB等多種編程語言。本文主要介紹.NET中,也就是DOTNET中的并行計算。讓我們一起來看。

并行計算或稱平行計算是相對于串行計算來說的。所謂并行計算可分為時間上的并行和空間上的并行。 時間上的并行就是指流水線技術,而空間上的并行則是指用多個處理器并發的執行計算。

上接 DotNet并行計算的使用誤區一

誤區三 . 并行計算是運行時的事

的確,DotNet會在運行時決定是否使用并行庫處理代碼,但是早在你編譯代碼時,編譯器就早已為這一時刻做好準備,換就話說:

1. 使用并行庫處理代碼與普通方式對比,IL的結構是不同的。

2. 即使你選擇使用并行計算,并且你也確實擁有多核(線程)CPU,運行時你的代碼也不一定是并行的。

使用TPL后CLR可能會分解任務,這一依據的其中之一是由IL支持的,IL將并行的任務代碼分離,以便在將來的操作中并行,這一點可以從以下的示例中看出來,以下兩段示例的核心C#代碼都是Tostring()和Sleep(),Code A使用For包含Sleep,Code B使用Parallel.For處理:

Code Part A:

IL:

  1. IL_000e: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()   
  2. IL_0013: nop   
  3. IL_0014: ldc.i4.0   
  4. IL_0015: stloc.2   
  5. IL_0016: br.s IL_0031   
  6. IL_0018: nop   
  7. IL_0019: ldloca.s i   
  8. IL_001b: call instance string [mscorlib]System.Int32::ToString()   
  9. IL_0020: stloc.0   
  10. IL_0021: ldc.i4 0xc8   
  11. IL_0026: call void [mscorlib]System.Threading.Thread::Sleep(int32)   
  12. IL_002b: nop   
  13. IL_002c: nop   
  14. IL_002d: ldloc.2   
  15. IL_002e: ldc.i4.1   
  16. IL_002f: add   
  17. IL_0030: stloc.2   
  18. IL_0031: ldloc.2   
  19. IL_0032: ldc.i4.s 10   
  20. IL_0034: clt   
  21. IL_0036: stloc.3   
  22. IL_0037: ldloc.3   
  23. IL_0038: brtrue.s IL_0018   
  24. IL_003a: ldloc.1   
  25. IL_003b: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()   

我們注意到,Code Part A的Sleep是直接出現在Load方法中的。

 

再來看看Parallel方式:

Code Part B:

Form1_Load:

 

  1. IL_0019: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()   
  2. IL_001e: nop   
  3. IL_001f: ldc.i4.0   
  4. IL_0020: ldc.i4.s 10   
  5. IL_0022: ldloc.1   
  6. IL_0023: ldftn instance void WindowsFormsApplication4.Form1/'<>c__DisplayClass1'::'<Form1_Load>b__0'(int32)   
  7. IL_0029: newobj instance void class [mscorlib]System.Action`1<int32>::.ctor(object, native int) IL_002e: call valuetype [mscorlib]System.Threading.Tasks.ParallelLoopResult [mscorlib]System.Threading.Tasks.Parallel::For(int32, int32, class [mscorlib]System.Action`1<int32>)   
  8. IL_0033: pop   
  9. IL_0034: ldloc.0   
  10. IL_0035: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()   
  11. //注意,Sleep已經不在Load方法中了,而是被一個“b__0”代替,并行代碼與宿主代碼分離,以下就是b__0的  
  12. IL: .method public hidebysig instance void '<Form1_Load>b__0'(int32 i) cil managed   
  13. {   
  14. // 代碼大小 26 (0x1a)   
  15. .maxstack 8   
  16. IL_0000: nop   
  17. IL_0001: ldarg.0   
  18. IL_0002: ldarga.s i   
  19. IL_0004: call instance string [mscorlib]System.Int32::ToString()   
  20. IL_0009: stfld string WindowsFormsApplication4.Form1/'<>c__DisplayClass1'::a IL_000e: ldc.i4 0xc8   
  21. IL_0013: call void [mscorlib]System.Threading.Thread::Sleep(int32)   
  22. IL_0018: nop   
  23. IL_0019: ret   
  24. // end of method '<>c__DisplayClass1'::'<Form1_Load>b__0'   
  25.  

 

結構圖:

 

以上的紅色代碼就是在Code A中出現的主要代碼。再讓我們重溫一下這張圖,IL的代碼任務已經很明顯的指示了出來。

 

每當我們增加一個并行代碼段,IL中就會增加一個b_N塊:假如我們的代碼中包含兩個Parallel塊,每塊的主代碼與上述一致,IL如下:

 

  1. IL_0019: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()   
  2. IL_001e: nop   
  3. IL_001f: ldc.i4.0   
  4. IL_0020: ldc.i4.s 10   
  5. IL_0022: ldloc.1 IL_0023: ldftn instance void WindowsFormsApplication4.Form1/'<>c__DisplayClass2'::'<Form1_Load>b__0'(int32)   
  6. IL_0029: newobj instance void class [mscorlib]System.Action`1<int32>::.ctor(object, native int) IL_002e: call valuetype [mscorlib]System.Threading.Tasks.ParallelLoopResult [mscorlib]System.Threading.Tasks.Parallel::For(int32, int32, class [mscorlib]System.Action`1<int32>)   
  7. IL_0033: pop  
  8. IL_0034: ldc.i4.0   
  9. IL_0035: ldc.i4.s 10   
  10. IL_0037: ldloc.1   
  11. IL_0038: ldftn instance void WindowsFormsApplication4.Form1/'<>c__DisplayClass2'::'<Form1_Load>b__1'(int32)   
  12. IL_003e: newobj instance void class [mscorlib]System.Action`1<int32>::.ctor(object, native int) IL_0043: call valuetype [mscorlib]System.Threading.Tasks.ParallelLoopResult [mscorlib]System.Threading.Tasks.Parallel::For(int32, int32, class [mscorlib]System.Action`1<int32>)   
  13. IL_0048: pop   
  14. IL_0049: ldloc.0   
  15. IL_004a: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()   
  16.  

 

下圖中會有對應模塊出現:

 

上面的例子說明,在IL階段已經為運行時的并行執行任務做了準備,編譯階段將并行任務從宿主中分離出來,運行階段決定是否采用并行方式執行任務。

【編輯推薦】

  1. 3.9.3 云計算與并行計算
  2. 1.4 商業應用的并行計算
  3. 1.3 網格計算:分布式并行計算
  4. 并行計算的難點與數學原理解析

 

責任編輯:于鐵 來源: 博客園
相關推薦

2011-04-20 17:15:21

并行計算

2019-04-18 09:15:05

DaskPython計算

2010-03-22 14:45:40

云計算

2014-04-24 10:25:15

2021-06-01 05:51:37

云計算并行計算分布式計算

2014-01-21 11:16:59

MPI并行計算

2012-08-17 09:32:52

Python

2009-12-18 09:38:27

.NET 4.0并行計

2010-03-19 17:23:45

云計算

2023-10-30 08:57:19

.Net開發并行計算

2010-06-11 08:52:17

并行計算

2011-08-29 10:40:02

浪潮英特爾并行計算

2010-03-11 15:23:44

Visual Stud

2010-04-21 09:23:09

.NET 4

2017-04-24 12:07:44

Spark大數據并行計算

2010-06-10 08:37:04

并行計算

2024-10-21 16:54:43

NumPyPython并行計算

2012-12-18 15:33:44

遞歸數據并行計算

2022-07-08 10:59:32

深度學習計算

2016-10-25 16:38:32

天云軟件云計算張福波
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品伦理一区二区三区 | 国产日韩亚洲欧美 | 自拍偷拍av | 午夜视频在线 | 免费看淫片 | 色爽女 | 天天色图| 久久99国产精品 | av一区二区在线观看 | 欧美国产精品一区二区三区 | 成人精品一区二区三区中文字幕 | 美人の美乳で授乳プレイ | 99国产精品99久久久久久 | 日本精品一区二区三区四区 | 国产午夜视频 | 久久狠狠| 狠狠操天天干 | 免费在线观看av的网站 | 亚洲视频精品 | 五月婷婷色 | 国产高清一区二区 | 一区二区三区四区在线视频 | 久久久九九 | 麻豆国产一区二区三区四区 | 欧美日韩在线观看一区二区三区 | 日韩精品免费在线观看 | 亚州av在线 | 成人国产精品免费观看 | 国产在线视频在线观看 | 在线免费中文字幕 | 99久久婷婷国产综合精品电影 | 久久不卡 | 美女爽到呻吟久久久久 | 青草青草久热精品视频在线观看 | 欧美 日韩 在线播放 | 日韩 欧美 二区 | 亚洲免费网| 国产精品久久久久久久久免费相片 | 在线观看国产网站 | 91精品国产一区 | 一区二区精品在线 |