問題タブ [restrict-qualifier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ポインタがエイリアスされていないことをCまたはC++コンパイラに伝える方法
私は次のようなポインタの配列を受け取る関数を持っています:
私がコンパイラーに伝えたいのは、ポインターptrs[i]
が相互のエイリアスではなく、配列ptrs[i]
がオーバーラップしないことです。どうすればいいですか?私の裏の動機は、自動ベクトル化を促進することです。
__restrict__
また、?のイテレータと同じ効果を得る方法はありstd::vector
ますか?
c++ - __restrictおよびshared_ptrハック
次は安全ですか?
fooとbarの__restrictに注意してください。
目標は、すべてのオブジェクトエイリアスが停止したときに、メモリの自己破壊を割り当てることです。
cuda - CUDA:配列へのポインターの配列に__restrict__を適用するにはどうすればよいですか?
2つのint配列を使用するこのカーネルは、__restrict__
正常にコンパイルされます。
ただし、ポインタ配列に構成された同じ2つのint配列は、コンパイルに失敗します。
コンパイラによって与えられるエラーは次のとおりです。
配列へのポインタの配列として構成される特定の構造があります。(たとえば、を持っているカーネルに渡された構造体int* arr[16]
。)カーネルにそれらを渡してそれらに適用できるようにするにはどうすればよい__restrict__
ですか?
c - `volatilerestrict`ポインタの実用的な使用法はありますか?
const volatile
次のような修飾変数
の実用的な使用法を見ることができます
基盤となるハードウェアメカニズムが毎秒値を更新するが、変数が(おそらく埋め込まれた)ハードウェアで書き込み可能でない場合。また、3つすべて(C11では4つ)の型修飾子は独立していると見なされるため、すべての組み合わせが許可されているようです。しかし、私は、restrict volatile
修飾されたポインターが本当に意味をなす実際の状況を想像するのに途方に暮れています。
[編集:明確にするために:両方とも、ポイントされたオブジェクトではなく、ポインターvolatile
にrestrict
適用されます!]
これは言語で許可されているがそれ自体では役に立たない構造ですか、それともこれが役立つ可能性のあるアプリケーション領域が不足していますか?
c++ - shared_ptr に __restrict__ を適用できますか?
スマートポインターはその下のポインターであるため、別の 、または任意の種類の別のポインターをshared_ptr
エイリアスしないように関数へのパラメーターを定義する方法はありshared_ptr
ますか?
それとも、これは何らかの理由で不要ですか?
私は gcc >=4.2 および llvm-clang >=2.0 コンパイラに関心があります (他のコンパイラの回答も興味深いでしょう)。
c - GCC で __declspec(noalias) を移植する方法
私が正しく取得した場合__declspec(noalias)
、パラメーターとして渡されたポインターのいずれもエイリアスされていないことをコンパイラーに伝えます。
別の言い方をすると、私が間違っていなければ__restrict
、ポインター型のすべてのパラメーターを呼び出すのとまったく同じです。しかし、すべての関数呼び出しを変更せずにそれを行う方法はありますか? 理想的には、それ__declspec(noalias)
をプリプロセッサ定義に置き換えます。
c++ - GCC/G++ は成功するが、ポインターを制限する OpenMP は ICC で失敗する
乗算ループで暗黙的な openMP ディレクティブを使用して、 CRSでスパース行列の単純な行列ベクトル乗算を実装しました。
完全なコードは GitHub にあります: https://github.com/torbjoernk/openMP-Examples/blob/icc_gcc_problem/matxvec_sparse/matxvec_sparse.cpp
注: 醜いです ;-)
プライベート メモリと共有メモリを制御するために、restrict ポインターを使用しています。64 ビット Linux で GCC 4.6.3 を使用してコンパイルすると、正常に動作します (コマンド内の%u
とに関する 2 つの警告を除いて、それは問題ではありません)。unsigned int
printf
ただし、64 ビット Linux で ICC 12.1.0 を使用してコンパイルすると、次のエラーで失敗します。
問題の変数とポインタの定義で
そして、次のように定義された openMP ディレクティブ
g++ でコンパイル:
Icc でコンパイル:
- GCC/ICCの使い方の誤りでしょうか?
- これは私のコードの設計上の問題であり、未定義の動作を引き起こしていますか?
もしそうなら、どの行がそれを引き起こしていますか? - ICCとGCCの不一致ですか?
もしそうなら、コンパイラの独立性と互換性を達成するための良い方法は何でしょうか?
c - c99 __restrict とコンパイラの最適化
Intel コンパイラのバージョン 11.1 と gcc のバージョン 4.6 の場合、コンパイラは最後の 4 つのステートメントごとに my_s1_ptr->field1 をリロードするようです。__restrict についての私の理解では、最後の 3 回の読み込みは冗長であり、削除できることが示唆されます。はい、コードが奇妙であることは承知していますが、このように構成されているのには理由があります。コンパイラに冗長な負荷を排除させたいだけです。それを行うように説得する方法はありますか?
c++ - ポインターとインライン化を制限する
限定修飾ポインターを使用しようとしましたが、問題が発生しました。以下のプログラムは、問題を提示するためだけの単純なものです。
calc_function は 3 つのポインターを使用しますが、これは制限されているため、相互にエイリアスを作成することはできません。Visual Studio でこのコードをコンパイルすると、関数がインライン化されるため、Visual Studio 2010 が修飾子を無視する理由はありません。インライン化を無効にすると、コードは 6 倍以上高速に実行されます (2200 ミリ秒から 360 ミリ秒)。しかし、プロジェクト全体またはファイル全体でインライン化を無効にしたくありません (たとえば、すべてのゲッターとセッターでオーバーヘッドが呼び出されるため、これは恐ろしいことです)。
(唯一の解決策は、この関数のみのインライン化を無効にすることでしょうか?)
関数の上部と内側のループの両方に一時的な制限修飾ポインターを作成して、エイリアシングがないことを約束することをコンパイラーに伝えようとしましたが、コンパイラーは私を信じません。仕事。また、コンパイラの設定を微調整しようとしましたが、機能することがわかった唯一の方法は、インライン化を無効にすることです。
この最適化問題を解決するための助けをいただければ幸いです。
プログラムを (realeasemode で) 実行するには、引数 0 1000 2000 を使用することを忘れないでください。ユーザー入力/プログラム引数を使用する理由は、ポインター間にエイリアシングがあるかどうかをコンパイラーが認識できないようにするためです。 a、b、およびc。
c - restrict キーワード - 最適化とエイリアシングの影響
restrict
修飾子を参照して、C11 標準の次の 2 つのセクションに出くわしました。
1#
6.7.3-8
制限修飾ポインターを介してアクセスされるオブジェクトには、そのポインターとの特別な関連付けがあります。以下の 6.7.3.1 で定義されているこの関連付けでは、そのオブジェクトへのすべてのアクセスで、直接的または間接的に、その特定のポインターの値を使用する必要があります。また、適合プログラムを構成するすべての前処理翻訳単位から修飾子のすべてのインスタンスを削除しても、その意味 (つまり、観察可能な動作) は変わりません。
筆記体の断片の意味を説明してもらえますか? 私の解釈では、意味が変わらないので、の使用restrict
は無意味に見えます...
2#
6.7.3.1-6
翻訳者は、restrict の使用によるエイリアシングの影響の一部またはすべてを自由に無視できます。
これらのエイリアシングの意味は何でしょうか? いくつかの例を見せてもらえますか?