天天看點

OpenMP并行化執行個體----Mandelbrot集合并行化計算

OpenMP并行化執行個體----Mandelbrot集合并行化計算

在理想情況下,編譯器使用自動并行化能夠管理一切事務,使用OpenMP指令的一個優點是将并行性和算法分離,閱讀代碼時候無需考慮并行化是如何實作的。當然for循環是可以并行化處理的天然材料,滿足一些限制的for循環可以友善的使用OpenMP進行傻瓜化的并行。

為了使用自動并行化對Mandelbrot集合進行計算,必須對代碼進行内聯:書中首次使用自動并行化時候,通過性能分析發現工作線上程中并未平均配置設定。

    當我們看到 分形圖的時候應該可以很快的了解負荷不均衡從那裡産生,分形圖中大部分點不在集合中,這部分點隻需要少量的疊代就可以确定,但有些在集合中的點則需要大量的疊代。

     當然我再一次見識到了OpenMP傻瓜化的并行操作機制,糾正工作負荷不均衡隻要更改并行代碼排程子句就可以了,使用動态指導排程,下面代碼是增加了OpenCV的顯示部分:

  #pragma omp parallel for schedule(dynamic) 子句

schedule子句:

  schedule(type[, size]),

  參數type是指排程的類型,可以取值為static,dynamic,guided,runtime四種值。其中runtime允許在運作時确定排程類型,是以實際排程政策隻有前面三種。

  參數size表示每次排程的疊代數量,必須是整數。該參數是可選的。當type的值是runtime時,不能夠使用該參數。

動态排程dynamic

  動态排程依賴于運作時的狀态動态确定線程所執行的疊代,也就是線程執行完已經配置設定的任務後,會去領取還有的任務。由于線程啟動和執行完的時間不确定,是以疊代被配置設定到哪個線程是無法事先知道的。

  當不使用size 時,是将疊代逐個地配置設定到各個線程。當使用size 時,逐個配置設定size個疊代給各個線程。

動态排程疊代的配置設定是依賴于運作狀态進行動态确定的,是以哪個線程上将會運作哪些疊代是無法像靜态一樣事先預料的。

加速結果:

1.放大加速結果

OpenMP并行化執行個體----Mandelbrot集合并行化計算

2.未加速時候的放到功能,基本是3-5倍這個水準,也就是相當于桌上型電腦cpu 的個數?本人的猜測

OpenMP并行化執行個體----Mandelbrot集合并行化計算

3.圖像計算結果(未加速)

OpenMP并行化執行個體----Mandelbrot集合并行化計算

4. 動态加速結果

OpenMP并行化執行個體----Mandelbrot集合并行化計算

參考文獻:

<a target="_blank" href="http://baike.baidu.com/view/1777568.htm?fromtitle=Mandelbrot%E9%9B%86%E5%90%88&amp;fromid=1778748&amp;type=syn">http://baike.baidu.com/view/1777568.htm?fromtitle=Mandelbrot%E9%9B%86%E5%90%88&amp;fromid=1778748&amp;type=syn</a>

<a target="_blank" href="http://www.cnblogs.com/easymind223/archive/2013/01/19/2867620.html">http://www.cnblogs.com/easymind223/archive/2013/01/19/2867620.html</a>

戈夫. 多核應用程式設計實戰[M]. 人民郵電出版社, 2013.

<a target="_blank" href="http://openmp.org/mp-documents/OpenMP3.1-CCard.pdf">http://openmp.org/mp-documents/OpenMP3.1-CCard.pdf</a>

<a target="_blank" href="http://blog.csdn.net/gengshenghong/article/details/7000979">http://blog.csdn.net/gengshenghong/article/details/7000979</a>

繼續閱讀