4

gcc が実行できる自動ベクトル化を利用した人はいますか? 現実の世界では (コード例とは対照的に)? 利用するには、既存のコードを再構築する必要がありますか? この方法でベクトル化できる実稼働コードにはかなりの数のケースがありますか?

4

5 に答える 5

5

GCC または Intel C++ のいずれかが、非常に単純なループ以外のものを自動的にベクトル化するのをまだ見たことがありません。ベクトル化できる (そして、SSE 組み込み関数を使用して手動で書き直した後) アルゴリズムのコードが与えられたとしてもです。

これの一部は保守的です。特にポインターのエイリアシングの可能性に直面した場合、C/C++ コンパイラーがベクトル化が安全であることを「証明」することは、たとえプログラマーが安全であることを知っていたとしても非常に困難です。ほとんどのコンパイラは、コードを誤ってコンパイルする危険を冒すよりも、コードを最適化しないことを (賢明に) 好みます。これは、少なくとも理論的には、高水準言語が C よりも優れている領域の 1 つです (自動ベクトル化 ML または Haskell コンパイラを実際に認識していないため、理論的に言うと)。

もう 1 つの部分は、単純に分析上の制限です。ベクトル化のほとんどの研究は、数年前までほとんどのベクトル マシンのパンとバターであ​​った古典的な数値問題 (流体力学など) の最適化に関連していると理解しています (CUDA と/OpenCL、Altivec/SSE、STI セルなど、さまざまな形式のベクトル プログラミングが商用システムで広く利用できるようになりました)。

スカラー プロセッサを念頭に置いて記述されたコードが、コンパイラで簡単にベクトル化できる可能性はほとんどありません。幸いなことに、ループのタイリングや部分的なループのアンローリングなど、コンパイラーがベクトル化の方法を理解しやすくするためにできる多くのことは、コンパイラーが方法を理解していなくても、最新のプロセッサーでのパフォーマンスを向上させる (傾向がある) ものです。ベクトル化します。

于 2009-10-20T19:47:13.213 に答える
1

ビジネス ロジックで使用するのは難しいですが、同じ方法で大量のデータを処理している場合は高速化されます。

良い例は、すべてのサンプル/ピクセルに同じ操作を適用するサウンド/ビデオ処理です。これには VisualDSP を使用しましたが、コンパイル後に結果を確認する必要がありました。

于 2009-01-04T07:31:03.167 に答える
0

ベクトル化された命令は、Cell プロセッサに限定されません。ほとんどの最新のワークステーションのような CPU (PPC、pentium 3 以降の x86、Sparc など...) に搭載されています。浮動小数点演算にうまく使用すると、非常に計算量の多いタスク (フィルターなど) に非常に役立ちます。私の経験では、自動ベクトル化はうまく機能しません。

于 2009-02-22T05:47:49.063 に答える
0

お気付きかもしれませんが、GCC の自動ベクトル化をうまく活用する方法を実際に知っている人はほとんどいません。Web を検索して人々のコメントを見ると、GCC では自動ベクトル化を有効にできるという考えが常に浮かびますが、実際にそれを使用することはほとんどないため、SIMD アクセラレーション (例: MMX、 SSE、AVX、NEON、AltiVec) の場合、基本的には、コンパイラ組み込み関数またはアセンブリ言語コードを使用してそれを記述する方法を理解する必要があります。

しかし、組み込み関数の問題は、アセンブリ言語側を効果的に理解し、必要なものを記述する組み込みメソッドを学習する必要があることです。これにより、アセンブリ コードで記述した場合よりもコードの効率が大幅に低下する可能性があります ( 10 倍など)、コンパイラは組み込み命令をうまく活用するのにまだ問題があるためです!

たとえば、多くの演算を同時に並列実行できるように SIMD イントリンシクスを使用している可能性がありますが、コンパイラはおそらく、SIMD レジスタと通常の CPU レジスタの間でデータを転送するアセンブリ コードを生成し、効果的にSIMD コードは、通常のコードと同じ速度 (またはさらに遅い速度) で実行されます。

だから基本的に:

  • 最大 100% のスピードアップ (2 倍の速度) が必要な場合は、公式の Intel/ARM コンパイラを購入するか、コードの一部を変換して SIMD C/C++ Intrinsics を使用します。
  • 1000% のスピードアップ (10 倍の速度) が必要な場合は、SIMD 命令を使用して手動でアセンブリ コードに記述します。または、ハードウェアで利用可能な場合は、代わりに OpenCL や Nvidia の CUDA SDK などの GPU アクセラレーションを使用してください。SIMD が CPU で行うのと同様のスピードアップを GPU で提供できるからです。
于 2011-03-31T06:12:34.007 に答える
0

ベクトル化は、主に数値プログラムに役立ちます。ベクトル化されたプログラムは、PS3 ゲーム コンソールで使用される STI セル プロセッサのようなベクトル プロセッサでより高速に実行できます。そこでは、たとえばゲーム グラフィックスのレンダリングに使用される数値計算は、ベクトル化によって大幅に高速化できます。このようなプロセッサは、SIMD (Single Instruction Multiple Data) プロセッサと呼ばれます。

他のプロセッサでは、ベクトル化は使用されません。ベクトル化されたプログラムは、非 SIMD プロセッサには適用できないベクトル化された命令セットで実行されます。

Intel の Nehalem シリーズのプロセッサ (2008 年後半にリリース) は、SIMD 命令である SSE 4.2 命令を実装しています。出典:ウィキペディア

于 2009-01-05T01:53:17.810 に答える