3

私は C/C++ クロスプラットフォーム コードを開発しています。最後のプラットフォームは Itanium ベースの HP-UX です。関連するマシンとプロセッサの情報は、質問の最後にあります。

以下に示すマシンとコンパイラの仕様に対して、アトミックな比較と交換を実装または検索する必要があります。

解決策のいくつかの可能性を見つけましたが、それらの使用方法を見つけることができませんでした。

最初に考えられる解決策は、_Asm_cmpxchg (ドキュメントはこちら) を使用することです。これに含めるヘッダーや、コンパイルする方法がわかりません。

2 番目に考えられる解決策は、cmpxchg および cmpxchg8b コマンドを直接使用して独自のインライン アセンブリを作成することですが、これを正しく行う方法を見つけることもできませんでした。さまざまなリソースを見つけましたが、そのほとんどはアセンブリを直接記述しており、必要なプロセッサ アーキテクチャ用ではないか、具体的な例が十分に示されていません。

cmpxchg と cmpxchg8 の命令 (および tzcnt と lzcnt の 2 つはあると便利ですが、必須ではありません) に関するドキュメントをさらに見つけまし。Google Chrome で表示している場合、ページの絶対値は cmpxchg では 234、cmpxchg8 では 236 です。

制限:私には制御できない制約があるため、サード パーティのライブラリを使用できません。

uname -smr の結果: HP-UX B.11.31 ia64

プロセッサ モデル:インテル(R) Itanium(R) プロセッサ 9340

コンパイラ -v: aCC: HP C/aC++ B3910B A.06.28

更新: _Asm_cmpxchg をコンパイルすることができましたが、動作していないようです (値は変更されません)。パラメータとして、_Asm_sz には _SZ_W、_Asm_sem には _SEM_ACQ、_Asm_ldhint には _LDHINT_NONE、r3 には元の 32 ビット整数値へのポインタ、r2 には目的の新しい値を渡しました。ドキュメントが非常に不十分であることを考えると、パラメーターの意味を推測しています。

4

1 に答える 1

1

オプション1を使用して、自分で解決策を見つけることになりました。以下は、それを機能させるためのサンプルコードです。

bool compare_and_swap(unsigned int* var, unsigned int oldval, unsigned int newval)
{
    // Move the old value into register _AREG_CCV because this is the register
    // that var will be compared against
    _Asm_mov_to_ar(_AREG_CCV, oldval);
    // Do the compare and swap
    return oldval == _Asm_cmpxchg(
        _SZ_W /* 4 byte word */, 
        _SEM_ACQ /* acquire the semaphore */, 
        var, 
        newval, 
        _LDHINT_NONE /* locality hint */);
}
于 2015-08-20T20:39:59.607 に答える