《實(shí)驗(yàn)中涉及到并行計(jì)算》由會(huì)員分享,可在線閱讀,更多相關(guān)《實(shí)驗(yàn)中涉及到并行計(jì)算(10頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,實(shí)驗(yàn)中涉及到的并行計(jì)算,李連盟 李佳駿,MJPEG解碼程序子任務(wù):,1.,FETCH:負(fù)責(zé)完成解碼流程中的霍夫曼解碼、反鋸齒掃描及反量化。,2.COMPUTE:最為費(fèi)時(shí)的計(jì)算任務(wù)反離散余弦變換(IDCT)。,3.DISPATCH:從不同的COMPUTE任務(wù)計(jì)算完畢的宏塊,進(jìn)行重新組織排列,最終生存圖像幀并傳送到幀緩存。,進(jìn)行并行化!,在headers/mjpeg.h中用NB_IDCT定義了線程數(shù),。,在source/main.c中用Posix pthread多線程編程進(jìn)行并行化。,Posix pthread
2、簡介:,1.,數(shù)據(jù)類型,pthread_t:線程句柄,pthread_attr_t:線程屬性句柄,2.函數(shù),int pthread_create(pthread_t*restrict_tidp,const pthread_attr_t*restrict_attr,void*(*start_rtn)(void*),void*restrict arg);,/創(chuàng)建線程。參數(shù):1.線程標(biāo)識符指針2.線程屬性3.運(yùn)行函數(shù)起始地址4.運(yùn)行函數(shù)參數(shù),int pthread_join(pthread_t thread,void*retval);,/以阻塞的方式等待thread指定的線程結(jié)束。參數(shù):1.線程標(biāo)識
3、符2.返回值,int pthread_attr_init(pthread_attr_t*attr);,/初始化線程對象的屬性。,程序分析:,1.,標(biāo)識符定義,pthread_t fetchThread,dispatchThread,idctThreadNB_IDCT;,pthread_attr_t fetchAttr,dispatchAttr;,2.數(shù)據(jù)分配,Channel*channel2*NB_IDCT+1;,Channel*fetch_channel1+NB_IDCT;,Channel*dispatch_channel1+NB_IDCT;,Channel*idct_channelNB_I
4、DCT2;,/Channel是實(shí)現(xiàn)通信的容器 可以連接兩個(gè)以上的模塊,fetch_channel0=channel0;,dispatch_channel0=channel0;,for(uint32_t i=0;i NB_IDCT;i+),fetch_channeli+1=channel2*i+1;,dispatch_channeli+1=channel2*i+2;,idct_channeli0=channel2*i+1;,idct_channeli1=channel2*i+2;,fetch_channeli+1=channel2*i+1;,dispatch_channeli+1=channel
5、2*i+2;,idct_channeli0=channel2*i+1;,idct_channeli1=channel2*i+2;,3.多線程,pthread_create(,for(uint32_t i=0;i NB_IDCT;i+),pthread_create(,#if 0 /預(yù)編譯語句 0屏蔽某段語句 1恢復(fù),pthread_attr_init(,fetchAttr.procid=0;,pthread_attr_init(,dispatchAttr.procid=3;,#endif,pthread_create(,pthread_join(dispatchThread,NULL);,幾個(gè)
6、要點(diǎn):,1.,Channel是實(shí)現(xiàn)通信的容器,可以連接兩個(gè)以上的模塊。在這個(gè)程序中,Channel用于放置幾個(gè)不同子程序間數(shù)據(jù)交互的空間,其中定義的channel、,fetch_channel、dispatch_channel、idct_channel都是指針,指向他們所對應(yīng)的那塊實(shí)際的物理地址。,2.通過賦值,channel上的奇數(shù)塊共享給了fetch和idct二維數(shù)組參數(shù)里的0號位(圖中的紅色塊),channel上的偶數(shù)塊共享給了dispatch和idct二維數(shù)組參數(shù)里的1號位(同種的藍(lán)色塊)。,3.整個(gè)并行的過程是這樣的:主線程創(chuàng)建一個(gè)子線程fetchThread運(yùn)行fetch處理程序,
7、參數(shù)是fetch_channel,即把fetch的處理結(jié)果分塊后放到fetch_channel(紅)上;創(chuàng)建N個(gè)子線程idctThread,并行運(yùn)行idct計(jì)算程序,參數(shù)是,idct_channeli,即第i個(gè)子線程運(yùn)行idct程序,從dict_channeli0(紅)上取出fetch的某塊運(yùn)行結(jié)果,然后將自己處理后的結(jié)果放到dict_channeli1(藍(lán))上;創(chuàng)建子線程dispatchThread運(yùn)行dispatch程序,參數(shù)為dispatch_channel,即從disptch_channel(藍(lán))上取出idct的結(jié)果,重新組合后,等待diptch運(yùn)行結(jié)束后得出最后結(jié)果進(jìn)行輸出。,4.程
8、序中進(jìn)行的初始數(shù)據(jù)分配與原始數(shù)據(jù)無關(guān),而是分配fetch程序運(yùn)行得到的結(jié)果。分多少塊,每塊多大是由數(shù)據(jù)大小和線程數(shù)來決定的。放在channel上的數(shù)據(jù)全部是與程序間的通信有關(guān)的,只有fetch的結(jié)果和idct的結(jié)果,原始數(shù)據(jù)進(jìn)入fetch串行運(yùn)行,與其他程序無關(guān)。在程序操作channel之前,channel是格式化了的。,性能分析:,多MIPS與運(yùn)行時(shí)間的關(guān)系(MIPS數(shù)等于線程數(shù)),性能分析:,同數(shù)量MIPS下,線程數(shù)與運(yùn)行時(shí)間的關(guān)系,性能分析說明:,1.,從第一張圖表中線程數(shù)與核數(shù)相同,可以很明顯看出,并行計(jì)算對于計(jì)算性能有很好的提升作用。核數(shù)達(dá)到三個(gè)以后,并行的效果達(dá)到了極限。線程數(shù)與核數(shù)相同保證了最好的并行效果,防止了線程數(shù)過多造成的偽并行。,2.單純從并行計(jì)算的角度來看,第二張圖更能體現(xiàn)并行計(jì)算的效果。在相同的核數(shù)條件下,開不同的線程數(shù)對計(jì)算性能的提升作用。圖中沒有展示各核數(shù)下1個(gè)線程的計(jì)算時(shí)間,串行進(jìn)行基本上需要2個(gè)線程并行計(jì)算大約兩倍的時(shí)間。,3.為了與我們之前的測試數(shù)據(jù)保存一致,我們沒有對timer進(jìn)行修改。圖中的數(shù)據(jù)除以200就可以得到與其他組相當(dāng)?shù)臏y試數(shù)據(jù)。,Thanks,!,