多核编程/ Mandelbrot Set / c++

programming for multiple cores / Mandelbrot Set / c++

本文关键字:c++ Set Mandelbrot 多核 编程      更新时间:2023-10-16

我有一个关于"ppl.h"头的Concurrency::parallel_for算法的问题。这个例子来自Ivor Horton的书——"Beginning Visual c++ 2010"。

链接到完整的。cpp文件:http://media.wiley.com/product_ancillary/83/04705008/DOWNLOAD/500880ch13.zip"Ch13/Ex13_03/Ex13_03.cpp "

在这个特殊的例子中,他展示了如何使用并行计算来构建Mandelbrot Set。

处理它的函数是:

void DrawSetParallelFor(HWND hWnd)
{
// setting interface here
HDC hdc(GetDC(hWnd));
RECT rect;
GetClientRect(hWnd, & rect);
// getting width and height of our window
int imageHeight(rect.bottom);
int imageWidth(rect.right);
// defining variables and constants
const double realMin(-2.1); // Minimum real value
double imaginaryMin(-1.3); // Minimum imaginary value
double imaginaryMax(+1.3); // Maximum imaginary value
double realMax(realMin+(imaginaryMax-imaginaryMin)*imageWidth/imageHeight);
double realScale((realMax-realMin)/(imageWidth-1));
double imaginaryScale((imaginaryMax-imaginaryMin)/(imageHeight-1));
// defining critical section
Concurrency::critical_section cs; // Mutex for BitBlt() operation
// starting parallel loop
Concurrency::parallel_for(0, imageHeight, [&](int y)
{
   // locking code
   cs.lock();
      HDC memDC = CreateCompatibleDC(hdc);
      HBITMAP bmp = CreateCompatibleBitmap(hdc, imageWidth, 1);
   cs.unlock();
   HGDIOBJ oldBmp = SelectObject(memDC, bmp);
   double cReal(0.0), cImaginary(0.0);
   double zReal(0.0), zImaginary(0.0);
   zImaginary = cImaginary = imaginaryMax - y*imaginaryScale;
   // filling horizontal rows with colored pixels
   for(int x = 0; x < imageWidth; ++x)
   {
      zReal = cReal = realMin + x*realScale;
      SetPixel(memDC, x, 0, Color(IteratePoint(zReal, zImaginary, cReal, cImaginary)));
   }
   // locking again 
   cs.lock();
      BitBlt(hdc, 0, y, imageWidth, 1, memDC, 0, 0, SRCCOPY);
   cs.unlock();
   // deleting objects
   SelectObject(memDC, oldBmp);
   DeleteObject(bmp);
   DeleteDC(memDC);
});
   ReleaseDC(hWnd, hdc);
}

基本上这个函数呈现Mandelbrot集合,这是在IteratePoint函数中计算的。

水平行像素以随机顺序呈现。我的问题是- Concurrency::parallel_for算法究竟如何决定窗口的哪个区域(即"y"像素的水平行集)由哪个核心渲染。

注。工作示例如下:http://hotfile.com/dl/137661392/d63280a/MANDELBROT.rar.html

感谢您的宝贵时间!

从表面上看,parallel_for对0到imageHeight之间的每个值调用一次lambda函数。有效:

Concurrency::parallel_for(0, imageHeight, [&](int y) {

等于:

for(int y=0; y<imageHeight; ++y) {

因此,对于图像中的每个y调用一次lambda函数,可能会在多个工作线程中拆分调用,以允许它们并行运行。

因为parallel_for是一个库函数,你真的不应该担心它是如何在内部工作的。只要接受它对每个y调用一次lambda。严格地说,没有定义的顺序,因为多个调用可能同时发生(例如在不同的处理器内核上)。

这是由编译器处理时,每个代码的线程生成的。编译器负责将指令分发给内核。

更多:http://www.multicoreinfo.com/research/papers/whitepapers/intel-opti-mc.pdf

http://arco.e.ac.upc.edu/wiki/images/b/b4/Madriles_isca09.pdf