日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
DotNet并行計(jì)算的使用誤區(qū)二

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

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

誤區(qū)三 . 并行計(jì)算是運(yùn)行時(shí)的事

的確,DotNet會(huì)在運(yùn)行時(shí)決定是否使用并行庫(kù)處理代碼,但是早在你編譯代碼時(shí),編譯器就早已為這一時(shí)刻做好準(zhǔn)備,換就話說(shuō):

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

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

使用TPL后CLR可能會(huì)分解任務(wù),這一依據(jù)的其中之一是由IL支持的,IL將并行的任務(wù)代碼分離,以便在將來(lái)的操作中并行,這一點(diǎn)可以從以下的示例中看出來(lái),以下兩段示例的核心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方法中的。

再來(lái)看看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'::'b__0'(int32) 
  7. IL_0029: newobj instance void class [mscorlib]System.Action`1::.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
  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方法中了,而是被一個(gè)“b__0”代替,并行代碼與宿主代碼分離,以下就是b__0的
  12. IL: .method public hidebysig instance void 'b__0'(int32 i) cil managed 
  13. // 代碼大小 26 (0x1a) 
  14. .maxstack 8 
  15. IL_0000: nop 
  16. IL_0001: ldarg.0 
  17. IL_0002: ldarga.s i 
  18. IL_0004: call instance string [mscorlib]System.Int32::ToString() 
  19. IL_0009: stfld string WindowsFormsApplication4.Form1/'<>c__DisplayClass1'::a IL_000e: ldc.i4 0xc8 
  20. IL_0013: call void [mscorlib]System.Threading.Thread::Sleep(int32) 
  21. IL_0018: nop 
  22. IL_0019: ret 
  23. } // end of method '<>c__DisplayClass1'::'b__0' 

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

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

每當(dāng)我們?cè)黾右粋€(gè)并行代碼段,IL中就會(huì)增加一個(gè)b_N塊:假如我們的代碼中包含兩個(gè)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'::'b__0'(int32) 
  6. IL_0029: newobj instance void class [mscorlib]System.Action`1::.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
  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'::'b__1'(int32) 
  12. IL_003e: newobj instance void class [mscorlib]System.Action`1::.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
  13. IL_0048: pop 
  14. IL_0049: ldloc.0 
  15. IL_004a: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop() 

下圖中會(huì)有對(duì)應(yīng)模塊出現(xiàn):

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


網(wǎng)頁(yè)名稱:DotNet并行計(jì)算的使用誤區(qū)二
URL鏈接:http://www.5511xx.com/article/dhipihc.html