2012-03-13 13 views
5

假設一臺具有8個內核的機器。 在Haskell中,可以使用threaded選項編譯,然後在運行時使用+RTS -Nx指定要使用的核心數。例如如何進行F#測量以獲得加速

$ myprg args // sequential run 
$ myprg args +RTS -N1 // parallel run on 1..8 cores 
$ myprg args +RTS -N2 
$ myprg args +RTS -N4 
$ myprg args +RTS -N8 

由此,您可以使用越來越多的內核獲得運行時,然後您可以使用它來獲得加速並繪製圖形。

你如何在F#中做到這一點,假設我有一個並行程序如在代碼中使用平行映射?

編輯: 我發現有ParallelOptions例如, MaxDegreeOfParallelism可以是我需要什麼,但不知道其確切的行爲,我將不得不以編程方式使用它這是很好的,只要它的行爲與預期即MaxDegreeOfParallelism =核計劃的NUM應該使用,而不是平行的「任務'或線程。

編輯: ProcessorAffinity確實限制了內核使用的數量,但它似乎沒有正確單執行。我檢查了Windows,它似乎工作。雖然使用它並不是一個好主意。運行時系統應該能夠更好地決定如何管理和調度任務。此外,MaxDegreeOfParallelism是關於「並行度級別」,它基本上設置了生成的任務數量,因此可用於改變粒度。

+2

如果你使用的是Windows,你可以設置在任務管理器的CPU數量:http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an -application-in-windows/ – 2012-03-13 04:18:32

+0

我正在使用Linux/mono。有沒有辦法在Linux下做同樣的事情? – vis 2012-03-13 04:21:23

+6

F#構建一個本地.NET程序集。程序集遵循爲運行時指定的規則(CLR),默認情況下,該規則對所有CPU核心具有親和力。 通過設置System.Diagnostics.Process.GetCurrentProcess()。ProcessorAffinity',可以將CLR限制在_fewer_核心數量內。 – bytebuster 2012-03-13 04:28:50

回答

2

F#構建了一個原生.NET程序集。程序集遵循爲運行時指定的規則(CLR),默認情況下,該規則對所有CPU核心具有親和力。通過設置System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity,您可以限制CLR的減少的內核數量。

這個答案似乎是不完整的單聲道的環境。 ProcessorAffinityis a bit mask,所以0肯定是無效的條件。我也想知道爲什麼setter沒有像MSDN中描述的那樣拋出異常。

我會用schedutils來檢查單聲道親和力,並檢查是否沒有設置MONO_NO_SMP環境標誌。

2

要引用bytebuster的評論:

F#構建了一個本機.NET程序集。程序集遵循爲運行時指定的規則(CLR),默認情況下,該規則對所有CPU核心具有親和力。通過設置System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity,可以限制CLR獲得更少的內核數量。

(如果添加了一個答案發表評論,我會刪除此)

+0

您應該將答案標記爲社區wiki(如果您不是原作者)。 – 2012-03-13 16:56:22

+0

@TomasPetricek:完成 – Guvante 2012-03-13 16:59:40

+0

我試着用'ProcessorAffinity',但是在8核的機器上運行並行程序似乎沒有什麼區別。我預計將親和力設置爲1,2,4,8會提高加速度,但事實並非如此。運行時間保持不變,就好像設置此屬性沒有任何區別。任何可能發生這種情況的原因?在msdn中查看文檔後,我傾向於認爲它適用於物理處理器而不是處理器內核。 – vis 2012-03-14 13:35:13