2019年04月27日

C++17でモンテカルロを並列化してみた(3)

thread_localを付けてみた。
効果は
スレッドごとに乱数の状態を持つ。
だそうだ。
#include <algorithm>
#include <execution>
#include <mutex>
#include <iostream>
#include <random>
#include <array>

int main()
{
static int const NUM = 1000000000;
static int const threads = 10;

static_assert(std::atomic<int>::is_always_lock_free);

constexpr auto nums = []{
std::array<int, threads> a{};
for (auto& e : a) {
e = NUM / threads;
}
return a;
}();

std::atomic counter = { 0 };

std::for_each(std::execution::par_unseq, nums.begin(), nums.end(), [&counter](int num) {
std::random_device rnd;
thread_local std::mt19937 mt(rand());
std::uniform_real_distribution<double> score(0.0, 1.0);
for (auto&& no = 0; no < num; ++no) {
auto&& x = score(mt);
auto&& y = score(mt);
if ((x * x + y * y) < 1.0) {
counter++;
}
}
});

std::cout << "PI = " << 4.0 * counter / NUM << std::endl;
}
posted by zengaichi at 16:09| Comment(2) | 並列プログラミング | 更新情報をチェックする
この記事へのコメント
GNUバージョンのparalell modeでやってみました(^^)/
http://xor.zoku-sei.com/Entry/73/
Posted by nwpfh at 2019年05月01日 17:13
nwpfhさん

早速、参考にさせて頂きました(⌒⌒;
Posted by ゼンガイチ at 2019年05月01日 19:52
コメントを書く
コチラをクリックしてください