SlideShare a Scribd company logo
C++ Transactional Memory
     言語拡張の紹介



                       2012/7/28
               Boost.勉強会 #10 東京
はじめに

誰?
 twitter @yohhoy / hatena id:yohhoy

何を?
 C++11の”次”規格へ提案されている新機能の紹介
                          “ちょっと(?)未来”のお話です

どうして?
 Google先生に聞いても情報がほとんど無い...
   → 勉強会 駆動 教えて君
                                             2
情報源

”Draft Specification of Transactional Language
Constructs for C++”, Version 1.1, Feb. 3, 2012
                   https://sites.google.com/site/tmforcplusplus/
                一部翻訳→ http://d.hatena.ne.jp/yohhoy/20120413/


N3341 Transactional Language Constructs for C++
       http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2012/


→ いきなり次世代標準規格C++1y入りは目指さず、
  まずはTR(Technical Report)として提案される

                                                               3
もくじ

●
    Transactional Memoryの概略
●
  データベースシステムとの対比, 導入の目的
●
  ACID特性, Composability

●
    C++TM言語拡張は何を提供する/しないのか?
●
    既存のロック, atomic変数との関係

●
    C++TM言語拡張の新キーワード
●
  __transaction_relaxed, __transaction_atomic
●
  __transaction_cancel, C++例外との関係



                                                4
Transactional Memory(TM)?

発祥はデータベースな世界の”トランザクション”から。
同時操作から“メモリ”というリソースの一貫性を保護。
                     DB                           変数
                      A=0→ 1                       x=0→1
              DBMS    B=0→1               メモリ      x=0→1

T1:(write)            T2:(read)   T1:            T2:
 A=1                   A= 1        x=1            x == 1
 B=1                   B=01        y=1            y == 0 1


      処理1            処理2            処理1         処理2


                                                             5
TM導入の目的(1)

“The Free Lunch Is Over”
    (Herb Sutter, 2005)
                            シングルスレッドな
                           プログラム性能は頭打ち

 メニーコア時代の到来

                           メニーコアを活用する
                           プログラミングが必要
       マルチスレッド
       プログラミング
        難しい!?

                                         6
TM導入の目的(2)

Transactional Memoryとは
                                            Programming Abstraction
●
  並行処理の記述を容易にするプログラミング抽象
●
  プログラマは一連の処理に対し”トランザクション”と宣言する

TMは特段新しいものではなく、既にいくつか実装系が存在
●
  H/W: IBM BlueGene/Q, (Intel Haswell TSX), (AMD ASF ?)
●
  S/W: Haskell, Clojure, 各ベンダC++STM, TBoost.STM

                              C++TM言語拡張の仕様へフィードバック

Intel's TSX = Transactional Synchronization Extensions
AMD's ASF = Advanced Synchronization Facility
                                                                      7
TMとACID特性
“トランザクション”システムを名乗るからには...
Atomicity(原子性)
 トランザクション内の処理は「全て処理される」か「全く処理
されない」のいずれか。(処理途中のキャンセルも含む)
Consistency(一貫性)
 トランザクション処理前後でメモリ内容に一貫性がある。
(例:リンクリストのノードがポインタで正しくつながる)
Isolation(分離性)
 トランザクション処理中の中間状態は他コードから見えない。
Durability(永続性)
 → “メモリ”なので電源きったらパア
                              8
Composability
Transactional Memoryがもたらす大きなメリット
 トランザクションは安全に”入れ子”にできます。
 幾つかの小さなトランザクションを束ねて、1つの大きなトラ
ンザクションを構成することが可能です。



デッドロックの恐怖から解放!



C++テンプレート駆使したGenericコードとも相性良い

Photo: espressoed/flickr                   9
もくじ

●
    Transactional Memoryの概略
●
  データベースシステムとの対比, 導入の目的
●
  ACID特性, Composability

●
    C++TM言語拡張は何を提供する/しないのか?
