お馬の写真 別館

「お馬の写真」管理者による徒然なるブログ

マンデルブロ集合: tbb::parallel_forを使って高速化

      2015/07/17

mandelbrot

 

Threading Building Blocksを使ってマンデルブロ集合の計算を高速化してみました。いろいろやりかたはあると思うのですが、今回は安直にtbb::parallel_forを使って。

#include "stdafx.h"
#include "MandelbrotCppLogicParallel.h"
#include <tbb/parallel_for.h>
using namespace std;
using namespace tbb;
class MandelbrotCppLogicParallel::Impl {
public:
static int CalcPoint(int threshold, const complex<double> &c)
{
complex<double> z;
for (int i = 0; i < threshold; ++i)
{
z = z * z + c;
if (z.real() * z.real() + z.imag() * z.imag() > 4.0) {
return i;
}
}
return -1;
}
private:
Impl();
~Impl();
};
void MandelbrotCppLogicParallel::Calc(
vector<int> *result,
const complex<double> &center, double step,
int width, int height, int threshold)
{
if (result == nullptr) {
return;
}
result->resize(width * height);
vector<complex<double>> input(width * height);
complex<double> c(0, center.imag() - step * height / 2.0);
int index = 0;
for (int y = 0; y < height; ++y)
{
c.real(center.real() - step * width / 2.0);
for (int x = 0; x < width; ++x)
{
input[index++] = c;
c.real(c.real() + step);
}
c.imag(c.imag() + step);
}
parallel_for(0, index, [&](int i) { (*result)[i] = Impl::CalcPoint(threshold, input[i]); });
}

parallel_forの使い方自体は極めて単純。
こういう場面でラムダ式が使えると、本当に楽にコードが書けて幸せ、と実感できるコードです。

 - プログラミング