OpenMP並行化例項----Mandelbrot集合並行化計算
在理想情況下,編譯器使用自動並行化能夠管理一切事務,使用OpenMP指令的一個優點是將並行性和演算法分離,閱讀程式碼時候無需考慮並行化是如何實現的。當然for迴圈是可以並行化處理的天然材料,滿足一些約束的for迴圈可以方便的使用OpenMP進行傻瓜化的並行。
為了使用自動並行化對Mandelbrot集合進行計算,必須對程式碼進行內聯:書中首次使用自動並行化時候,通過效能分析發現工作線上程中並未平均分配。
#include <stdio.h>
#include <malloc.h>
#define SIZE 4000
int 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 for
for (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://www.cnblogs.com/easymind223/archive/2013/01/19/2867620.html
戈夫. 多核應用程式設計實戰[M]. 人民郵電出版社, 2013.
相關文章
- C#並行,多執行緒程式設計並行集合和PLINQ的例項講解並行執行緒程式設計
- 用Dask並行化特徵工程!並行特徵工程
- Java 多執行緒讀取檔案並統計詞頻 例項 出神入化的《ThreadPoolExecutor》Java執行緒thread
- GPU程式設計(四):並行規約優化GPU程式設計並行優化
- scala佇列、並行集合基本使用佇列並行
- 計算節點會對收到的SQL 語句做解析、優化、執行並SQL優化
- 雙調排序-適合並行多核計算排序並行
- 程式分析與優化 - 10 指令級並行優化並行
- Sobol 序列並行化的實踐經驗並行
- Spark效能優化:提高並行度、使用reduceByKeySpark優化並行
- goroutine的多核並行化,讓出時間片Go並行
- 並行化-你的高併發大殺器並行
- 全面助力銀行數字化轉型,銀行視覺化大屏例項展示視覺化
- LLM並行訓練5-MoE並行並行
- 530並行日:用超算更省心並行
- LLM並行訓練6-啟用最佳化並行
- 【python】爬取疫情資料並進行視覺化Python視覺化
- 使用MPI並行化遺傳演算法框架GAFT並行演算法框架
- [20210926]並行執行計劃疑問.txt並行
- LLM並行訓練2-張量並行並行
- LLM並行訓練1-流水線並行並行
- LLM並行訓練3-資料並行並行
- 併發程式設計-8.並行資料結構和並行Linq程式設計並行資料結構
- 使用 Eager Execution 編碼並執行圖表:以通過 RevNet 優化程式碼為例優化
- web自動化測試框架-01 搭建基礎架構並執行一個樣例Web框架架構
- 例項演示:Excel實現資料更新獲取,並根據公式計算後展示Excel公式
- [原始碼解析] PyTorch 流水線並行實現 (6)--平行計算原始碼PyTorch並行
- C#多執行緒(四)並行程式設計篇之結構化C#執行緒並行行程程式設計
- LLM並行訓練7-混合並行總結並行
- 探索:優雅地實現非同步方法的並行化非同步並行
- 吞吐提升30倍:CV流水線走向全棧並行化全棧並行
- linux掛載新硬碟並進行分割槽格式化Linux硬碟
- GAIA-IR: GraphScope 上的並行化圖查詢引擎AI並行
- Python資料預處理:Dask和Numba並行化加速!Python並行
- 例項解讀:MySQL並行複製如何解決特定的主從問題?MySql並行
- [原始碼解析] PyTorch分散式優化器(2)----資料並行優化器原始碼PyTorch分散式優化並行
- JavaScript陣列合並程式碼例項JavaScript陣列
- Oracle並行FAQOracle並行
- 例項化list