読者です 読者をやめる 読者になる 読者になる

yohhoyの日記(別館)

もうちょい長めの技術的メモをしていきたい日記

Boost.勉強会 #10 に参加しました

C++

2012/7/28に開催されたイベント Boost.勉強会 #10 東京 にて、“C++ Transactional Memory言語拡張の紹介”というタイトルで20分ほど話す機会をいただきました。

質疑応答

下記は発表後に行われた質問と回答を並べたものです。改めて書き起こすと結構分量がありますね。

  • Q. コミットとキャンセルしか提供されず機能がミニマムセット過ぎる?(Haskeller曰く)リトライが無いと使い物にならないらしい。補足として、TBoost.STMにはリトライ機能が存在する。
  • A.ドラフト仕様Ver.1.1段階では指摘どおり。ドラフト仕様のAppendixに拡張機能の候補として上げられており、今後の改訂で追加される可能性はあるかも。
  • Q. gccのTM拡張はゼロオーバーヘッドなのか?TM拡張を有効にした場合、atomicトランザクションを利用しなくてもオーバーヘッドは無いのか?
  • A. 性能については分からない。現時点ではSTM実装となっており何らかのオーバーヘッドがあるかも。
  • Q. atomicトランザクションから操作する変数であるか否かを指定する構文が存在しないとすると、全ての変数がトランザクション操作されうると見なすのか?
  • A. atomicトランザクションをSTMでどう実装するのか想像つかなかった。HTMなら専用命令で変数アクセスを検知できるような気がする。
  • Q. HTMでも対象となるアドレス数(変数の個数)には制限があるのでは?
  • A. そう思う。
  • Q. トランザクション内ではint等のプリミティブしか扱えない?クラスは?
  • A. 使える。クラス操作はプリミティブ操作の集合へと分解されるため。
  • Q. トランザクション内でnew演算子も使える?
  • A. 仕様上は組み込みの演算子に限りnew/deleteを使えるとある。ただし処理系によっては使用不可と制限がかかるかもしれない。
  • Q. ロックとTMのパフォーマンス比較って何か公開されている?
  • A. 自分で計ったデータは無い。GCC公式ドキュメントにも実行速度は今後にご期待くださいとあるのみ。
  • Q. トランザクション内から整数しか例外送出できないのは超悲しい。ポインタ値を送出した場合にIsolationが壊れるのを防ぐためだろう。何とかかならないのか?
  • A. 何とかなる仕様を提案してね。
  • Q. atomicトランザクション内でファイルI/Oのような非可逆操作を行おうとすると、ビルドエラーとなるのか?
  • A. コンパイル時エラーとなる。transaction_safe/unsafe属性によりコンパイル時に判断可能な仕様設計となっている。
  • Q. 例えばC言語ライブラリを呼ぶなど判断できない場合はどうする?
  • A. 標準ライブラリが提供する安全でない関数には、処理系の責任でtransaction_unsafe属性を付けているはず。

感想とか

参加された方々の前提知識レベルをどこに置けばよいか分からず、発表時間の半分をTransactional Memoryそのものの説明に当てました。一方で共有メモリアーキテクチャを前提とすることや、マルチスレッドプログラミングの知識があることは無条件に仮定しています。もっとC++TM言語拡張仕様について説明するパターンでも良かったのかなと感じました。

発表内容の意図としては「C++言語仕様に対するTransactional Memory拡張“言語仕様”の紹介」でしたが、当然ながらSTM/HTM等でどのように実装・実現されるのかという質問も出ました。実性能が気になるというのは十分予測されたのですが、現時点では性能面における期待はできないと考え、発表内容は純粋に言語仕様のみを対象としました。

今回紹介したC++TM言語拡張が本当に次期C++へ導入されるか否かは分かりませんが、Transactional Memoryなどの並列・並行処理における抽象化機構に足を踏み入れるきっかけになれば幸いです。