●
    既存のロック, atomic変数との関係

●
    C++TM言語拡張の新キーワード
●
  __transaction_relaxed, __transaction_atomic
●
  __transaction_cancel, C++例外との関係



                                                10
Transactional Language Constructs for C++
                     が提供するもの(1)

C++TM言語拡張の仕様は...

トランザクションを表現する構文と、トランザクション
がどのように振舞うかのセマンティクスを定義する。
たったの35page!(1310page@C++11)
●
  新しいキーワードを3つ追加             g++もClangも未実装
●
  新しい属性を5つ追加
    ●
        C++11で追加された”Generaized Attibuttes”構文を使います。
●
    C++メモリモデルを拡張

                                                     11
Transactional Language Constructs for C++
                  が提供するもの(2)            コードの雰囲気

キーワード                       [[transaction_safe]]
                             [[transaction_safe]]
 ●
   __transaction_relaxed    bool is_valid(Node *);
                             bool is_valid(Node *);
 ●
   __transaction_atomic     __transaction_atomic {
                            __transaction_atomic {
 ●
   __transaction_cancel      node->next = curr_node;
                              node->next = curr_node;
属性                           curr_node->prev = node;
                              curr_node->prev = node;
 ●
   outer
 ●
   transaction_callable       if (( !is_valid(node) ))
                               if !is_valid(node)
 ●
   transaction_safe              __transaction_cancel;
                                 __transaction_cancel;
                           }}
 ●
   transaction_unsafe
 ●
   transaction_may_cancel_outer
                                                         12
Transactional Language Constructs for C++
                  が提供しないもの

C++TM言語拡張の仕様は...

TMをどのように実現するか(実装方法)を定義しない。
●
  Software TM/Hardware TM, Hybrid TM
●
  ワード単位/オブジェクト単位, 単一グローバルロック
●
  楽観的/悲観的な同期戦略                       並行性無視でTMを実現
etc.


    プログラマは「何を保護するか(what)」を記述し、
    「どのように保護するか(how)」は処理系任せ。

                                                   13
Lock, atomic, TM
ロック(ミューテックス)
 古典。構造的でないデータやGenericなコードでは使いに
くい。複数ロックで容易にデッドロック。
atomic変数
 Lock-Free実装などで利用。Primitiveなため軽量かつ高
速。メモリモデルの理解なしに迂闊に手を出すと...死。
Transactional Memory
 原理的にデッドロックしない。抽象度の高い記述ができ開
発効率向上*。実行時動作も十分に高速...?
  (*) http://justingottschlich.com/wp-content/uploads/2012/05/2012.SG1_.tm_final.pdf



                                                                                  14
Lock, atomic, TM
ロック(ミューテックス)
 古典。構造的でないデータやGenericなコードでは使いに
                       相
くい。複数ロックで容易にデッドロック。 補
atomic変数                      的
                              に
  Lock-Free実装などで利用。Primitiveなため軽量かつ高
                              共
速。メモリモデルの理解なしに迂闊に手を出すと...死。   存
                              可
Transactional Memory          能
 原理的にデッドロックしない。抽象度の高い記述ができ開
発効率向上*。実行時動作も十分に高速...?
               動作速度はコンパイラや
               ライブラリ実装による
                                       15
もくじ

●
    Transactional Memoryの概略
●
  データベースシステムとの対比, 導入の目的
●
  ACID特性, Composability

●
    C++TM言語拡張は何を提供する/しないのか?
●
    既存のロック, atomic変数との関係

●
    C++TM言語拡張の新キーワード
●
  __transaction_relaxed, __transaction_atomic
●
  __transaction_cancel, C++例外との関係



                                                16
relaxed vs. atomic

2種類のトランザクションを提供

__transaction_relaxed
 弱い分離性(Weak Isolation)。他のトラン
