偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

DotNet并行計算的使用誤區(qū)二

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

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

上接 DotNet并行計算的使用誤區(qū)一

誤區(qū)三 . 并行計算是運行時的事

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

1. 使用并行庫處理代碼與普通方式對比,IL的結(jié)構(gòu)是不同的。

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

使用TPL后CLR可能會分解任務,這一依據(jù)的其中之一是由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是直接出現(xiàn)在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已經(jīng)不在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.  

 

結(jié)構(gòu)圖:

 

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

 

每當我們增加一個并行代碼段,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.  

 

下圖中會有對應模塊出現(xiàn):

 

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

【編輯推薦】

  1. 3.9.3 云計算與并行計算
  2. 1.4 商業(yè)應用的并行計算
  3. 1.3 網(wǎng)格計算:分布式并行計算
  4. 并行計算的難點與數(shù)學原理解析

 

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

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并行計算

2009-12-18 09:38:27

.NET 4.0并行計

2012-08-17 09:32:52

Python

2010-03-19 17:23:45

云計算

2010-06-11 08:52:17

并行計算

2023-10-30 08:57:19

.Net開發(fā)并行計算

2010-03-11 15:23:44

Visual Stud

2010-04-21 09:23:09

.NET 4

2010-06-10 08:37:04

并行計算

2017-04-24 12:07:44

Spark大數(shù)據(jù)并行計算

2011-08-29 10:40:02

浪潮英特爾并行計算

2024-10-21 16:54:43

NumPyPython并行計算

2012-12-18 15:33:44

遞歸數(shù)據(jù)并行計算

2022-07-08 10:59:32

深度學習計算

2020-01-18 18:37:00

Java并行計算數(shù)據(jù)庫
點贊
收藏

51CTO技術棧公眾號