uchan note

プログラミングや電子工作の話題を書きます

MOVZX r64, r/m8は何のために存在するのか分からない

MOVZX は,レジスタやメモリの値を,それよりビット数の大きいレジスタに 0 拡張しつつコピーする x86-64 の命令です。 その中の MOVZX r64, r/m8 の存在意義が分からなかったので,どなたかご存知の方は教えてください。

続きを読む

C++ の release sequence の意味と役割

C++ の release sequence とはアトミック変数の読み書きに関するルールです。release sequence は release store を先頭とし,それに続く read-modify-write の列です。先頭の store,または後続の read-modify-write によって書き込まれた値を acquire load した際に store と load 間に happens-before 関係を付与するためのルールが release sequence です。この記事では release sequence が何を表すのかと,どんな時に役立つのかを解説します。

想定読者

  • 最小限のオーバーヘッドで異なるスレッド間の操作に happens-before 関係を付けたい人
  • C++ のメモリモデルを深く理解するために release sequence を理解しようとしている人
続きを読む

データ競合と happens-before 関係

この記事は,マルチスレッドのプログラムでしばしば見る,そして発見が困難であるバグ「データ競合」と,それを見つけるのによく使われる「happens-before 関係」について解説します。 筆者は特に x86-64 アーキテクチャにおけるバグ検出に興味がありますので,一般的な話というよりは x86-64 に寄せた話になります。

想定読者

  • データ競合バグの発生原理やアトミック変数を使ったバグの防止方法を知りたいと思っているプログラマ
  • データ競合バグを検出する手法,特に happens-before 関係を勉強したいプログラム解析手法の研究者

x86-64 & C++ を例に説明しますが,その他のアーキテクチャや言語にも通じる話もたくさんあります。

続きを読む

std::atomic の挙動がメモリオーダーによりどう異なるか

C++ の std::atomic がメモリオーダーの指定によってどう挙動が変わるかを調べました。 x86-64 アーキテクチャにおいて,アトミック変数の読み書きがどのような機械語になるかが主なテーマです。

(2020/06/15 筆者の知識がアップデートされましたので記事を大きく修正しました)

続きを読む

ccコマンドが無いとIntel Pinが実行できない

新規にインストールした Ubuntu 20.04 上で Intel Pin 3.13 (March 25, 2020) が上手く動かなかったので原因究明したメモです。 make と g++ パッケージのみを導入した状態では /usr/bin/cc が存在せず,それが原因で Intel Pin ツールのビルドが上手くいっていない問題に遭遇しました。

続きを読む

ベクタークロックと競合検査

ベクタークロック(vector clock)という名前は,クロック(時計)を並べたベクターというところからきています。 マルチスレッドプログラムの競合検査の分野で言うベクタークロックは,各スレッドの論理時刻を並べたものです。

uchan がベクタークロックをちょっと勉強したので,メモがてら解説を書いてみます。 最終的に,競合状態を検出する実例を示すところまでをゴールとします。

続きを読む