gccでベクトル化する方法は?
-
03-07-2019 - |
質問
gcc
コンパイラのv4シリーズは、 SIMD プロセッサを使用してループを自動的にベクトル化できますAMD AthlonやIntel Pentium / Coreチップなどの一部の最新のCPU。これはどのように行われますか?
解決
元のページには、gccで自動的にベクトル化する方法の詳細が記載されています いくつかの例を含むループ:
http://gcc.gnu.org/projects/tree-ssa /vectorization.html
例は素晴らしいですが、最新のGCCでこれらのオプションを呼び出すための構文は少し変更されているようです。今すぐご覧ください:
要約すると、SSE2を搭載したx86チップでは次のオプションが機能します ベクトル化されたループのログを提供します:
gcc -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5
-msseも可能ですが、ループのみをベクトル化することに注意してください doubleまたはintではなく、floatを使用します。
他のヒント
gimple(GCCの中間表現)パスpass_vectorize
があります。このパスにより、gimpleレベルでの自動ベクトル化が有効になります。
自動ベクトル化(GCC V4.4.0)を有効にするには、次の手順を実行する必要があります。
- ターゲットアーキテクチャごとのベクトル内の単語数を指定します。これを行うには、マクロ
UNITS_PER_SIMD_WORD
を定義します。 - 可能なベクトルモードは、通常
<target>-modes.def
の別のファイルで定義する必要があります。このファイルは、マシン記述を含む他のファイルが存在するディレクトリに存在する必要があります。 (構成スクリプトに従って。スクリプトを変更できる場合は、ファイルを任意のディレクトリに配置できます。) -
ターゲットアーキテクチャごとのベクトル化で考慮されるモード。同様に、4ワードが1つのベクトルを構成するか、8つのハーフワードが1つのベクトルを構成するか、2つのダブルワードが1つのベクトルを構成します。この詳細は、
VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI /
ファイルに記載する必要があります。例:
VECTOR_MODES (INT, 16); / V16QI V8HI V4SI V2DI /
VECTOR_MODES (FLOAT, 8); / V4HF V2SF */-O2 -ftree-vectorize
-
ポートを構築します。ベクトル化は、コマンドラインオプション<=>を使用して有効にできます。