使用.net Remtoing進行並行計算

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

使用.net Remtoing並行計算

摘要,本文分析了一個使用.net romoting進行並行計算PI值的程序,

並給出結果及性能分析。

 

MSDN上發現一篇文章是介紹如何使用.net Remoting進行並行計算的,剛好本人對並行計算很有興趣,於是仔細地分析了一下此程序的代碼。原文程序可以在此處獲得。由於覺得原文只是作了一個大致的講解,有很多細節只是掩藏在源代碼中,所以在花了很多時間分析完源程序後,纔對原文有了很深的理解,疏理出一些內容出來和大家分享。

 

一.             概述

.NET Remtoing用於在遠程服務器和客戶機之間互相調用對象,這些對象是存在於同一AppDomain中的。它使用Soap或二進制的方式傳遞消息(即要調用的對象),傳送協議爲HTTPTCP

 

二.             Remoting如何實現並行計算?

.NET Remoting與並行計算好像是兩個不同的概念,前者更類似於分佈式計算和Web Service,而後者實際上是計算粒度更小的任務,但它將一個計算任務分配給多個節點計算,然後彙總成一個結果返回。

根據以上思想,實現上將分佈的對象的粒度設計小一點即可實現並行計算。並行計算的一個關鍵因素是進程(或子任務)間通訊,而我們把.net remoting中的對象間通訊作爲進程間通訊即可。

本例並行計算Pi的小數點,精確到N位。使用.net remoting可以如下實現。在每個節點上運行相同的程序,但每個節點計算不同位置的小數位,如NodeA計算小數點後1-9位,NodeB計算10-18位,NodeC計算19-27位,這樣最終彙總的結果就可以有1-27位。由於是並行計算,比起單機計算,時間要快上很多倍,其加速比與每臺節點的速度及整個通信網絡的速度有關。計算模型如下圖所示:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2004-4-201516170.png

三.             並行算法

要進行並行計算,首先要設計好並行算法和通訊模式。由於我們只是在PC機羣進行並行計算,所以採用了最簡單的主從式並行模型,即由一個主進程負責任務的分發,結果的歸約,將子任務平均分配到每個節點上計算。

但實際上本文中使用的並不是平均分配任務,而是更好的任務池工作方式。即每個節點計算完一個子任務後,會向主進程申請新的任務,一直到任務全部計算完爲止,這樣的好處是計算能力越強的節點計算的任務也越多。比起平均分配來說可以提高總體的計算和減少同步時間。

CSDN_Dev_Image_2004-4-201516172.png

 

 

四.             程序結構

此程序主要由以下幾個包組成,

CSDN_Dev_Image_2004-4-201516174.png

l         41) ServerLoader

用於加載提供可遠程調用的服務器對象,指定調用使用的網絡協議和端口,以便於在局域網中被調用,然後偵聽來自客戶端的請求,在服務器上處理此請求並返回結果。

簡單來說即每個節點都必須運行ServerLoader程序,以向外界聲明可被調用的對象(即Plouffe_bellard.dll中的對象)。

 

以下代碼爲調用配置文件:

String ConfigFilePath = Path.GetDirectoryName(Application.ExecutablePath) + ServerLoader. exe.config";

RemotingConfiguration.Configure(ConfigFilePath);

 

配置文件爲:ServerLoader.exe.config

<configuration>

  <system.runtime.remoting> 

    <application name = "ServerLoader">  

      <service>

        <wellknown

          mode="SingleCall"

          type="PB.Plouffe_Bellard,Plouffe_Bellard"

          objectUri="Plouffe_Bellard"/>

      </service>

      <channels>

        <channel ref="tcp server" port="9000"/>

      </channels>

    </application>

  </system.runtime.remoting>

</configuration>

 

 

l         42) Plouffe_bellard

這就是.NET Remoting中的實際被調用的遠程對象,它被置於每個節點上。它是繼承自System.MarshalByRefObject這樣的派生對象從來都不會離開它的應用域,客戶就可以通過代理對象調用遠程對象的方法。

它是用來計算圓周率PI的小數點位數的程序,Plouffe_Bellard算法具有很好的並行性,它可以指定要計算的小數點的位置,如第二節所述。

其函數形式爲:

 

public class Plouffe_Bellard : System.MarshalByRefObject

{

public String CalculatePiDigits(int n)

                   { … }

}

 

l         43DigitsOfPi

此子基礎上爲整個項目核心部分,可作爲客戶端程序運行。它主要實現主界面UI處理、節點配置,多線程創建與同步,計算任務分配與彙總的功能,只需要在任何一臺節點上運行即可。包括以下幾個對象:

MainFormSolutionArraySolutionItemRemotingObjectCalculationThread

n         mainForm:即處理UI對象

n         SolutionArray是並行線程分配與管理程序,如:任務池創建、任務分配、線程創建、同步線程, 匯聚結果等。

n         SolutionItem即任務的數據結構。包括要計算的小數點位, 計算的結果, 計算的在機器。

n          RemotingObjectRemotePiCalculator,用於獲取遠程對象。

n          CalculationThread:計算模塊,在線程中運算(由SolutionArray產生和調用),並不斷從任務池中取得任務進行計算。

 

以下爲這幾個對象的序列圖:

CSDN_Dev_Image_2004-4-201516176.jpg

 

 

 

當遠程對象的CalculatePiDigits被客戶端程序調用時,此要求即被髮送到遠程機器的ServerLoader對象。然後服務器上的對象就會計算結果。最後將計算的結果返回給客戶端程序,顯示在文本框中。

 

五.             結果分析

機器配置說明

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />MOORE        700MHz       AMD Duron  192M SDR

LOZIT          1.8GHz       Batumn       256M DDR

時間比較

CSDN_Dev_Image_2004-4-201516178.png

 

由於算法的特性,計算到高位時可以看到計算速度逐漸變慢。在我們的機器上,算到第3000位附近速度已經是非常之慢,忍受不住終於中斷,一共計算了3330位,共耗時719545 ms,即12分鐘。在實驗中還發現,節點只能與同一子網中其它節點相連纔有效,要與子網外的節點相連,可能要涉及.net 中的更高級話題,就不太清楚了。

 

六.             後記:

本文中的並行算法相對簡單,沒有涉及並行計算的高級算法及其它內容,如子任務間並沒有傳遞數據。使用.net remoting是否適合作並行計算呢?當在科學計算領域中已經有現成的MPIMVP等並行通訊庫可用時?如果可以出現MPI for C#,那真是一大福音。(好像俄羅斯的專家們已經實現了這個項目,叫做T-System[2])。如果有時間,希望會在以後我文章中繼承研究用.net remoting進行並行計算。國外的一些研究組好像已經有不少開始這方面的研究,希望有興趣的朋友和本人聯繫,一同探討。

 

2004420日星期二

[email protected]

 

參考文獻:

1. Parallel Computing with .NET RemotingEric Bergman-Terrell

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnhcvs03/html/vs03d1.asp

2. Alexander ChudinovVladimir RoganovParallel Computing Runtime for Microsoft .NET Framework

wscg.zcu.cz/Rotor/NET_2003/Papers/Chudinov.pdf

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章