2010-01-24 68 views
3

我剛剛完成了D編程語言的任務池/並行化庫的重要修訂。我對the API評論感興趣,尤其感興趣的人不是D的常用用戶,但對這類圖書館的使用案例知之甚少。我想避免通過詢問僅有相對較小的硬核D用戶羣體的意見而產生的羣體思想。任務/並行化庫的API設計

  1. 您是否認爲API被設計到了正確的級別,即不是可笑的過度或未被設計的?

  2. 您是否認爲該文檔足夠清晰,以至於某個不是D古魯的人可以弄清楚如何使用它?

  3. 您是否認爲應該添加任何主要的缺失功能或應該刪除的無用功能?

  4. 您認爲這是一個好的設計嗎?

+0

社區wiki,也許? – 2010-01-24 17:10:21

回答

2

免責聲明:用D 2.0可能10天左右(勾選「不定期使用D」)。我認爲這是一個機會了解D.

關於1和2的東西:容易(在本例中writeln("Sum = ", myFuture.spinWait());也許應該writeln("Sum = ", myTask.spinWait());)閱讀和理解。

關於3: a parallel prefix會很好。而我對D的瞭解不夠,但我想互斥體是在別的地方定義的。

關於4:您的設計似乎表明您有工作池,啓動一些線程,然後線程從該池中竊取任務。現在,我調整了我的瓶頸(主要是我自己製造的)。除了NUMA和「智能地」在互斥體的幫助下序列化事物之外,池還可以在序列化程序和引入開銷方面非常「成功」。我知道API並不妨礙良好的實施。只是讓我想知道:爲什麼map,reduce,parallel_for not functions?如果這些都是方法,D是否會提供優勢?

編輯:我玩過你的圖書館,它很好。對於大多數計算和低內存使用情況,它也可以很好地擴展(相對於手動編碼的線程)。我想重申我已經作出了兩點建議:

  1. 我會考慮分離算法(數據並行)和任務組(任務並行)。這將使它更接近更常見的C++庫(TBB,OpenMP,MS PPL和TPL)。另外從實現的角度來看:您可能希望在將來沒有任務組的情況下安排數據並列(例如GPU綁定)或使用附加信息(例如內存佈局)。

  2. 這已經意味着可以使調度程序獨立於TaskPool。此外,我還會考慮將調度程序設置爲單例。引用英特爾的TBB FAQ爲什麼調度是單:

[...]一些庫控制計劃範圍的 資源,如內存和處理器 。例如,垃圾收集器控制跨程序的內存分配 。類似地,TBB 控制 程序中的任務調度。爲了有效地完成他們的工作, 每一個都必須是單身人士; [...] 允許在單個程序中使用TBB 調度程序的k個實例,因此 會使硬件線程的軟件線程數爲k倍。 程序將低效運行 ,因爲機器 將超額訂閱因子爲 k,導致更多的上下文切換, 緩存爭用和內存 消耗。

+0

reduce,map和parallel foreach是方法,因爲它們使用池而不是啓動新線程。在TaskPool的一個實例上調用這些方法是指定要將作業提交到的池。 – dsimcha 2010-02-20 19:21:59

+0

@dsimcha:有趣。標準的C++庫(OpenMP,TBB)分離算法,任務(和任務組)以及任務調度程序。您的評論似乎表明TaskPool也是調度程序?調度程序不是單身人士嗎?我想這是代碼:http://dsource.org/projects/scrapple/browser/trunk/parallelFuture/parallelFuture.d。會看看。 – stephan 2010-02-20 22:31:13

+0

調度器不是單例,TaskPool也是調度器。實際上,我有其中一個以上的實際用例。一個例子是當我的一個池中的所有線程阻塞等待一個對象被構建時,所以我啓動了第二個池來並行化該對象的構造。 – dsimcha 2010-02-20 23:22:09