mpi中程式在集群中的分發

2021-06-16 15:56:38 字數 1469 閱讀 2162

我們在開發mpi程式時,由於其是分布式程式,我們在單個節點上完成編碼後,需要將**拷貝到整個集群進行測試。集群之間的檔案拷貝可以通過scp命令完成。但是scp命令是針對兩個節點之間檔案互傳設計,為了將**拷貝到所有的機器,我們需要多次呼叫scp命令。乙個好的方法是將拷貝命令寫成指令碼,讓其自動完成。

首次拷貝時,我們可以讓scp拷貝整個工作目錄到集群中,當專案較小時這種方法沒有影響,但是當專案規模變大,拷貝將變得很費時。其實我們每次只對某個檔案進行修改,然後重新編譯進行測試。所以這時就沒有必要將整個專案進行拷貝,只需要拷貝最新修改的幾個檔案即可。一種方法是將要拷貝的檔案以引數形式傳遞給指令碼,然後啟動拷貝任務。

但是修改乙個源程式檔案,往往涉及多個檔案的修改,例如修改乙個cpp檔案,重新編譯之後對應的.o檔案和可執行檔案都被修改。如果原始檔之間有依賴關係,修改的檔案將會更多。因而通過引數形式宣告要拷貝的檔案還是有點麻煩。在實際情況中,我們往往按照這樣的流程開發程式:修改乙個檔案,編譯,然後立即將其分發到集群中進行測試。根據這個習慣,我們可以通過檢查檔案的修改時間來確定系統中哪些檔案剛被修改,然後只拷貝這些與當前時間一樣或者很接近的檔案即可。下面的**給出了乙個簡單的例子,程式在node1上編寫,然後拷貝到集群中的node2-4中。判斷檔案被修改的方法就是檢查檔案的修改時間和當前時間是否一樣,一樣說明該檔案剛被修改過。

#!/bin/sh

echo "copy to node2, node3, node4"

current_time=$(date | cut -d' ' -f4|cut -d':' -f1,2)

for file in $(ls ~/ygch/mpi/qbh/); do

m_time=$(ls -l $file |cut -d' ' -f8)

if [ $m_time = $current_time ]; then

scp ~/ygch/mpi/qbh/$file root@node2:~/ygch/mpi/qbh/

scp ~/ygch/mpi/qbh/$file root@node3:~/ygch/mpi/qbh/

scp ~/ygch/mpi/qbh/$file root@node4:~/ygch/mpi/qbh/

fidone

獲取檔案訪問時間可以通過ls –l命令獲得,執行該命令的結果是:

紅色方框裡面的即是檔案的修改時間,然後我們通過cut命令提取該列即可獲得檔案的修改時間。當前時間可以利用date命令獲得,執行結果是:

然後我們也通過cut命令獲取當前時間,與ls –l命令稍微有點不同,我們需要兩次利用cut命令獲取和ls –l一樣的時間。最後查詢目錄中兩個時間一致的檔案拷貝到集群中所有其他節點中。

在上例中檔案被修改的標誌是檔案修改時間和當前時間一致,這個是最簡單的方法,我們可以依照實際情況調整判別依據,但是上述方法足以應付絕大多數情況。

C C 中程式在使用堆記憶體時的記憶體復用問題

在乙個c c 程式中,如果使用了堆記憶體的管理機制,那麼記憶體究竟是怎麼分配與 的呢?先看乙個程式 include using namespace std int main void 這裡是因為程式使用了堆的記憶體管理機制,存在記憶體復用的問題。整個過程是 在程式釋放了x的把記憶體時,緊接著又分配了...

git 在開發中程式設計師最基本最有用的幾步

我們在平時的開發之中源 管理工具是必須要用的,有的使用的svn,有的使用的是git。今天我就說一下git的最基本的使用。首先使用git可能你會用在github或者oschina進行託管,你需要有乙個ssh。如果你還沒有申請過的話,那麼請看這裡 進入終端 生成ssh ssh keygen t rsa ...

zookeeper在storm集群中的應用

1.心跳檢測,儲存supervisor和worker的心跳 包括它們的狀態 使得nimbus可以監控整個集群的狀態,從而重啟一些掛掉的worker 2.提交任務 3.儲存整個集群的所有狀態資訊,供ui顯示 4.storm在zk上的儲存結構 storm在zookeeper上的根目錄 預設為 storm...