yohhoyの日記

技術的メモをしていきたい日記

GCC 4.7.0のTransactionalMemoryサポート

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);
  }
}