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

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

スポンサーリンク

フォローする

スポンサーリンク