明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

使用.net Remtoing進(jìn)行并行計(jì)算

[摘要]使用.net Remtoing并行計(jì)算摘要,本文分析了一個(gè)使用.net romoting進(jìn)行并行計(jì)算PI值的程序,并給出結(jié)果及性能分析。 在MSDN上發(fā)現(xiàn)一篇文章是介紹如何使用.net Remoti...
使用.net Remtoing并行計(jì)算
摘要,本文分析了一個(gè)使用.net romoting進(jìn)行并行計(jì)算PI值的程序,

并給出結(jié)果及性能分析。



在MSDN上發(fā)現(xiàn)一篇文章是介紹如何使用.net Remoting進(jìn)行并行計(jì)算的,剛好本人對(duì)并行計(jì)算很有興趣,于是仔細(xì)地分析了一下此程序的代碼。原文及程序可以在此處獲得。由于覺得原文只是作了一個(gè)大致的講解,有很多細(xì)節(jié)只是掩藏在源代碼中,所以在花了很多時(shí)間分析完源程序后,才對(duì)原文有了很深的理解,疏理出一些內(nèi)容出來和大家分享。



一. 概述

.NET Remtoing用于在遠(yuǎn)程服務(wù)器和客戶機(jī)之間互相調(diào)用對(duì)象,這些對(duì)象是存在于同一AppDomain中的。它使用Soap或二進(jìn)制的方式傳遞消息(即要調(diào)用的對(duì)象),傳送協(xié)議為HTTP或TCP。



二. Remoting如何實(shí)現(xiàn)并行計(jì)算?

.NET Remoting與并行計(jì)算好像是兩個(gè)不同的概念,前者更類似于分布式計(jì)算和Web Service,而后者實(shí)際上是計(jì)算粒度更小的任務(wù),但它將一個(gè)計(jì)算任務(wù)分配給多個(gè)節(jié)點(diǎn)計(jì)算,然后匯總成一個(gè)結(jié)果返回。

根據(jù)以上思想,實(shí)現(xiàn)上將分布的對(duì)象的粒度設(shè)計(jì)小一點(diǎn)即可實(shí)現(xiàn)并行計(jì)算。并行計(jì)算的一個(gè)關(guān)鍵因素是進(jìn)程(或子任務(wù))間通訊,而我們把.net remoting中的對(duì)象間通訊作為進(jìn)程間通訊即可。

本例并行計(jì)算Pi的小數(shù)點(diǎn),精確到N位。使用.net remoting可以如下實(shí)現(xiàn)。在每個(gè)節(jié)點(diǎn)上運(yùn)行相同的程序,但每個(gè)節(jié)點(diǎn)計(jì)算不同位置的小數(shù)位,如NodeA計(jì)算小數(shù)點(diǎn)后1-9位,NodeB計(jì)算10-18位,NodeC計(jì)算19-27位,這樣最終匯總的結(jié)果就可以有1-27位。由于是并行計(jì)算,比起單機(jī)計(jì)算,時(shí)間要快上很多倍,其加速比與每臺(tái)節(jié)點(diǎn)的速度及整個(gè)通信網(wǎng)絡(luò)的速度有關(guān)。計(jì)算模型如下圖所示:


三. 并行算法

要進(jìn)行并行計(jì)算,首先要設(shè)計(jì)好并行算法和通訊模式。由于我們只是在PC機(jī)群進(jìn)行并行計(jì)算,所以采用了最簡單的主從式并行模型,即由一個(gè)主進(jìn)程負(fù)責(zé)任務(wù)的分發(fā),結(jié)果的歸約,將子任務(wù)平均分配到每個(gè)節(jié)點(diǎn)上計(jì)算。

但實(shí)際上本文中使用的并不是平均分配任務(wù),而是更好的任務(wù)池工作方式。即每個(gè)節(jié)點(diǎn)計(jì)算完一個(gè)子任務(wù)后,會(huì)向主進(jìn)程申請(qǐng)新的任務(wù),一直到任務(wù)全部計(jì)算完為止,這樣的好處是計(jì)算能力越強(qiáng)的節(jié)點(diǎn)計(jì)算的任務(wù)也越多。比起平均分配來說可以提高總體的計(jì)算和減少同步時(shí)間。






四. 程序結(jié)構(gòu)

