東方算程譚

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パターンの実装

@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で遊んでみたよ(5)

ネタ元 → マルチ スレッドで FizzBuzz

いやまったく。くだらん遊びにワザをちらつかせるのが職人の粋ってもんだ。

で、ネタ元とおんなじことをIntel TBBでやってみた。
スレッド数はTBBにおまかせ。よきにはからえーみたいな。

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


#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <utility>
#include <tbb/tbb.h> // tbb::*

int main() {
  const int N = 200000;

  // 前準備
  std::vector<std::pair<int,std::string>> result;
  for ( int i = 1; i <= N; ++i ) {
    result.push_back(std::pair<int,std::string>(i,""));
  }

  // FizzBuzz本体
  auto fizzbuzz = [&](const tbb::blocked_range<int>& range) {
      for ( int n = range.begin(); n != range.end(); ++n ) {
        bool div3 = (n % 3 == 0);
        bool div5 = (n % 5 == 0);
        if ( div3 && div5 ) { result[n-1].second = "FizzBuzz"; }
        else if ( div3 )    { result[n-1].second = "Fizz"; }
        else if ( div5 )    { result[n-1].second = "Buzz"; }
      }
    };

  // 範囲 [1,N+1)
  tbb::blocked_range<int> range(1,N+1);
  tbb::tick_count t0, t1;

  // シングルスレッドでは...
  t0 = tbb::tick_count::now();
  fizzbuzz(range);
  t1 = tbb::tick_count::now();
  std::cout << "single:   " << (t1 - t0).seconds() << std::endl;

  // parallel_forで並列化
  t0 = tbb::tick_count::now();
  tbb::parallel_for(range, fizzbuzz);
  t1 = tbb::tick_count::now();
  std::cout << "parallel: " << (t1 - t0).seconds() << std::endl;
/*
  std::for_each(result.begin(), result.end(),
                [](const std::pair<int,std::string>& item) {
                  if ( item.second.empty() ) std::cout << item.first << std::endl;
                  else                       std::cout << item.second << std::endl;});
*/

}

実行結果:
single:   0.0236158
parallel: 0.0148314

およそ1.6倍…dual-coreならそんなもんでしょね。

投稿日時 : 2009年10月21日 23:05

コメントを追加

# re: TBBで遊んでみたよ(5) 2009/10/23 6:27 Jitta

> スレッド数はTBBにおまかせ。よきにはからえーみたいな。
 ネタ元は、その「よきにはからえー」こそ、TBB の強みだろうに、そこを説明しないでなんとする?!みたいな。

 επιστημηさんの、速いなーと思ったら、二十万回なのね?!こんな単純な処理で、10ミリ秒と100ミリ秒とは言え、10倍も差が付くかと、本気で焦った。

# re: TBBで遊んでみたよ(5) 2009/10/23 9:07 επιστημη

> よきにはからえー
いくつのfizzbuzzにぶった切ったのか調べてみたところ、8つでした。

> 本気で焦った
サーセンw
二百万でやってみたよ:
single: 0.173689
parallel: 0.0947559
ショボいPentiumD(dual-core)だけど、
1.83倍速くなってっからまぁ上等。
# エントリにあるのはおうちのAthlonX2

# re: TBBで遊んでみたよ(5) 2009/10/23 11:09 επιστημη

> いくつのfizzbuzzにぶった切ったのか調べてみたところ、8つでした。

parallel_forのコードをざっくし読んでみたところ、8つに切り分けてはいるものの、スレッドも8つ作ったんじゃなく、それより少ないスレッドを使いまわしてるみたい。

なかなかに賢い実装がなされちょるようです。

# re: TBBで遊んでみたよ(5) 2009/10/23 23:20 Jitta

> parallel_forのコードをざっくし読んでみたところ
 そっか、オープンソースだから、コード見られるんだ。
…ん?なのに、調べてないってか、ヤツは?「調べないのが私の主義です」って言ったら「プロだったら調べろ」と言ったヤツが、調べてないのか。ふ~ん。

タイトル  
名前  
URL
コメント