8

OpenMP は、C++11 とは対照的に、変数ではなくメモリ操作の観点から原子性を使用して動作します。これにより、たとえば、コンパイル時にサイズが不明なベクトルに格納されている整数に対してアトミックな読み取り/書き込みを使用できます。

std::vector<int> v;

// non-atomic access (e.g., in a sequential region):
v.resize(n);
...
v.push_back(i);
...

// atomic access in a multi-threaded region:
#pragma omp atomic write // seq_cst
v[k] = ...;
#pragma omp atomic read // seq_cst
... = v[k];

C++11 では、これを実現することはできません。メモリモデルを緩和することで、アトミック変数に非アトミックとしてアクセスできますが、アトミック要素のベクトルのサイズを変更することはできません。

C++ がアトミック メモリ操作による非アトミック変数へのアクセスを許可しない理由があることを理解しています。しかし、これらの理由が OpenMP にも当てはまらないのはなぜだろうか。

たとえば、N4013では、 「アトミックとして宣言されていないデータにアトミック操作を完全に移植可能に適用する合理的な方法はない」と述べられています。OpenMP がそのような移植性を保証できるのに、C++ が保証できないというのはどうしてでしょうか?

4

1 に答える 1

2

それぞれの標準を理解している限り、OpenMP は C++11 よりも使用に関する制限が多く、特殊な型を使用しなくても移植できます。たとえば、OpenMP 4.5 は次のように述べています。

x で指定された記憶域の位置がサイズ調整されていない場合 (つまり、x のバイト配置が x のサイズの倍数でない場合)、アトミック領域の動作は実装定義です。

一方、C++11 が を使用するstd::atomic<int>場合、コンパイラは適切なアラインメントを保証します。どちらの場合もアラインメントが必要ですが、OpenMP と C++1 では、アラインメントの責任者が異なります。

一般に、OpenMP と C++ の間には哲学的な違いがありますが、それらすべてを列挙することは困難です。OpenMP は HPC を対象としていますが、C++ の人々はあらゆるものへの移植性を考えています。

于 2016-07-10T17:21:22.653 に答える