国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

使用.net Remtoing進行并行計算

2024-07-10 12:59:23
字體:
來源:轉載
供稿:網(wǎng)友
  • 本文來源于網(wǎng)頁設計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • 使用.net remtoing并行計算
    摘要,本文分析了一個使用.net romoting進行并行計算pi值的程序,

    并給出結果及性能分析。



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



    一. 概述

    .net remtoing用于在遠程服務器和客戶機之間互相調用對象,這些對象是存在于同一appdomain中的。它使用soap或二進制的方式傳遞消息(即要調用的對象),傳送協(xié)議為http或tcp。



    二. remoting如何實現(xiàn)并行計算?

    .net remoting與并行計算好像是兩個不同的概念,前者更類似于分布式計算和web service,而后者實際上是計算粒度更小的任務,但它將一個計算任務分配給多個節(jié)點計算,然后匯總成一個結果返回。

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

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


    三. 并行算法

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

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






    四. 程序結構

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


    l 4.1) serverloader

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

    簡單來說即每個節(jié)點都必須運行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 4.2) plouffe_bellard

    這就是.net remoting中的實際被調用的遠程對象,它被置于每個節(jié)點上。它是繼承自system.marshalbyrefobject,這樣的派生對象從來都不會離開它的應用域,客戶就可以通過代理對象調用遠程對象的方法。

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

    其函數(shù)形式為:



    public class plouffe_bellard : system.marshalbyrefobject

    {

    public string calculatepidigits(int n)

    { … }

    }



    l 4.3)digitsofpi

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

    mainform,solutionarray,solutionitem,remotingobject,calculationthread。

    n mainform:即處理ui對象

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

    n solutionitem即任務的數(shù)據(jù)結構。包括要計算的小數(shù)點位, 計算的結果, 計算的在機器。

    n remotingobject是remotepicalculator,用于獲取遠程對象。

    n calculationthread:計算模塊,在線程中運算(由solutionarray產(chǎn)生和調用),并不斷從任務池中取得任務進行計算。



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








    當遠程對象的calculatepidigits被客戶端程序調用時,此要求即被發(fā)送到遠程機器的serverloader對象。然后服務器上的對象就會計算結果。最后將計算的結果返回給客戶端程序,顯示在文本框中。



    五. 結果分析

    機器配置說明

    moore 700mhz amd duron 192m sdr

    lozit 1.8ghz batumn 256m ddr

    時間比較




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



    六. 后記:

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



    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 阳谷县| 墨玉县| 灵台县| 丰宁| 和田市| 西丰县| 来宾市| 鄢陵县| 通榆县| 林芝县| 和田市| 怀集县| 大港区| 馆陶县| 彭阳县| 美姑县| 仁化县| 富裕县| 云林县| 四川省| 和顺县| 通海县| 浙江省| 荣昌县| 沁水县| 双峰县| 聂拉木县| 宁夏| 鸡泽县| 乌鲁木齐县| 安新县| 廉江市| 禹州市| 昔阳县| 南宁市| 天祝| 云林县| 库尔勒市| 新源县| 双辽市| 衡阳县|