ザクション処理と分離して実行される。一方
非トランザクション処理とは干渉。
__transaction_atomic
 強い分離性(Strong Isolation)。他の全て
のメモリアクセス操作と分離して実行され
る。
Photo: timsackton/flickr                   17
relaxed, atomicとcancel

relaxed/atomicトランザクション内でできること

__transaction_relaxed
   トランザクション内で任意の処理を実行可能。ファイル
I/Oといった非可逆な操作もOK。キャンセル不可。


__transaction_atomic
  トランザクション内の処理は”安全”な操作に限定される。
__transaction_cancelにより処理途中でキャンセル可能
(途中までの変更をロールバック)。
                                  18
__transaction_atomicとC++例外
トランザクション内からの例外送                      int x = 0, y = 0;
                                      int x = 0, y = 0;
出はコミット操作になる。                         __transaction_atomic {
                                      __transaction_atomic {
                                        x = 42;
                                        x = 42;
                                        throw -1;
                                        throw -1;
キャンセル例外送出の新構文。
                                        y = 100;
                                        y = 100;
ただし例外は整数型に限定。
                                     }}
(std::exception等はNG)                 // x = 42 && y = 0
                                      // x = 42 && y = 0
 __transaction_atomic {
  __transaction_atomic {
    x = 42;
    x = 42;
    __transaction_cancel throw -1;
    __transaction_cancel throw -1;
 }}
 // x = 0
  // x = 0
                                                               19
ほか

説明していないもの
●
  式/関数に対するトランザクション指定
●
  outer属性による最外(outermost)トランザクション指定
●
  transaction_may_cancel_outer属性, cancel文のレキシカ
  ルスコープ制約
●
  transaction_unsafe/safe属性の明示と推論
●
  トランザクションへのnoexcept指定
●
  メモリモデルの拡張(happens-beforeがどーたら)
etc.
            概略まとめ→ http://d.hatena.ne.jp/yohhoy/20120414/

                                                       20
まとめ

C++ Transactional Memory言語拡張
●
  C++11の次のTR/標準規格を目指した提案
●
  並行処理の記述を容易にするプログラミング抽象
●
  トランザクションを表現する新しい構文を追加
●
  トランザクションの動作を定義(実装方法はスコープ外)
●
  既存のロックやatomic変数と併用可能




                               21
で、いつから使えんの?

今日から。



GCC 4.7から実験的サポートが始まっています。
                       http://gcc.gnu.org/wiki/TransactionalMemory
                  対応状況調査→ http://d.hatena.ne.jp/yohhoy/20120603/



Try “g++ -std=c++11 -fgnu-tm”, and enjoy it.
  → そして教えて情報共有ください(当初目的)

Photo: gwire/flickr                                                  22

More Related Content

PDF
nakameguro_feature.cpp vol.8
PPT
Javaでトランザクショナルメモリを使う
PDF
イマドキC++erのモテカワリソース管理術
PDF
規格書で読むC++11のスレッド
PDF
C++ マルチスレッドプログラミング
PDF
C++ マルチスレッド 入門
PPTX
非同期処理の基礎
PPTX
冬のLock free祭り safe
nakameguro_feature.cpp vol.8
Javaでトランザクショナルメモリを使う
イマドキC++erのモテカワリソース管理術
規格書で読むC++11のスレッド
C++ マルチスレッドプログラミング
C++ マルチスレッド 入門
非同期処理の基礎
冬のLock free祭り safe

What's hot (20)

