在MSDN上發現一篇文章是介紹如何使 Remoting進行並行計算的
剛好本人對並行計算很有興趣
於是仔細地分析了一下此程序的代碼
原文及程序可以在此處獲得
由於覺得原文只是作了一個大致的講解
有很多細節只是掩藏在源代碼中
所以在花了很多時間分析完源程序後
才對原文有了很深的理解
疏理出一些內容出來和大家分享
一.概述 NET Remtoing用於在遠程服務器和客戶機之間互相調用對象
這些對象是存在於同一AppDomain中的
它使用Soap或二進制的方式傳遞消息(即要調用的對象)
傳送協議為HTTP或TCP
二.Remoting如何實現並行計算? NET Remoting與並行計算好像是兩個不同的概念
前者更類似於分布式計算和Web Service
而後者實際上是計算粒度更小的任務
但它將一個計算任務分配給多個節點計算
然後匯總成一個結果返回
根據以上思想
實現上將分布的對象的粒度設計小一點即可實現並行計算
並行計算的一個關鍵因素是進程(或子任務)間通訊
而我們 remoting中的對象間通訊作為進程間通訊即可
本例並行計算Pi的小數點
精確到N位
使 remoting可以如下實現
在每個節點上運行相同的程序
但每個節點計算不同位置的小數位
如NodeA計算小數點後
位
NodeB計算
位
NodeC計算
位
這樣最終匯總的結果就可以有
位
由於是並行計算
比起單機計算
時間要快上很多倍
其加速比與每台節點的速度及整個通信網絡的速度有關
計算模型如下圖所示
三.並行算法 要進行並行計算
首先要設計好並行算法和通訊模式
由於我們只是在PC機群進行並行計算
所以采用了最簡單的主從式並行模型
即由一個主進程負責任務的分發
結果的歸約
將子任務平均分配到每個節點上計算
但實際上本文中使用的並不是平均分配任務
而是更好的任務池工作方式
即每個節點計算完一個子任務後
會向主進程申請新的任務
一直到任務全部計算完為止
這樣的好處是計算能力越強的節點計算的任務也越多
比起平均分配來說可以提高總體的計算和減少同步時間
四.程序結構 此程序主要由以下幾個包組成
●
.
) ServerLoader
用於加載提供可遠程調用的服務器對象
指定調用使用的網絡協議和端口
以便於在局域網中被調用
然後偵聽來自客戶端的請求
在服務器上處理此請求並返回結果
簡單來說即每個節點都必須運行ServerLoader程序
以向外界聲明可被調用的對象(即Plouffe_bellard
dll中的對象)
以下代碼為調用配置文件
String ConfigFilePath = Path
GetDirectoryName(Application
ExecutablePath) + ServerLoader
nfig
;
RemotingConfiguration
Configure(ConfigFilePath);
配置文件為
nfig
<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=
/>
</channels>
</application>
</system
runtime
remoting>
</configuration>
●
.
) Plouffe_bellard
這就是
NET Remoting中的實際被調用的遠程對象
它被置於每個節點上
它是繼承自System
MarshalByRefObject
這樣的派生對象從來都不會離開它的應用域
客戶就可以通過代理對象調用遠程對象的方法
它是用來計算圓周率PI的小數點位數的程序
Plouffe_Bellard算法具有很好的並行性
它可以指定要計算的小數點的位置
如第二節所述
其函數形式為
public class Plouffe_Bellard : System
MarshalByRefObject
{
public String CalculatePiDigits(int n)
{ … }
}
●
.
)DigitsOfPi
此子基礎上為整個項目核心部分
可作為客戶端程序運行
它主要實現主界面UI處理
節點配置
多線程創建與同步
計算任務分配與匯總的功能
只需要在任何一台節點上運行即可
包括以下幾個對象
MainForm
SolutionArray
SolutionItem
RemotingObject
CalculationThread
■ mainForm
即處理UI對象
■ SolutionArray是並行線程分配與管理程序
如:任務池創建
任務分配
線程創建
同步線程
匯聚結果等
■ SolutionItem即任務的數據結構
包括要計算的小數點位
計算的結果
計算的在機器
■ RemotingObject是RemotePiCalculator
用於獲取遠程對象
■ CalculationThread
計算模塊
在線程中運算(由SolutionArray產生和調用)
並不斷從任務池中取得任務進行計算
以下為這幾個對象的序列圖
educitycn/img_///jpg> 當遠程對象的CalculatePiDigits被客戶端程序調用時
此要求即被發送到遠程機器的ServerLoader對象
然後服務器上的對象就會計算結果
最後將計算的結果返回給客戶端程序
顯示在文本框中
五.結果分析 機器配置說明
MOORE
MHz AMD Duron
M SDR
LOZIT
GHz Batumn
M DDR
時間比較
educitycn/img_///jpg> 由於算法的特性
計算到高位時可以看到計算速度逐漸變慢
在我們的機器上
算到第
位附近速度已經是非常之慢
忍受不住終於中斷
一共計算了
位
共耗時
ms
即
分鐘
在實驗中還發現
節點只能與同一子網中其它節點相連才有效
要與子網外的節點相連
可能要涉 中的更高級話題
就不太清楚了
六.後記 本文中的並行算法相對簡單
沒有涉及並行計算的高級算法及其它內容
如子任務間並沒有傳遞數據
使 remoting是否適合作並行計算呢?當在科學計算領域中已經有現成的MPI
MVP等並行通訊庫可用時?如果可以出現MPI for C#
那真是一大福音
(好像俄羅斯的專家們已經實現了這個項目
叫做T
System[
])
如果有時間
希望會在以後我文章中繼承研究 remoting進行並行計算
國外的一些研究組好像已經有不少開始這方面的研究
希望有興趣的朋友和本人聯系
一同探討
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26526.html