熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

使用.net Remtoing並行計算

2013-11-23 19:15:10  來源: Java核心技術 

  在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對象然後服務器上的對象就會計算結果最後將計算的結果返回給客戶端程序顯示在文本框中
  
  五.結果分析
  機器配置說明
  
  MOORE    MHz    AMD Duron M SDR
  
  LOZIT     GHz    Batumn    M DDR
  
  時間比較
  
educitycn/img_///jpg>

  由於算法的特性計算到高位時可以看到計算速度逐漸變慢在我們的機器上算到第位附近速度已經是非常之慢忍受不住終於中斷一共計算了共耗時 ms分鐘在實驗中還發現節點只能與同一子網中其它節點相連才有效要與子網外的節點相連可能要涉 中的更高級話題就不太清楚了
  
  六.後記
  本文中的並行算法相對簡單沒有涉及並行計算的高級算法及其它內容如子任務間並沒有傳遞數據使 remoting是否適合作並行計算呢?當在科學計算領域中已經有現成的MPIMVP等並行通訊庫可用時?如果可以出現MPI for C#那真是一大福音(好像俄羅斯的專家們已經實現了這個項目叫做TSystem[])如果有時間希望會在以後我文章中繼承研究 remoting進行並行計算國外的一些研究組好像已經有不少開始這方面的研究希望有興趣的朋友和本人聯系一同探討
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26526.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.