OpenMP并行化实例----Mandelbrot集合并行化计算
在理想情況下,編譯器使用自動并行化能夠管理一切事務,使用OpenMP指令的一個優點是將并行性和算法分離,閱讀代碼時候無需考慮并行化是如何實現的。當然for循環是可以并行化處理的天然材料,滿足一些約束的for循環可以方便的使用OpenMP進行傻瓜化的并行。
為了使用自動并行化對Mandelbrot集合進行計算,必須對代碼進行內聯:書中首次使用自動并行化時候,通過性能分析發現工作在線程中并未平均分配。
#include <stdio.h> #include <malloc.h> #define SIZE 4000int inSet(double ix,double iy) {int iterations = 0;double x = ix,y = iy;double x2 = x*x, y2 = y*y;while ((x2 + y2 < 4) && (iterations < 1000)){y = 2*x*y + iy;x = x2 -y2 +ix;x2 = x*x;y2 = y*y;iterations++;}return iterations; }int main() {int *matrix[SIZE];for (int i = 0; i < SIZE; i++){matrix[i] = (int* )malloc( SIZE*sizeof(int) );}#pragma omp parallel forfor (int x = 0 ;x <SIZE; x++){for (int y =0;y <SIZE;y++){double xv = ((double)x -(SIZE/2)) / (SIZE/4);double yv = ((double)y -(SIZE/2)) / (SIZE/4);matrix[x][y] = inSet(xv,yv);}}for (int x =0; x<SIZE;x++){for (int y =0;y<SIZE;y++){if (matrix[x][y] == -7){printf(" ");}}}return 0; }? ? 當我們看到 分形圖的時候應該可以很快的理解負荷不均衡從那里產生,分形圖中大部分點不在集合中,這部分點只需要少量的迭代就可以確定,但有些在集合中的點則需要大量的迭代。
? ? ?當然我再一次見識到了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.放大加速結果
2.未加速時候的放到功能,基本是3-5倍這個水平,也就是相當于臺式機cpu 的個數?本人的猜測
3.圖像計算結果(未加速)
4. 動態加速結果
代碼:http://download.csdn.net/detail/wangyaninglm/9516035
參考文獻:
http://baike.baidu.com/view/1777568.htm?fromtitle=Mandelbrot%E9%9B%86%E5%90%88&fromid=1778748&type=syn
http://www.cnblogs.com/easymind223/archive/2013/01/19/2867620.html
戈夫. 多核應用編程實戰[M]. 人民郵電出版社, 2013.
http://openmp.org/mp-documents/OpenMP3.1-CCard.pdf
http://blog.csdn.net/gengshenghong/article/details/7000979
總結
以上是生活随笔為你收集整理的OpenMP并行化实例----Mandelbrot集合并行化计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu系统如何卸载并安装新版本的j
- 下一篇: [android] 手机卫士黑名单功能(