2016-03-05 80 views
0

我有一些代碼,當它迭代循環時,每次處理的內容會增長一定的百分比。最初的幾次迭代需要4秒,但到了第100次,他們需要幾分鐘 - 這是一個精簡的參數選擇,因爲我打算做350次迭代。要用這個做嚴肅的研究需要花費很多時間,而且真的很不方便,只需運行一個腳本就可以將Matlab的手背在背後,直到全部完成爲止,並且最重要的是它幾乎不會一次使用多個內核。Matlab - 批處理作業不會排隊等待

我知道打開並行池將啓用並行處理。即使我無法將for環路中的任何一個轉換爲parfor環路,我知道將作爲batch作業的腳本作爲後臺運行,我可以使用Matlab界面和其他7個處理器執行其他任務,而我等待這一個完成。

但是,儘管我已經啓動了本地並行池,並且已經檢查了啓動批處理作業的語法,但它並未離開「排隊」狀態。我第一次輸入batch('Script4')並按Enter鍵,然後意識到我必須有一個變量名稱作爲工作,所以我做了run1 = batch('Script4')。我輸入get(run1,'State'),並檢查了Job Monitor,並告訴我它的狀態是「排隊」的。

在我來到這裏之前,我做了一些Google搜索,雖然我發現了一些問題,但在類似的體驗中,似乎是通過等待池停止使用整個CPU啓動時才解決的。但是我很久以前就開始使用我的遊戲池了(現在它仍然在運行!),並且當我輸入第一個batch命令時,我的第一個線索是,Windows任務管理器說所有8個內核都處於0 %。

在開始執行排隊作業之前,是否需要調用或調整?

我在Windows 7 Enterprise上使用Matlab R2015a。

+0

我試圖運行那個叫'parfor'在命令窗口中的函數,它在141秒內完成了.235秒的工作,當我移除「par」時,所以看起來工具箱正在工作。 – Post169

+0

你應該分享你的代碼,這是分析複雜,沒有任何額外的信息。坦率的猜測,你是否有動態的代碼中的矩陣重新分配? –

+0

我明白爲什麼改變一個矩陣的結構會混淆一個parfor循環,但這樣做是否真的會弄亂一批?我對批處理的理解是,它將腳本放在後臺運行的核心數量與其它的核心數量相同(或者更多),但它會處理所有變量,就像它正在執行命令窗口一樣,除非它不執行't,所以它可能不適合交互式程序。除此之外還有更多嗎? – Post169

回答

1

我認爲這裏的問題是,您正在嘗試在並行池打開時運行batch作業。 (不幸的是,這是一個常見的誤解)。基本上,並行池和你的工作都試圖消費本地工人。但是,由於首先打開了並行池,因此它正在消耗所有本地工作人員,並且batch作業無法繼續。你應該看到一個警告,當你提交batch工作,像這樣:

>> parpool('local'); 
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers. 
>> j = batch(@rand, 1, {}); 
Warning: This job will remain queued until the Parallel Pool is closed. 

有兩種可能的解決方法 - 首先是簡單

delete(gcp('nocreate')) 

將確保沒有平行遊泳池的開放時間,和你的batch提交應繼續進行。如果你的任務是相對短命第二個是比較合適的 - 你可以使用parfeval提交工作,一個開放的並行池:

f = parfeval(@rand, 1); % initiate 'rand' on the parallel pool workers 
fetchOutputs(f); % wait for completion, and retrieve the result 
+0

我試着運行'j5 = batch(Script4)'並沒有錯誤。現在我會看到結果是什麼樣子! (這些腳本需要24小時才能運行;我已經將它們加速了幾倍,但在批處理中我看不到任何'display'函數輸出。) – Post169