「1 + 2 + ... + n を求める」を、マルチスレッド使ってムダに難解にしてみたよ!
1 + 2 + 3 + ... + n をテケトーに分割します。たとえば:
(1 + 2 + 3) + (4 + 5 + 6) + .... + ( ... + n) みたいに。
んでもって、それぞれの ()内の積算をスレッドに割り当てちゃろーと。
TBB の提供する parallel_reduce てのが入力範囲をテケトーに切り分け、
スレッドに配分してくれますです。
/*
cl -EHsc -MD -I<TBB_INC_DIR> iotasum.cpp -link -libpath:<TBB_LIB_DIR>
*/
#include <iostream>
#include <functional>
#include <tbb/tbb.h>
int main() {
int n = 10000;
int sum;
sum = tbb::parallel_reduce(
// 値の範囲: 1 から始めて n+1 を超えない。 個数は1000くらいで。
tbb::blocked_range<int>(1,n+1,1000),
// 初期値
0,
// [r.begin(), r.end()) の総和を partial_sum に足しこんで返す
[](const tbb::blocked_range<int>& r, int partial_sum)-> int {
std::function<int(int,int)> sigma = [&](int x, int y)
{ return x != y ? x + sigma(x+1,y) : y;};
return partial_sum + sigma(r.begin(),r.end()-1);
},
// 総和に部分和を足しこんで返す
[](int sum, int partial_sum) { return sum + partial_sum; });
std::cout << sum << std::endl;
}
クダラネー。だがそこがいい。