2011-12-16 27 views
0

我有一個關於併發::「ppl.h」頭的parallel_for時算法的問題。這個例子來自Ivor Horton的書 - 「Visual C++ 2010開始」。編程多核/ Mandelbrot集/ C++

鏈接完成.cpp文件: http://media.wiley.com/product_ancillary/83/04705008/DOWNLOAD/500880ch13.zip 「CH13/Ex13_03/Ex13_03.cpp」

在這個特殊的例子,他展示瞭如何構建使用並行計算Mandelbrot集。

處理它的功能是:

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函數計算。

水平行像素以隨機順序呈現。我的問題是 - 算法如何確定窗口的哪個區域(即像素的「y」水平行集合)是由哪個內核渲染的。

p.s.該工作例子是在這裏:http://hotfile.com/dl/137661392/d63280a/MANDELBROT.rar.html

感謝您的時間!

回答

2

通過對事物的外觀,parallel_for時用0和imageHeight之間的每一個值調用一次lambda函數。有效:

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

是一樣的:

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

因此,拉姆達功能對圖像中的每個Y調用一次,可能拆分多個工作線程之間的通話,讓他們運行平行。

由於parallel_for時是一個庫函數,你真的不應該擔心它的內部工作原理。只要接受它每y就會召喚一次lamda。嚴格地說,沒有定義的順序,因爲多個調用可能同時發生(例如,在不同的處理器內核上)。

+0

非常感謝你爲清除該對我) – 2011-12-16 15:05:22

0

這是由編譯器時對於每個碼線程生成 處理。編譯器負責將指令分發給核心。

這裏更多:

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

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

+0

不是真的,編譯器有沒有哪個呼叫在其核心執行發言權。假設parallel_for是使用工作線程實現的,那麼在運行時由OS決定在哪個內核上運行哪個調用。事實上,單個呼叫很可能部分地在多個不同的內核上運行,例如,如果它在中途被搶佔。兩次運行程序不一定每次都以相同的方式分配呼叫。 – zennehoy 2011-12-16 15:17:04