東方算程譚

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を使っちゃいけないの?

@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

記事カテゴリ

書庫

日記カテゴリ

C++11 : ラムダ式とマルチスレッド

# C++11 Advent Calendar 2011 のエントリです。
# 出遅れてごめんす。しかも使い古したネタですんません _o/L

C++11 の一番のウリはラムダ式やと思うてます。
関数オブジェクトをそのまま書き下せるわけだからSTLと相性バツグンなのね。
んでもって Intel TBB あるいは Microsoft PPL なんてなマルチスレッド・ライブラリ
を使ったプログラムがめっさ楽になります。スレッド内で動くタスクをラムダ式で書ける。

僕の愛機が論理4コアな i7-2600K に増強されたもんだから、
マルチスレッド・アプリケーション書くのが楽しくてたまらんです。

たとえばソート。与えられたデータ列 [first,last) を
小さい値の半分 [first,mid) と 大きい値の半分 [mid,last) に振り分けます。
んでもってそれぞれに対しソートする。
ここんとこでふたつのタスクを並行動作させちゃるです。

#define _SCL_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <iterator>
#include <ppl.h>
#include <time.h>
#include <cassert>

using namespace std;
using namespace Concurrency;

const size_t limit = 100;

template<typename Iterator>
void quick_sort(Iterator first, Iterator last) {
  auto size = distance(first,last);
  // limitに満たない大きさならふつーにソート
  if ( size < limit ) {
    sort(first,last);
  } else {
    // 前半と後半に分割し
    Iterator mid = first;
    advance(mid, size/2);
    nth_element(first,mid,last);
    // ふたつのソートをパラレルに(ここでラムダ式の出番!)
    parallel_invoke(
      [&]() { quick_sort(first, mid); },
      [&]() { quick_sort(mid, last); }
    );
  }
}

/*
 * おためし: 百万個のintをソートするなり
 */
int main() {
  const size_t N = 1000000;
  vector<int> data0(N);
  vector<int> data1(N);
  iota(begin(data0), end(data0), 0);
  random_shuffle(begin(data0), end(data0));
  copy(begin(data0), end(data0), begin(data1));

  clock_t t;

  t = clock();
  sort(begin(data0), end(data0));
  t = clock() - t;
  assert( is_sorted(begin(data0), end(data0)) );
  cout << "sort : " << t << endl;

  t = clock();
  quick_sort(begin(data1), end(data1));
  t = clock() - t;
  assert( is_sorted(begin(data1), end(data1)) );
  cout << "sort : " << t << endl;
}

実行結果:
  sort : 77
  quick_sort : 31

スピードに定評のあるstd::sortより倍速いっすよ♪

投稿日時 : 2011年12月9日 22:37

コメントを追加

# re: C++11 : ラムダ式とマルチスレッド 2011/12/10 2:10 επιστημη

> 論理4コア

ちげーよ。 論理8コアだってば。

タイトル  
名前  
URL
コメント