Changes between Version 10 and Version 11 of HowTo/BoostStudy4


Ignore:
Timestamp:
Feb 26, 2011, 2:05:40 PM (14 years ago)
Author:
村山 俊之
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • HowTo/BoostStudy4

    v10 v11  
    379379   * 適当に書いてもそれなりに速い
    380380   * 0x でそれなりに改善
     381
     382
     383== なぜ僕はProtoをぺろぺろするのか ==
     384
     385=== Boost.Proto 概要 ===
     386
     387 * Expression Template の構築を補助するライブラリ
     388   * a + b * c -> plus<A, multiply<B, C> >
     389 * Boost 1.37
     390 * Headers only
     391
     392=== Boost.Proto は縁の下の力持ち ===
     393
     394 * 単体で使って嬉しいライブラリではない
     395 * Boost 内で利用しているライブラリ:
     396   * Boost.Spirit
     397   * Boost.Phoenix v3
     398   * Boost.MSM.eUML
     399   * Boost.Xpressive
     400
     401=== Expressoin Template (ET) の型 ===
     402
     403 * 割と重要
     404   * エラーメッセ維持で頻出
     405     * 恐ろしく長い
     406   * Qi で Proto 関係の部分でエラーを出すと遭遇
     407
     408=== とりあえず使ってみる ===
     409
     410{{{
     411default_context const ctx;
     412std::const << eval(lit(1) + 2 + 3, ctx)
     413           << std::endl;
     414}}}
     415
     416実行結果
     417{{{
     4186
     419}}}
     420
     421 * + を - とするコンテキスト
     422{{{
     423struct my_context {
     424  template <
     425    class Expr,
     426    class Enable = void
     427  > struct eval;
     428};
     429}}}
     430
     431=== SFINAE ===
     432
     433 * Substitution Failure Is not An Error
     434   * 置き換え失敗はエラーにあらず
     435 * boost::enable_if など
     436{{{
     437template <class T>
     438typename enable_if<is_const<T> >::type foo();
     439}}}
     440 * SFINAE を用いて eval を分岐する。
     441
     442 * + を - とするコンテキスト
     443{{{
     444template <class Expr>
     445struct eval<
     446  Expr,
     447  typename boost::enable_if<
     448    matches<Expr, terminal<int> >
     449  >::type
     450> {
     451  typedef int result_type;
     452 
     453  result_type
     454  operator ()(Expr& e, my_context const&)
     455  const {
     456    return value(e);
     457  }
     458}
     459}}}
     460
     461=== Boost.Proto の拡張方法 ===
     462
     463 * Context
     464   * 評価に関する情報の提供
     465 * Domain
     466   * 式の生成手段の提供
     467 * Extends
     468   * 式を表す型を自分で提供
     469 * Grammer
     470   * 文法を定義。演算子オーバーロード制御。
     471
     472=== 数値計算に Boost.Proto ===
     473
     474 * ET と数値計算は相性が良い
     475   * 「アルゴリズム」と「計算実装」を分離できる
     476     * 組み合わせの爆発を抑制
     477   * 見た目が良い (+ が加算を表す)
     478 * 単純な計算の組み合わせで表現できる。
     479   * Basic Linear Algebra Subprograms (BLAS)
     480
     481=== Boost.uBLAS では満足できない理由 ===
     482
     483 * Boost.uBLAS は可読性を重視している
     484 * よって遅い
     485 * 拡張できない
     486
     487=== General Purpose computing on GPU (GPGPU) について ===
     488
     489 * アルゴリズムは CPU, GPU 共通
     490   * コードを共有したい→ bug が減る
     491 * 計算実装は CPU と GPU で異なり、内部実装が多種多様
     492
     493