簡體   English   中英

C ++可執行程序的分布式計算

[英]c++ Distributed computing of an executable program

我想知道是否可以在不添加源代碼的情況下運行可執行程序,就像在多台計算機上運行任何游戲一樣。 當我在用C#編程時,我注意到一個處理方法,該方法可以讓您召喚或關閉任何應用程序或進程,我想知道是否與c ++類似,可以讓我將任何可執行文件或游戲的進程傳輸到其他計算機或服務器可最大程度地減少我計算機的處理器消耗。

謝謝。

一切皆有可能,但這將需要大量工作,並且幾乎可以肯定會使您的程序變慢(我在這里談論的是數百萬或數十億的因素)。 本質上,您需要確保程序中使用的每個層都允許這樣做。 因此,您必須重寫OS才能做到這一點,而且還需要重寫許多使用的庫。

為什么? 假設您要在不同的計算機上分配實際線程。 如果這是實際的過程,那會稍微容易些,但是令我驚訝的是,許多應用程序都是這樣工作的。

首先,您需要同步內存,尤其是所有非線程本地存儲,這通常意味着“所有內存”,因為並非所有語言都具有線程感知的內存模型。 當然,可以對此進行優化,例如,如果您的系統具有這樣的概念,則將所有內容緩沖到遇到“原子”讀取或寫入為止。 現在,您能想象每當必須鎖定/解鎖線程或必須讀取/寫入一個原子變量時,每個阻塞了幾秒鍾的同步嗎?

除此之外,還有與設備管理有關的問題。 假設您需要網絡連接:哪個設備將啟動此連接,如何選擇IP,...? 為了無縫解決此問題,您可能需要在所有平台之間共享一個虛擬設備。 這對於網絡設備,文件系統,打印機,監視器等都必須發生。 正如您所提到的,游戲:GPU也應該發生這種情況,只需想象一下這將對僅從GPU發送數據或向GPU發送數據會如何影響性能(提示:甚至16xpci-e通常已經成為瓶頸)。

結論:這是不可行的,如果您想要集群應用程序,則必須從頭開始將其構建到應用程序中。

我相信您可以做的最接近的事情是MapReduce :這是一個范例,希望很快會成為官方boost庫的一部分。 但是,我認為您不希望將其應用於游戲等實時應用程序。

一個相關的問題可能會提供更多答案: https : //stackoverflow.com/questions/2168558/is-there-anything-like-hadoop-in-c

但是正如KillianDS指出的那樣,沒有自動的方法可以做到這一點,而且似乎也沒有可行的方法可以做到這一點。 那么,您要解決的確切問題是什么?

當前的研究狀態是實用的方法,可以在一台計算機上的多個CPU內核之間分配進程的工作。 在這種情況下,這些處理器仍共享RAM。 這很重要:RAM延遲以納秒為單位進行測量。

在分布式計算中,遠程內存訪問可能要花費數十甚至數百微秒。 分布式算法明確考慮了這一點。 沒有任何魔法可以使它消失:光本身是緩慢的。

AT&T貝爾實驗室的Plan 9 OS以最無縫和透明的方式支持分布式計算。 計划9旨在將Unix將工作分解為可互操作的小任務的想法,這些想法由高度專業的實用程序執行,“一切都是文件”以及客戶機/服務器模型達到了一個全新的水平。 它具有一個CPU服務器的想法,該CPU服務器可為功能較弱的網絡客戶端執行計算。 不幸的是,這個想法過於雄心勃勃,遠遠超出了它的時間,而Plan 9仍然是一個更大的研究項目。 但是,它仍被開發為開源軟件。

MOSIX是另一個分布式OS項目,可在多台計算機上提供單個進程空間,並支持透明的進程遷移。 它允許進程變得可遷移,而無需更改其源代碼,因為所有上下文保存和還原均由OS內核完成。 MOSIX模型有多種實現方式-MOSIX2,openMosix(自2008年起停產)和LinuxPMI(openMosix項目的延續)。

ScaleMP是又一個商業的單一系統映像(SSI)實施,主要針對數據處理和高性能計算。 它不僅提供群集節點之間的透明遷移,而且還提供模擬的共享內存(稱為分布式共享內存)。 基本上,它將一堆通過非常快速的網絡連接的計算機轉變為一台具有許多CPU和大量內存的大型NUMA計算機。

這些都不會讓您在PC上啟動游戲,並透明地遷移並在網絡上的某處執行。 此外,大多數游戲都是GPU密集型的,而CPU卻不是那么密集的-大多數游戲甚至都沒有利用多核CPU的全部計算能力。 我們這里有一個ScaleMP集群,它不能很好地運行Quake ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM