問題タブ [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.

0 投票する
1 に答える
1084 参照

c++ - __restrict__ と __attribute__((aligned(32))) の組み合わせ

gccが知っていることを確認したい:

  1. ポインタはメモリの重複しないチャンクを参照します
  2. ポインタには 32 バイトのアラインメントがあります

以下は正しいですか?

ありがとう。

アップデート:

1回の読み取りと多数の書き込みを使用して、書き込み用のCPUポートを飽和させようとしています。整列した動きによるパフォーマンスの向上がより重要になることを願っています。

ただし、アセンブリは、位置合わせされた移動ではなく、位置合わせされていない移動を引き続き使用します。

コード ( godbolt.orgにもあります)

gcc 8.2 と "-march=haswell -O3" でコンパイルされたアセンブリ これは、アラインされていない移動である vmovups でいっぱいです。

sandybridge でも同じ動作:

乗算の代わりに加算を使用する ( godbolt )。まだ調整されていない動き。

0 投票する
4 に答える
502 参照

c - Clang は「const」ポインタ指定子を誤解していますか?

restrict以下のコードでは、clang が暗黙的なポインター指定子なしではより適切な最適化を実行できないことがわかりました。

このコードは、clang バージョン11.0.0 (clang-1100.0.32.5) でコンパイルしました。

逆アセンブルされたファイルでは、生成されたコードがメモリを再読み取りすることがわかりました。

ポインターにキーワードを追加した後restrict、これらの不要な再読み取りは消えました。

私は、clangでは、デフォルトで厳密なエイリアシングが無効になっていることを知っています。しかし、この場合、ポインターはそのオブジェクトのコンテンツをこのポインターによって変更できないようにevent_ptr定義されているため、どのポイントへのコンテンツに影響を与えることはできません (オブジェクトがメモリ内でオーバーラップする場合を想定して) ですよね?constqueue_ptr

これはコンパイラの最適化のバグですか、それとも実際には、この宣言を想定するqueue_ptrことでオブジェクトが指す奇妙なケースがあります:event_ptr

ちなみに、同じコードを x86 ターゲット用にコンパイルして、同様の最適化の問題を調査しました。


キーワードを使用して生成されたアセンブリrestrictは、再読み取りが含まれていません。


添加:

彼の回答へのコメントで Lundin と議論した後、再読み込みが発生するqueue_ptr->queue可能性があるという印象を受けました*queue_ptr。そこでqueue_t、ポインターの代わりに配列を含むように構造体を変更しました。

ただし、再読み取りは以前のままでした。フィールドが変更されている可能性があり、再読み取りが必要であるとコンパイラが判断する原因をまだ理解できませんqueue_t...次の宣言は、再読み取りを排除します。

しかし、理解できない再読み取りを防ぐためにポインターqueue_ptrとして宣言する必要があるのはなぜですか (コンパイラーの最適化の「バグ」でない限り)。restrict

PS

ファイルへのリンクも見つかりませんでした/コンパイラがクラッシュする原因とならないclangの問題を報告しました...