此程序主要由以下幾個(gè)包組成,


l 4.1) ServerLoader

用于加載提供可遠(yuǎn)程調(diào)用的服務(wù)器對(duì)象,指定調(diào)用使用的網(wǎng)絡(luò)協(xié)議和端口,以便于在局域網(wǎng)中被調(diào)用,然后偵聽來自客戶端的請(qǐng)求,在服務(wù)器上處理此請(qǐng)求并返回結(jié)果。

簡單來說即每個(gè)節(jié)點(diǎn)都必須運(yùn)行ServerLoader程序,以向外界聲明可被調(diào)用的對(duì)象(即Plouffe_bellard.dll中的對(duì)象)。



以下代碼為調(diào)用配置文件:

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 4.2) Plouffe_bellard

這就是.NET Remoting中的實(shí)際被調(diào)用的遠(yuǎn)程對(duì)象,它被置于每個(gè)節(jié)點(diǎn)上。它是繼承自System.MarshalByRefObject,這樣的派生對(duì)象從來都不會(huì)離開它的應(yīng)用域,客戶就可以通過代理對(duì)象調(diào)用遠(yuǎn)程對(duì)象的方法。

它是用來計(jì)算圓周率PI的小數(shù)點(diǎn)位數(shù)的程序,Plouffe_Bellard算法具有很好的并行性,它可以指定要計(jì)算的小數(shù)點(diǎn)的位置,如第二節(jié)所述。

其函數(shù)形式為:



public class Plouffe_Bellard : System.MarshalByRefObject

{

public String CalculatePiDigits(int n)

{ … }

}



l 4.3)DigitsOfPi

此子基礎(chǔ)上為整個(gè)項(xiàng)目核心部分,可作為客戶端程序運(yùn)行。它主要實(shí)現(xiàn)主界面UI處理、節(jié)點(diǎn)配置,多線程創(chuàng)建與同步,計(jì)算任務(wù)分配與匯總的功能,只需要在任何一臺(tái)節(jié)點(diǎn)上運(yùn)行即可。包括以下幾個(gè)對(duì)象:

MainForm,SolutionArray,SolutionItem,RemotingObject,CalculationThread。

n mainForm:即處理UI對(duì)象

n SolutionArray是并行線程分配與管理程序,如:任務(wù)池創(chuàng)建、任務(wù)分配、線程創(chuàng)建、同步線程, 匯聚結(jié)果等。

n SolutionItem即任務(wù)的數(shù)據(jù)結(jié)構(gòu)。包括要計(jì)算的小數(shù)點(diǎn)位, 計(jì)算的結(jié)果, 計(jì)算的在機(jī)器。

n RemotingObject是RemotePiCalculator,用于獲取遠(yuǎn)程對(duì)象。

n CalculationThread:計(jì)算模塊,在線程中運(yùn)算(由SolutionArray產(chǎn)生和調(diào)用),并不斷從任務(wù)池中取得任務(wù)進(jìn)行計(jì)算。



以下為這幾個(gè)對(duì)象的序列圖:








當(dāng)遠(yuǎn)程對(duì)象的CalculatePiDigits被客戶端程序調(diào)用時(shí),此要求即被發(fā)送到遠(yuǎn)程機(jī)器的ServerLoader對(duì)象。然后服務(wù)器上的對(duì)象就會(huì)計(jì)算結(jié)果。最后將計(jì)算的結(jié)果返回給客戶端程序,顯示在文本框中。



五. 結(jié)果分析

機(jī)器配置說明

MOORE 700MHz AMD Duron 192M SDR

LOZIT 1.8GHz Batumn 256M DDR

時(shí)間比較




由于算法的特性,計(jì)算到高位時(shí)可以看到計(jì)算速度逐漸變慢。在我們的機(jī)器上,算到第3000位附近速度已經(jīng)是非常之慢,忍受不住終于中斷,一共計(jì)算了3330位,共耗時(shí)719545 ms,即12分鐘。在實(shí)驗(yàn)中還發(fā)現(xiàn),節(jié)點(diǎn)只能與同一子網(wǎng)中其它節(jié)點(diǎn)相連才有效,要與子網(wǎng)外的節(jié)點(diǎn)相連,可能要涉及.net 中的更高級(jí)話題,就不太清楚了。



六. 后記:

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