c#

位置:IT落伍者 >> c# >> 浏览文章

使用.net Remtoing并行计算


发布日期:2021年12月05日
 
使用.net Remtoing并行计算

在MSDN上发现一篇文章是介绍如何使 Remoting进行并行计算的刚好本人对并行计算很有兴趣于是仔细地分析了一下此程序的代码原文及程序可以在此处获得由于觉得原文只是作了一个大致的讲解有很多细节只是掩藏在源代码中所以在花了很多时间分析完源程序后才对原文有了很深的理解疏理出一些内容出来和大家分享

一.概述

NET Remtoing用于在远程服务器和客户机之间互相调用对象这些对象是存在于同一AppDomain中的它使用Soap或二进制的方式传递消息(即要调用的对象)传送协议为HTTP或TCP

二.Remoting如何实现并行计算?

NET Remoting与并行计算好像是两个不同的概念前者更类似于分布式计算和Web Service而后者实际上是计算粒度更小的任务但它将一个计算任务分配给多个节点计算然后汇总成一个结果返回

根据以上思想实现上将分布的对象的粒度设计小一点即可实现并行计算并行计算的一个关键因素是进程(或子任务)间通讯而我们 remoting中的对象间通讯作为进程间通讯即可

本例并行计算Pi的小数点精确到N位使 remoting可以如下实现在每个节点上运行相同的程序但每个节点计算不同位置的小数位如NodeA计算小数点后NodeB计算NodeC计算这样最终汇总的结果就可以有由于是并行计算比起单机计算时间要快上很多倍其加速比与每台节点的速度及整个通信网络的速度有关计算模型如下图所示

三.并行算法

要进行并行计算首先要设计好并行算法和通讯模式由于我们只是在PC机群进行并行计算所以采用了最简单的主从式并行模型即由一个主进程负责任务的分发结果的归约将子任务平均分配到每个节点上计算

但实际上本文中使用的并不是平均分配任务而是更好的任务池工作方式即每个节点计算完一个子任务后会向主进程申请新的任务一直到任务全部计算完为止这样的好处是计算能力越强的节点计算的任务也越多比起平均分配来说可以提高总体的计算和减少同步时间

四.程序结构

此程序主要由以下几个包组成

)ServerLoader

用于加载提供可远程调用的服务器对象指定调用使用的网络协议和端口以便于在局域网中被调用然后侦听来自客户端的请求在服务器上处理此请求并返回结果

简单来说即每个节点都必须运行ServerLoader程序以向外界声明可被调用的对象(即Plouffe_bellarddll中的对象)

以下代码为调用配置文件

String ConfigFilePath = PathGetDirectoryName(ApplicationExecutablePath) +ServerLoader nfig;

RemotingConfigurationConfigure(ConfigFilePath);

配置文件为nfig

<configuration>

<systemruntimeremoting>

<application name = ServerLoader>

<service>

<wellknown

mode=SingleCall

type=PBPlouffe_BellardPlouffe_Bellard

objectUri=Plouffe_Bellard/>

</service>

<channels>

<channel ref=tcp server port=/>

</channels>

</application>

</systemruntimeremoting>

</configuration>

)Plouffe_bellard

这就是NET Remoting中的实际被调用的远程对象它被置于每个节点上它是继承自SystemMarshalByRefObject这样的派生对象从来都不会离开它的应用域客户就可以通过代理对象调用远程对象的方法

它是用来计算圆周率PI的小数点位数的程序Plouffe_Bellard算法具有很好的并行性它可以指定要计算的小数点的位置如第二节所述

其函数形式为

public class Plouffe_Bellard : SystemMarshalByRefObject

{

public String CalculatePiDigits(int n)

{ … }

}

)DigitsOfPi

此子基础上为整个项目核心部分可作为客户端程序运行它主要实现主界面UI处理节点配置多线程创建与同步计算任务分配与汇总的功能只需要在任何一台节点上运行即可包括以下几个对象

MainFormSolutionArraySolutionItemRemotingObjectCalculationThread

■ mainForm即处理UI对象

■ SolutionArray是并行线程分配与管理程序如:任务池创建任务分配线程创建同步线程 汇聚结果等

■ SolutionItem即任务的数据结构包括要计算的小数点位 计算的结果 计算的在机器

■ RemotingObject是RemotePiCalculator用于获取远程对象

■ CalculationThread计算模块在线程中运算(由SolutionArray产生和调用)并不断从任务池中取得任务进行计算

以下为这几个对象的序列图

educitycn/img_///jpg>

当远程对象的CalculatePiDigits被客户端程序调用时此要求即被发送到远程机器的ServerLoader对象然后服务器上的对象就会计算结果最后将计算的结果返回给客户端程序显示在文本框中

五.结果分析

机器配置说明

MOOREMHz AMD DuronM SDR

LOZITGHz Batumn M DDR

时间比较

  educitycn/img_///jpg>

由于算法的特性计算到高位时可以看到计算速度逐渐变慢在我们的机器上算到第位附近速度已经是非常之慢忍受不住终于中断一共计算了共耗时 ms分钟在实验中还发现节点只能与同一子网中其它节点相连才有效要与子网外的节点相连可能要涉 中的更高级话题就不太清楚了

六.后记

本文中的并行算法相对简单没有涉及并行计算的高级算法及其它内容如子任务间并没有传递数据使 remoting是否适合作并行计算呢?当在科学计算领域中已经有现成的MPIMVP等并行通讯库可用时?如果可以出现MPI for C#那真是一大福音(好像俄罗斯的专家们已经实现了这个项目叫做TSystem[])如果有时间希望会在以后我文章中继承研究 remoting进行并行计算国外的一些研究组好像已经有不少开始这方面的研究希望有兴趣的朋友和本人联系一同探讨               

上一篇:.Net中掌握Windows窗体间数据交互(1)

下一篇:.NET应用程序的授权模型使系统更易管理