問題タブ [loop-unrolling]
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 - 経過時間が0なのはなぜですか?
ループをアンロールし、配列をソートするのにかかる時間を測定するプログラムを作成しましたが、問題は、アンロールされたループ プログラムがナノ秒単位で 0 の答えを返すことがあるということです。私もMONOTONICで試してみましたが、役に立ちません。これが私のコードです:
c++ - Clang または GCC は、手動で展開されたループを自動ベクトル化できますか?
私は、特定の種類の数値アルゴリズムを記述するためのコード スタイルのアイデアを持っています。このコード スタイルでは、データ レイアウトにとらわれない方法でアルゴリズムを純粋に記述します。
つまり、すべての関数は (1 つまたは複数の) スカラー引数を取り、(ポインターを介して) 1 つまたは複数のスカラー戻り値を返します。したがって、たとえば、3 つのメンバーを持つ構造体または float[3] xyz を使用する代わりに、3d float ベクトルを使用する関数がある場合、float x、float y、float z を使用します。
アイデアは、入力データと出力データのレイアウトを変更できるということです。つまり、配列の構造体と構造体データの配列の配列、キャッシュ効率のためのタイルレイアウト、SIMD とマルチコアの粒度などで遊ぶことができます...データ レイアウトのすべての組み合わせについて、すべてのコードを書き直す必要があります。
この戦略にはいくつかの明らかな欠点があります。
- 関数内で for ループを使用してコードをよりコンパクトにすることはできません
- 関数のシグネチャには、より多くのパラメーターが必要です
...しかし、配列が短い場合、それらは口当たりが良く、高速にするためにコードを何度も書き直す必要がなくなります。
しかし特に、コンパイラが x+=a; のようなものを扱えないのではないかと心配しています。y+=b; z+=c; インライン化された関数のスタックの一番上で SIMD を実行するのではなく、呼び出しスタックの一番下で SIMD を実行したい場合は、w+=d を使用して単一の SIMD ベクトル add に自動ベクトル化します。
clang および/または gcc は、C および/または C++ コードで (おそらく関数がインライン化された後) 手動でアンロールされたループを「再ロール」し、ベクトル化されたマシン コードを生成できますか?