GCC 4.7から実験的サポートが始まったTransactional Memory(TM)についてメモ。
主に "Draft Specification of Transactional Language Constructs for C++, Version 1.1"*1 で定義される拡張キーワードのsyntaxサポート確認を行った。
TMサポートの有効化
GCC 4.7.0でTMサポートを有効にするには、オプション -fgun-tm を指定する。またTMサポートはC++11/C11メモリモデルを前提とする機能であり、旧来のC++03/C90モードでTMを利用することは無い(はず)。
$ g++ -std=c++11 -fgnu-tm input.cpp $ gcc -std=c11 -fgnu-tm input.c
TMサポートを有効化した生成バイナリは、ランタイムライブラリ libitm とリンクされる。
キーワード/属性のsyntax対応状況
下表はキーワード/属性へのsyntax対応状況を表す。単にコンパイルが通るか否かを基準としており、正しいsemanticsで機能するかまでは確認していない。
__transaction_relaxed | ○ |
__transaction_atomic | ○ |
__transaction_atomic [[outer]] | ○ |
__transaction_cancel | ○ |
__transaction_cancel [[outer]] | ○ |
__transaction_cancel throw | × |
__transaction_cancel [[outer]] throw | × |
transaction_callable属性 | △ |
transaction_unsafe属性 | △ |
transaction_safe属性 | △ |
transaction_may_cancel_outer属性 | △ |
GCC 4.7.0現在はGeneralized attributesをサポートしないため、クラス/関数に対する属性指定はGCC独自キーワード__attribute__を用いる必要がある。一方、__transaction_atomic, __transaction_cancelキーワードに対するouter属性はGeneralized attributes相当の表記でコンパイルが通る。(内部的には "__transaction_atomic [[outer]]" で1つのキーワードとして処理しているのかも?)
// "[[transaction_may_cancel_outer]] void bar (int x)"と書きたい... __attribute__((transaction_may_cancel_outer)) void bar(int x) { __transaction_atomic { //... if (/*...*/) __transaction_cancel [[outer]]; } } void foo(int x) { __transaction_atomic [[outer]] { //... bar(x); } }
その他(おまけ)
GCC 4.7.0では関数に対してtransaction_pure属性を指定可能。古いDraftにあった属性か。
"transaction_pure" indicates that the function can be called in transaction without any instrumentation (same function as in non transactional code)
http://ics.forth.gr/carv/transform/_docs/its_slides/STM-PartIV.pptx.pdf
関連URL