日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenMP并行化实例----Mandelbrot集合并行化计算

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的顯示部分:


#include "Fractal.h" #include <Windows.h> #include <omp.h>int Fractal::Iteration(Complex a, Complex c) {double maxModulus = 4.0;int maxIter = 256;int iter = 0;Complex temp(0,0) ;while ( iter < maxIter && a.modulus() < maxModulus){a = a * a ;a += c;iter++;}return iter; }cv::Mat Fractal::generateFractalImage(Border border, CvScalar colortab[256] ) {cv::Size size(500,500);double xScale = (border.xMax - border.xMin) / size.width;double yScale = (border.yMax - border.yMin) / size.height;cv::Mat img(size, CV_8UC3);#pragma omp parallel for schedule(dynamic)for (int y=0; y<size.height; y++){for (int x=0; x<size.width; x++){double cx = border.xMin + x * xScale;double cy = border.yMin + y * yScale;Complex a(0.0, 0.0);Complex c(cx, cy);int nIter ;if (type == MANDELBROT){nIter = Iteration(a, c);}else if (type == JUALIA){nIter = Iteration(c, offset);}int colorIndex = (nIter) % 255;cv::Vec3b color;color.val[0] = colortab[colorIndex].val[0];color.val[1] = colortab[colorIndex].val[1];color.val[2] = colortab[colorIndex].val[2];img.at<cv::Vec3b>(y,x) = color;}}return img; }

??#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集合并行化计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。