簡體   English   中英

在R parallel :: mcparallel中,是否有可能限制一次使用的內核數?

[英]Is it possible, in R parallel::mcparallel, to limit the number of cores used at any one time?

在R中, parallel包中的mcparallel()函數每次都會將新任務派生給工作程序。 例如,如果我的計算機具有N個(物理)核心,而我分叉了2N個任務,則每個核心都會開始運行兩個任務,這是不希望的。 我希望能夠在N個工作線程上開始運行N個任務,然后在完成每個任務后,將下一個任務提交到現在可用的核心中。 是否有捷徑可尋?

我的任務花費的時間不同,因此不能選擇分批分發N個任務。可能有一些解決方法,例如檢查活動核心的數量,然后在空閑時提交新任務,但是有誰知道一個簡單的解決方案?

我試過設置cl <- makeForkCluster(nnodes=N) ,的確設置了N個內核,但是mcparallel()並沒有使用mcparallel() 確實,似乎沒有辦法將cl送入mcparallel() 后者有一個選項mc.affinity ,但目前尚不清楚如何使用它,而且它似乎也無法滿足我的要求(根據文檔,其功能取決於機器)。

您至少有兩種可能性:

  1. 如上所述,您可以使用mcparallel的參數“ mc.cores”或“ mc.affinity”。 在AMD平台上,首選“ mc.affinity”,因為兩個內核共享同一時鍾。 例如,FX-8350具有8個核心,但是核心0與核心1具有相同的時鍾。如果僅針對2個核心啟動任務,則最好將其分配給核心0和1,而不是0和2。 ”。 價格正在失去負載平衡。

    軟件包的最新版本中包含“ mc.affinity”。 請參閱changelog以查找引入的內容。

  2. 您也可以使用OS的工具來設置相似性,例如“任務集”:

    / usr / bin / taskset -c 0-1 / usr / bin / R ...

    在這里,您可以使腳本僅在核心0和1上運行。

請記住,Linux將其內核從“ 0”開始編號。 程序包並行符合R的索引,並且第一個核心是核心編號1。

我建議並行利用包含此功能的更高級別的功能,而不要嘗試強迫低級功能執行您想要的操作。

在這種情況下,請嘗試將您的任務編寫為單個函數的不同參數。 然后,可以將mc.preschedule參數設置為TRUE並將mc.cores參數設置為一次要使用的線程數來使用mclapply()。 每次任務完成並關閉線程時,都會創建一個新線程,對下一個可用任務進行操作。

即使每個任務使用完全不同的代碼位,您也可以創建函數列表並將其傳遞給包裝函數。 例如,以下代碼一次執行兩個功能。

f1 <- function(x) {x^2}
f2 <- function(x) {2*x}
f3 <- function(x) {3*x}
f4 <- function(x) {x*3}
params <- list(f1,f2,f3,f4)
wrapper <- function(f,inx){f(inx)}
output <- mclapply(params,FUN=calling,mc.preschedule=TRUE,mc.cores=2,inx=5)

如果需要,可以使params為列表列表,其中包括要傳遞給每個函數的各種參數以及函數定義。 我經常將此方法用於不同長度的各種任務,並且效果很好。

當然,您的各種任務可能只是對同一函數的不同調用,在這種情況下,您可以直接使用mclapply,而無需編寫包裝函數。

暫無
暫無

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

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