文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

DotNet中怎么实现并行计算

2023-06-17 13:08

关注

这期内容当中小编将会给大家带来有关DotNet中怎么实现并行计算,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

误区三 . 并行计算是运行时的事

的确,DotNet会在运行时决定是否使用并行库处理代码,但是早在你编译代码时,编译器就早已为这一时刻做好准备,换就话说:

使用并行库处理代码与普通方式对比,IL的结构是不同的。

即使你选择使用并行计算,并且你也确实拥有多核(线程)CPU,运行时你的代码也不一定是并行的。

使用TPL后CLR可能会分解任务,这一依据的其中之一是由IL支持的,IL将并行的任务代码分离,以便在将来的操作中并行,这一点可以从以下的示例中看出来,以下两段示例的核心C#代码都是Tostring()和Sleep(),Code A使用For包含Sleep,Code B使用Parallel.For处理:

Code Part A:

IL:

IL_000e: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()   IL_0013: nop   IL_0014: ldc.i4.0   IL_0015: stloc.2   IL_0016: br.s IL_0031   IL_0018: nop   IL_0019: ldloca.s i   IL_001b: call instance string [mscorlib]System.Int32::ToString()   IL_0020: stloc.0   IL_0021: ldc.i4 0xc8   IL_0026: call void [mscorlib]System.Threading.Thread::Sleep(int32)   IL_002b: nop   IL_002c: nop   IL_002d: ldloc.2   IL_002e: ldc.i4.1   IL_002f: add   IL_0030: stloc.2   IL_0031: ldloc.2   IL_0032: ldc.i4.s 10   IL_0034: clt   IL_0036: stloc.3   IL_0037: ldloc.3   IL_0038: brtrue.s IL_0018   IL_003a: ldloc.1   IL_003b: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()

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

DotNet中怎么实现并行计算

再来看看Parallel方式:

Code Part B:

Form1_Load:

IL_0019: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()   IL_001e: nop   IL_001f: ldc.i4.0   IL_0020: ldc.i4.s 10   IL_0022: ldloc.1   IL_0023: ldftn instance void WindowsFormsApplication4.Form1/'<>c__DisplayClass1'::'<Form1_Load>b__0'(int32)   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>)   IL_0033: pop   IL_0034: ldloc.0   IL_0035: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()   //注意,Sleep已经不在Load方法中了,而是被一个“b__0”代替,并行代码与宿主代码分离,以下就是b__0的  IL: .method public hidebysig instance void '<Form1_Load>b__0'(int32 i) cil managed   {   // 代码大小 26 (0x1a)   .maxstack 8   IL_0000: nop   IL_0001: ldarg.0   IL_0002: ldarga.s i   IL_0004: call instance string [mscorlib]System.Int32::ToString()   IL_0009: stfld string WindowsFormsApplication4.Form1/'<>c__DisplayClass1'::a IL_000e: ldc.i4 0xc8   IL_0013: call void [mscorlib]System.Threading.Thread::Sleep(int32)   IL_0018: nop   IL_0019: ret   } // end of method '<>c__DisplayClass1'::'<Form1_Load>b__0'

结构图:

DotNet中怎么实现并行计算

以上的红色代码就是在Code A中出现的主要代码。再让我们重温一下这张图,IL的代码任务已经很明显的指示了出来。

DotNet中怎么实现并行计算

每当我们增加一个并行代码段,IL中就会增加一个b_N块:假如我们的代码中包含两个Parallel块,每块的主代码与上述一致,IL如下:

IL_0019: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()   IL_001e: nop   IL_001f: ldc.i4.0   IL_0020: ldc.i4.s 10   IL_0022: ldloc.1 IL_0023: ldftn instance void WindowsFormsApplication4.Form1/'<>c__DisplayClass2'::'<Form1_Load>b__0'(int32)   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>)   IL_0033: pop  IL_0034: ldc.i4.0   IL_0035: ldc.i4.s 10   IL_0037: ldloc.1   IL_0038: ldftn instance void WindowsFormsApplication4.Form1/'<>c__DisplayClass2'::'<Form1_Load>b__1'(int32)   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>)   IL_0048: pop   IL_0049: ldloc.0   IL_004a: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()

下图中会有对应模块出现:

DotNet中怎么实现并行计算

上述就是小编为大家分享的DotNet中怎么实现并行计算了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