32

Clang と g++ C++11 の実装状況を見ていると、奇妙なことに気付きました。
これらは C++11 アトミックをサポートしていますが、C++11 メモリ モデルをサポートしていません。
アトミックを使用するには C++11 メモリ モデルが必要であるという印象を受けました。それでは、アトミックとメモリ モデルのサポートの違いは何でしょうか?
メモリ モデルのサポートがないということは、std::atomic<T>seq を使用する正当な C++11 プログラムが一貫していないことを意味しますか?

参照:
http://clang.llvm.org/cxx_status.html
http://gcc.gnu.org/gcc-4.7/cxx0x_status.html

4

3 に答える 3

15

問題の 1 つは、「メモリ位置」の定義です。これにより、異なるロックによって異なる構造体メンバーをロックできるようになります (また、コンパイラにサポートを強制します)。これによって引き起こされる RL 問題についての議論があります。

基本的に問題は、struct次のように定義されていることです。

struct x {
    long a;
    unsigned int b1;
    unsigned int b2:1;
};

コンパイラーはb2、上書きによる書き込みも自由に実装b1できます (レポートから判断すると、どうやらそうです)。したがって、2 つのフィールドを 1 つとしてロックする必要があります。ただし、C++11 メモリ モデルの結果として、これは禁止されています (まあ、実際に禁止されているわけではありませんが、コンパイラは同時更新を保証する必要があり、b1干渉しないようにする必要がありb2ます。そのような各更新をロックまたは CAS することでそれを行うことができます)。 、まあ、一部のアーキテクチャでは生活が困難です)。レポートからの引用:

私は GCC 担当者にこの問題を提起しましたが、彼らは次のように言いました:「C はそのような保証を提供しません。また、自然に整列されたワードサイズのメモリ領域を共有する場合、異なる構造体フィールドを異なるロックで確実にロックすることもできません。C+ +11 メモリ モデルはこれを保証しますが、それは実装されておらず、C++11 コンパイラでカーネルをビルドすることもありません。」

wikiにも素敵な情報があります。

于 2012-07-06T09:43:55.620 に答える
11

これらの場合の「メモリ モデルの欠如」は、C++11 メモリ モデルが公開される前にオプティマイザーが作成され、無効な最適化を実行する可能性があることを意味していると思います。メモリ モデルに対して最適化を検証することは非常に困難で時間がかかるため、clang/gcc チームがまだそれを完了していないことは大きな驚きではありません。

メモリ モデルのサポートがないということは、std::atomic を使用する正当な C++11 プログラムが seq の一貫性を保っていないことを意味しますか?

はい、可能性があります。さらに悪いことに、コンパイラは (C++11 標準に従って) 競合のないプログラムにデータ競合を導入する可能性があります。たとえば、投機的な書き込みを導入することによってです。

たとえば、この最適化を実行するために使用されるいくつかの C++ コンパイラは次のとおりです。

for (p = q; p = p -> next; ++p) {
    if (p -> data > 0) ++count;
}

次のように最適化できます。

register int r1 = count;
for (p = q; p = p -> next; ++p) {
    if (p -> data > 0) ++r1;
}
count = r1;

すべてp->dataが負でない場合、元のソース コードは に書き込みませんcountが、最適化されたコードは書き込みます。これにより、競合のないプログラムでデータ競合が発生する可能性があるため、C++11 仕様ではそのような最適化は許可されていません。既存のコンパイラは、すべての最適化を検証 (および必要に応じて調整) する必要があります。

詳細については、同時実行メモリ モデル コンパイラの結果を参照してください。

于 2012-07-03T17:12:00.093 に答える
0

メモリ モデルをサポートしていないということではなく、メモリ モデルとやり取りするための標準の API を (まだ) サポートしていないということです。その API には多数のミューテックスが含まれています。

ただし、Clang と GCC はどちらも、しばらくの間、正式な標準なしで可能な限りスレッドを認識してきました。アトミック操作の間違った側に移動する最適化について心配する必要はありません。

于 2012-07-02T18:55:15.560 に答える