2012-04-11 25 views
5

我正在使用Strategies編寫一個並行的Haskell程序。它沒有做它應該做的事情,我想檢查一下函數執行的是哪個Haskell執行上下文(HEC)。在Haskell中識別當前的HEC函數

是否有getHEC調用或類似的東西,可以在我的調試輸出中使用?

回答

4

通過調用Control.Concurrent中的threadCapability可以找出運行Haskell線程的功能(即CPU核心)。

如果您正在運行的+RTS -N程序時,會有一個操作系統級的線程(HEC),每個核心催生,所以通過threadCapability返回的能力號碼會告訴你你的forkIO綠色線程運行在哪個操作系統線程。但是,如果您明確指定了帶有+RTS -Nn的操作系統線程數,其中n是系統上除核心數以外的某個整數,則這可能對您而言不太有用。

您可能還會發現ThreadScope對調試和可視化並行程序的執行很有用。

+0

這正是我想要的。謝謝! – Jonatan 2012-04-11 12:16:56

+1

我應該提到的另一件事:請記住,操作系統可以自由地將線程重新安排到不同的核心上,所以在同一個Haskell線程中調用兩次的'threadCapability'返回不同值的機會很小,隨着時間的增加在呼叫之間流逝。如果通過用'forkOn'而不是'forkIO'產生線程來將線程鎖定到特定的內核,則可以避免出於調試目的。 – bitbucket 2012-04-11 12:27:32