0

對於那些希望對計算密集型算法進行並行化處理的人,請讓我使用.NET 4及更高版本的任務並行庫來指出本文檔的常見模式:https://www.microsoft.com/en-us/download/details.aspx?id=19222用於任務並行庫的大數據初始設置模式

但是,有一種模式,我認爲是相當普遍的,我沒有在那個其他真棒文檔沒有涵蓋...

我有100行的數據表中有一組輸入N我需要在M列中計算一些輸出的列。每一行都可以獨立計算,所以它似乎是並行化的首選。然而,爲了做到這一點,我需要首先構建一個海量的數據結構。一旦爲一行構建,我就可以簡單地重置它以用於另一行。所以,我不想從頭開始爲每一行重建它,這比重置要花費更多的時間。但並行計算不能共享該數據結構,因爲它們將分別修改它們......相反,它們都需要它們自己的數據結構。

Soooo算法上,我需要做的是爲每個處理器核心啓動一個線程,我可以首先構建自己的海量數據結構。然後它應該計算一行,重置,計算另一行,重置等等,直到沒有更多的行要計算爲止。

任務並行庫擁有所有的智能來管理這樣的過程......但我還沒有找到任何這種場景的例子,我需要每個線程來做大量的數據構建,計算,重置,計算,重置等等,直到完成。

這似乎是一個相當常見的模式......任何人都可以指出一個例子,說明.NET 4的任務並行庫如何支持該模式?

+0

這是一種常見的氣味,而不是一種常見的模式。如果您必須「清理並重復使用」相同的結構,則需要鎖定。餿主意。無論如何,你爲什麼需要預製結構?有什麼好處?要麼你必須替換所有的值(然後創建一個新的值),或者你正在談論常量值。 –

+0

您認爲通過重複使用結構解決了什麼實際問題?你想減少內存消耗嗎?分配?您可以使用技巧來避免分配(例如,使用正則表達式而不是字符串分割文件),或者使用緩衝池來重新使用緩衝區。 –

+0

我不需要鎖定,因爲我打算讓每個線程構建自己的基本結構實例。把它看作是世界的典範。然後每行包含該世界中發生的事情(輸入),然後需要做大量的分析以確定返回該行的結果。不需要鎖定。問題是,如果我有4個核心和1000個行,我想要構建世界的基礎模型4次,並且每個線程都乾淨並重復使用250次模型。 (我目前的順序實現是一次構建世界模型,並清理並重復使用它1000次。) –

回答

0

,我想出了這是最好的答案... 請讓我知道,如果你有更好的...或者,如果你可以看到在這個破綻......

我想我需要調用Parallel.For(0,Environment.ProcessorCount,...)並讓該代碼構建基礎結構,然後通過在共享rowIndex上執行Interlocked.Increment來開始處理行,直到處理完所有行。

通過這種方式,每個處理器最多可以構建一次基礎結構,然後重新使用......但是如果開始消耗太多內存或其他資源,那麼Parallel.For可以選擇少於Environment的運行。 ProcessorCount任務。真正?

有沒有更好的方法?

相關問題