前端時間因為要做個大資料量分析,所以用c#寫了個指令碼跑,不過由於演算法複雜度問題,初步估計需要40小時才能跑完。為了加快運算,我一開始想到了 平行計算,利用mpich或其他類似的分布式計算框架開發,不過都比較麻煩。正巧微軟新出來的並行庫進入了我的視線,於是做了一次簡單的嘗試。
此版本是第二版ctp,經過了一定的擴充套件和補充,總結下來此庫主要包含了三大塊:
本文我們先著重講述一下tpl的使用,並會給出一些效能對比資料。
通常我們線性的去執行乙個迴圈,是這樣寫的:
code
for(
inti =0
; i
<
n; i
++)
在保證以上每個i的計算不存在依賴性的前提下,我們可以通過並行庫很方便的改寫成:
code
using
system.threading;
//安裝完並行庫後,你可以使用system.threading.parallel類了
parallel.for(
0, n,
delegate
(int
i) );
可以發現,並行庫可以很方便將我們的單執行緒程式改寫成多執行緒並行的結構。
那讓我們來做個實驗:假設我們構造乙個執行時間為100ms的compute函式,並設n=100
code
static
void
compute(
inti)}}
我在一台雙核的機器上的執行結果如下:
可以看到並行執行的速度差不多是單執行緒的兩倍,而266ms則是執行緒切換排程時的耗費。
平均每個核心處理排程的耗費是133ms
如果在8核的機器上,執行結果如下:
理論上沒有執行緒排程耗費的情況下是10000/8 =1250ms,則8執行緒並行時的執行緒排程耗費是470ms
平均每個核心處理排程的耗費是59ms
所以在平行計算中的損耗(排程耗費)是可控的,無需我們擔心。
並行庫還是給我們帶來很多令人振奮的東西的,不過用下來還是感覺有許多需要改進的地方。例如現在還不能方便對執行緒數的使用進行調節,即:如果用了parallel.for,他會佔滿你所有的cpu來進行運算,如果需要設定執行緒數,tpl確實也提供了。
code
public
static
void
for(
intfrominclusive,
inttoexclusive,
intstep,
func threadlocalinit,
action
>
body,
action threadlocalfinally,
taskmanager manager,
taskcreationoptions options
)其中taskmanger可以在初始化的時候利用policy來設定最小執行緒數與理想執行緒數等等,但用起來很麻煩,如果這塊能簡化一下就好了,就像plinq提供了as函式,可以方便的設定執行緒數。
另外雖說是並行的,但歸根結底還是在一台機器上跑,如果想用多台機器跑程式,這個就要指望azure了,不過tpl確實可以幫助我們在大多數情況下充分利用強大的多核並行處理能力來處理資料,是個非常不錯的東東。
文章**自:
C 使用任務並行庫 TPL
tpl task parallel library 任務並行庫 tpl 是 system.threading和 system.threading.tasks 命名空間中的一組公共型別和 api。tpl 的目的是通過簡化將並行和併發新增到應用程式的過程來提高開發人員的工作效率。使用執行緒池可以減少並行...
分享 微軟Kinect初體驗
kinect於周四開始發售,它可以利用玩家的身體運動控制螢幕上的動作。和與之類似的任天堂wii相比,它的不同之處是沒有任何要握住的東西,也沒有任何按鈕。kinect依靠三部攝像感測器和四台麥克風識別站在站在前方的使用者。系統識別語音命令並讀取玩家全範圍內的運動 不僅是揮舞手臂 然後將它們轉譯為遊戲內...
C 17 並行排序初體驗
微軟在2018年9月份發布部落格using c 17 parallel algorithms for better performance宣布正式支援c 17的並行演算法。它的使用方法和c 17標準基本一致,不用作太多改動。由於多核會讓clock t多次累計,因此計時得換用chrono提供的時間函式...