Quantcast
Channel: わんくま同盟
Viewing all articles
Browse latest Browse all 994

Intel CnC であそんでみた(ちょっとだけ)

$
0
0

Intel Concurrent Collections (CnC)ってシロモノを見つけました。

並列化のためのライブラリなんだけど、フツーのたとえば pthread だとか PPL, TBB とは一味違ってます。

CnC が提供する構成要素は大きく3つ:

  • step : 処理単位
  • item : stepの入力/出力
  • tag : stepの着火装置
「tagによって着火されたstepはitemから読み、処理を行い、itemに結果を書く」
が基本構成。

これ使って複利計算をやってみます。
n番itemは"n年目の残高"を表すこととし、n番stepでのおしごとを
「n-1番item を読出し 1+利率を掛けて n番item に書く」とします。
そうすればこいつをN個数珠つなぎにして一気に着火すればN年目までの残高が求まるよね。

/*
 * Intel Concurrent Collections (CnC)
 * 複利計算
 */#include<iostream>#include<iomanip>#include<array>#include<cnc/cnc.h>usingnamespace std;struct my_context; // forward decl.struct my_step {int execute(constint& n, my_context& ctx) const;
};struct my_context : public CnC::context<my_context> {
  CnC::step_collection<my_step>    steps;
  CnC::tag_collection<int>         tags;
  CnC::item_collection<int,double> items;double                           rate;  // 利率

  my_context() : steps(*this), tags(*this), items(*this) {
    tags.prescribes(steps, *this); // tags は steps に 指示する
    steps.consumes(items);         // steps は items を消費する
    steps.produces(items);         // steps は items を生産する
  }
};// 前年の残高と利率から本年の残高を求めるint my_step::execute(constint& n, my_context& ctx) const {// n 年後の残高はdouble result;
  ctx.items.get(n-1, result); // n-1 年後の残高に
  result *= (1.0 + ctx.rate); // 利率をかけたもの
  ctx.items.put(n, result);   // であるreturn CnC::CNC_Success;
}int main() {
  my_context ctx;
  ctx.rate = 0.05;           // 年利5%の定期預金に
  ctx.items.put(0, 10000.0); // 初年度に1万円預けてconstint duration = 10;   // 10年間放置するとき// 1年後, 2年後, ... 10年後 の残高を求めよ!for ( int n = 1; n <= duration; ++n ) {
    ctx.tags.put(n); // ここでstepをkickする
  }
  ctx.wait(); // 終わるのを待って// 結果を整列させ
  array<double, duration+1> balances;for ( constauto& item : ctx.items ) {
    balances[item.first] = *item.second;
  }// 出力するfor ( constauto balance : balances ) {
    cout << balance << endl;
  }
}

これでできちゃうです。スレッドだのタスクだの考えなくていい。
そーゆーのはCnCの実行エンジンが善きに計らってくれるです。


Viewing all articles
Browse latest Browse all 994

Trending Articles