PDF
Intel TSX について x86opti
ODP
Boost9 session
PDF
Hls friends 20161122.key
PDF
Xtend30分クッキング やきに駆動
PDF
いいかげんな人のためのTransactional Memory Primer
PDF
x86とコンテキストスイッチ
PDF
0章 Linuxカーネルを読む前に最低限知っておくべきこと
PDF
プロセスとコンテキストスイッチ
PDF
From IA-32 to avx-512
PPTX
Sharing Deep Dive
PDF
Slaesforce TLS1.0 無効化にあたって
PDF
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
PDF
Haswellサーベイと有限体クラスの紹介
PDF
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
PDF
PDF
C/C++プログラマのための開発ツール
PDF
2章 Linuxカーネル - メモリ管理1
PPTX
Preludeのprecompile
KEY
関東GPGPU勉強会 LLVM meets GPU
PPTX
signal の話 或いは Zend Signals とは何か
Intel TSX について x86opti
Boost9 session
Hls friends 20161122.key
Xtend30分クッキング やきに駆動
いいかげんな人のためのTransactional Memory Primer
x86とコンテキストスイッチ
0章 Linuxカーネルを読む前に最低限知っておくべきこと
プロセスとコンテキストスイッチ
From IA-32 to avx-512
Sharing Deep Dive
Slaesforce TLS1.0 無効化にあたって
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
Haswellサーベイと有限体クラスの紹介
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
C/C++プログラマのための開発ツール
2章 Linuxカーネル - メモリ管理1
Preludeのprecompile
関東GPGPU勉強会 LLVM meets GPU
signal の話 或いは Zend Signals とは何か
Ad

Similar to C++ Transactional Memory言語拡張の紹介 (20)

PDF
最先端NLP勉強会2017_ACL17
PDF
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
Code jp2015 cpuの話
PPTX
良いコードとは
PPTX
Ll tiger clojure
KEY
NVIDIA Japan Seminar 2012
PPTX
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
PDF
エキ Py 読書会02 2章後半
PDF
ディープラーニングフレームワーク とChainerの実装
PDF
Cpu cache arch
PDF
130522 rt講習会(説明用)
PDF
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
PDF
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
PDF
C16 45分でわかるPostgreSQLの仕組み by 山田努
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
PDF
DTrace for biginners part(2)
最先端NLP勉強会2017_ACL17
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
競技プログラミングにおけるコードの書き方とその利便性
Code jp2015 cpuの話
良いコードとは
Ll tiger clojure
NVIDIA Japan Seminar 2012
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
エキ Py 読書会02 2章後半
ディープラーニングフレームワーク とChainerの実装
Cpu cache arch
130522 rt講習会(説明用)
PostgreSQLのSQL処理の流れとMVCC (第48回 PostgreSQLアンカンファレンス 発表資料)
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
C16 45分でわかるPostgreSQLの仕組み by 山田努
もしも… Javaでヘテロジニアスコアが使えたら…
DTrace for biginners part(2)
Ad

