東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

TBBで遊んでみたよ(4)

ネタ元 → FizzBuzzを解いてみた

FizzBuzz問題を試験官が頭抱えるくらいにワザとややこしく解け、と。
ふははは、おもしれぇぢゃねぇか。

TBBにはパイプラインを簡単に作れるクラスが用意されています。
コレ使って、FizzBuzz検出フィルタ/Fizz検出フィルタ/Buzz検出フィルタを
パイプラインに載せてわしゃわしゃわしゃーと動かしてみるなり。


/*
 cl -EHsc -MD -I<TBB_INC_DIR> fizzbuzz.cpp -link -libpath:<TBB_LIB_DIR>
 */

#include <iostream>
#include <list>
#include <tbb/tbb.h>

tbb::mutex mutex;

/*
 * listから要素を取り出して後段に送る
 */
class entry : public tbb::filter {
  std::list<int>& list_;
public:
  entry(std::list<int>& l) : tbb::filter(true), list_(l) {}
  void* operator()(void*) {
    if ( list_.empty() ) return 0;
    int* n = new int(list_.front());
    list_.pop_front();
    return n;
  }
};

/*
 * 前段からもらった数 n が割り切れたら -1、
 * さもなくば n を後段に送る
 */
class fizzbuzz_filter : public tbb::filter {
  int mod_;
  std::string str_;
public:
  fizzbuzz_filter(int m, std::string s) : tbb::filter(true), mod_(m), str_(s) {}
  void* operator()(void* p) {
    int* n = static_cast<int*>(p);
    if ( *n < 0 ) {
      return n;
    } else
    if ( *n % mod_ ) {
      return p;
    } else {
      tbb::mutex::scoped_lock lock(mutex);
      std::cout << str_ << '(' << *n << ") " << std::flush;
      *n = -1;
      return n;
    }
  }
};

/*
 * 前段からもらった数 n が 負でなければ出力する
 */
class terminator : public tbb::filter {
public:
  terminator() : tbb::filter(true) {}
  void* operator()(void* p) {
    int* n = static_cast<int*>(p);
    if ( *n > 0 ) {
      tbb::mutex::scoped_lock lock(mutex);
      std::cout << *n << ' ' << std::flush;
    }
    delete n;
    return 0;
  }
};

int main() {

  // 入力系列とパイプラインを生成
  std::list<int> source;
  for ( int i = 1; i <= 100; ++i ) {
    source.push_back(i);
  }
  tbb::pipeline pipeline;

  // 初段をパイプラインに接続
  entry first(source);
  pipeline.add_filter(first);

  // FizzBuzz, Fizz, Buzz をパイプラインに接続
  fizzbuzz_filter fizzbuzz(15,"FizzBuzz");
  pipeline.add_filter(fizzbuzz);
  fizzbuzz_filter fizz(3,"Fizz");
  pipeline.add_filter(fizz);
  fizzbuzz_filter buzz(5,"Buzz");
  pipeline.add_filter(buzz);

  // 最終段をパイプラインに接続
  terminator last;
  pipeline.add_filter(last);

  // runの引数を2以上にすると複数のパイプラインが
  // 並行動作する(ので出力順が乱れます)
  pipeline.run(1);
  pipeline.clear();
}

TBBおもろいなりー♪

投稿日時 : 2009年10月11日 23:59

コメントを追加

# re: TBBで遊んでみたよ(4) 2009/10/12 23:58 Jitta

なぜか、Shift_JIS でエンコードしやがる。
why encode with shift_jis?

# The forum is a brihg 2014/05/09 20:32 Demarlo

The forum is a brihgter place thanks to your posts. Thanks!

# 中国 偽ブランド 2019/05/11 23:57 uheahdja@goo.ne.jp

ブランド 激安、安心、安全大特価
【新品】バッグ、財布、靴、帽子、アパレル、ベルト、その他小物 シャネル グッチ エルメス ロレックス ROLEX VUITTON
シャネル グッチ エルメス ROLEX S級 シャネル S グッチ S級 エルメス S級 ROLEX
AAA級 VUITTON AAA級 シャネル AAA級 グッチ AAA級 エルメス AAA級品 N級品ルイ ヴィトンS級品
シャネルS級品 グッチS級品 エルメスS級品 ロレックスS級品 ルイ ヴィトンAAA級品 シャネルAAA級品 グッチAAA級品 エルメスAAA級品
■スタイルが多い、品質がよい、価格が低い!
■ 送料無料(日本全国) ご注文を期待しています!
■信用第一、良い品質、低価格は
■当社の商品は絶対の自信が御座います
激安、安心、安全にお届けします.品数豊富な商
商品数も大幅に増え、品質も大自信です
100%品質保証!満足保障!リピーター率100%!

タイトル
名前
URL
コメント