C++ Transactional Memory言語拡張の紹介

  • 1. C++ Transactional Memory 言語拡張の紹介 2012/7/28 Boost.勉強会 #10 東京
  • 2. はじめに 誰? twitter @yohhoy / hatena id:yohhoy 何を? C++11の”次”規格へ提案されている新機能の紹介 “ちょっと(?)未来”のお話です どうして? Google先生に聞いても情報がほとんど無い... → 勉強会 駆動 教えて君 2
  • 3. 情報源 ”Draft Specification of Transactional Language Constructs for C++”, Version 1.1, Feb. 3, 2012 https://sites.google.com/site/tmforcplusplus/ 一部翻訳→ http://d.hatena.ne.jp/yohhoy/20120413/ N3341 Transactional Language Constructs for C++ http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2012/ → いきなり次世代標準規格C++1y入りは目指さず、 まずはTR(Technical Report)として提案される 3
  • 4. もくじ ● Transactional Memoryの概略 ● データベースシステムとの対比, 導入の目的 ● ACID特性, Composability ● C++TM言語拡張は何を提供する/しないのか? ● 既存のロック, atomic変数との関係 ● C++TM言語拡張の新キーワード ● __transaction_relaxed, __transaction_atomic ● __transaction_cancel, C++例外との関係 4
  • 5. Transactional Memory(TM)? 発祥はデータベースな世界の”トランザクション”から。 同時操作から“メモリ”というリソースの一貫性を保護。 DB 変数 A=0→ 1 x=0→1 DBMS B=0→1 メモリ x=0→1 T1:(write) T2:(read) T1: T2: A=1 A= 1 x=1 x == 1 B=1 B=01 y=1 y == 0 1 処理1 処理2 処理1 処理2 5
  • 6. TM導入の目的(1) “The Free Lunch Is Over” (Herb Sutter, 2005) シングルスレッドな プログラム性能は頭打ち メニーコア時代の到来 メニーコアを活用する プログラミングが必要 マルチスレッド プログラミング 難しい!? 6
  • 7. TM導入の目的(2) Transactional Memoryとは Programming Abstraction ● 並行処理の記述を容易にするプログラミング抽象 ● プログラマは一連の処理に対し”トランザクション”と宣言する TMは特段新しいものではなく、既にいくつか実装系が存在 ● H/W: IBM BlueGene/Q, (Intel Haswell TSX), (AMD ASF ?) ● S/W: Haskell, Clojure, 各ベンダC++STM, TBoost.STM C++TM言語拡張の仕様へフィードバック Intel's TSX = Transactional Synchronization Extensions AMD's ASF = Advanced Synchronization Facility 7
  • 9. Composability Transactional Memoryがもたらす大きなメリット トランザクションは安全に”入れ子”にできます。 幾つかの小さなトランザクションを束ねて、1つの大きなトラ ンザクションを構成することが可能です。 デッドロックの恐怖から解放! C++テンプレート駆使したGenericコードとも相性良い Photo: espressoed/flickr 9
  • 10. もくじ ● Transactional Memoryの概略 ● データベースシステムとの対比, 導入の目的 ● ACID特性, Composability ● C++TM言語拡張は何を提供する/しないのか? ● 既存のロック, atomic変数との関係 ● C++TM言語拡張の新キーワード ● __transaction_relaxed, __transaction_atomic ● __transaction_cancel, C++例外との関係 10
  • 11. Transactional Language Constructs for C++ が提供するもの(1) C++TM言語拡張の仕様は... トランザクションを表現する構文と、トランザクション がどのように振舞うかのセマンティクスを定義する。 たったの35page!(1310page@C++11) ● 新しいキーワードを3つ追加 g++もClangも未実装 ● 新しい属性を5つ追加 ● C++11で追加された”Generaized Attibuttes”構文を使います。 ● C++メモリモデルを拡張 11
  • 12. Transactional Language Constructs for C++ が提供するもの(2) コードの雰囲気 キーワード [[transaction_safe]] [[transaction_safe]] ● __transaction_relaxed bool is_valid(Node *); bool is_valid(Node *); ● __transaction_atomic __transaction_atomic { __transaction_atomic { ● __transaction_cancel node->next = curr_node; node->next = curr_node; 属性 curr_node->prev = node; curr_node->prev = node; ● outer ● transaction_callable if (( !is_valid(node) )) if !is_valid(node) ● transaction_safe __transaction_cancel; __transaction_cancel; }} ● transaction_unsafe ● transaction_may_cancel_outer 12
  • 13. Transactional Language Constructs for C++ が提供しないもの C++TM言語拡張の仕様は... TMをどのように実現するか(実装方法)を定義しない。 ● Software TM/Hardware TM, Hybrid TM ● ワード単位/オブジェクト単位, 単一グローバルロック ● 楽観的/悲観的な同期戦略 並行性無視でTMを実現 etc. プログラマは「何を保護するか(what)」を記述し、 「どのように保護するか(how)」は処理系任せ。 13
  • 14. Lock, atomic, TM ロック(ミューテックス) 古典。構造的でないデータやGenericなコードでは使いに くい。複数ロックで容易にデッドロック。 atomic変数 Lock-Free実装などで利用。Primitiveなため軽量かつ高 速。メモリモデルの理解なしに迂闊に手を出すと...死。 Transactional Memory 原理的にデッドロックしない。抽象度の高い記述ができ開 発効率向上*。実行時動作も十分に高速...? (*) http://justingottschlich.com/wp-content/uploads/2012/05/2012.SG1_.tm_final.pdf 14
  • 15. Lock, atomic, TM ロック(ミューテックス) 古典。構造的でないデータやGenericなコードでは使いに 相 くい。複数ロックで容易にデッドロック。 補 atomic変数 的 に Lock-Free実装などで利用。Primitiveなため軽量かつ高 共 速。メモリモデルの理解なしに迂闊に手を出すと...死。 存 可 Transactional Memory 能 原理的にデッドロックしない。抽象度の高い記述ができ開 発効率向上*。実行時動作も十分に高速...? 動作速度はコンパイラや ライブラリ実装による 15
  • 16. もくじ ● Transactional Memoryの概略 ● データベースシステムとの対比, 導入の目的 ● ACID特性, Composability ● C++TM言語拡張は何を提供する/しないのか? ● 既存のロック, atomic変数との関係 ● C++TM言語拡張の新キーワード ● __transaction_relaxed, __transaction_atomic ● __transaction_cancel, C++例外との関係 16
  • 17. relaxed vs. atomic 2種類のトランザクションを提供 __transaction_relaxed 弱い分離性(Weak Isolation)。他のトラン ザクション処理と分離して実行される。一方 非トランザクション処理とは干渉。 __transaction_atomic 強い分離性(Strong Isolation)。他の全て のメモリアクセス操作と分離して実行され る。 Photo: timsackton/flickr 17
  • 18. relaxed, atomicとcancel relaxed/atomicトランザクション内でできること __transaction_relaxed トランザクション内で任意の処理を実行可能。ファイル I/Oといった非可逆な操作もOK。キャンセル不可。 __transaction_atomic トランザクション内の処理は”安全”な操作に限定される。 __transaction_cancelにより処理途中でキャンセル可能 (途中までの変更をロールバック)。 18
  • 19. __transaction_atomicとC++例外 トランザクション内からの例外送 int x = 0, y = 0; int x = 0, y = 0; 出はコミット操作になる。 __transaction_atomic { __transaction_atomic { x = 42; x = 42; throw -1; throw -1; キャンセル例外送出の新構文。 y = 100; y = 100; ただし例外は整数型に限定。 }} (std::exception等はNG) // x = 42 && y = 0 // x = 42 && y = 0 __transaction_atomic { __transaction_atomic { x = 42; x = 42; __transaction_cancel throw -1; __transaction_cancel throw -1; }} // x = 0 // x = 0 19
  • 20. ほか 説明していないもの ● 式/関数に対するトランザクション指定 ● outer属性による最外(outermost)トランザクション指定 ● transaction_may_cancel_outer属性, cancel文のレキシカ ルスコープ制約 ● transaction_unsafe/safe属性の明示と推論 ● トランザクションへのnoexcept指定 ● メモリモデルの拡張(happens-beforeがどーたら) etc. 概略まとめ→ http://d.hatena.ne.jp/yohhoy/20120414/ 20
  • 21. まとめ C++ Transactional Memory言語拡張 ● C++11の次のTR/標準規格を目指した提案 ● 並行処理の記述を容易にするプログラミング抽象 ● トランザクションを表現する新しい構文を追加 ● トランザクションの動作を定義(実装方法はスコープ外) ● 既存のロックやatomic変数と併用可能 21
  • 22. で、いつから使えんの? 今日から。 GCC 4.7から実験的サポートが始まっています。 http://gcc.gnu.org/wiki/TransactionalMemory 対応状況調査→ http://d.hatena.ne.jp/yohhoy/20120603/ Try “g++ -std=c++11 -fgnu-tm”, and enjoy it. → そして教えて情報共有ください(当初目的) Photo: gwire/flickr 22