質問

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

役に立ちましたか?

解決

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

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

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

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

他のヒント

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

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

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

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

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

ベクトル化された命令は、セルプロセッサに限定されません-ほとんどの最新のワークステーションのようなCPUにはそれらがあります(PPC、ペンティアム3以降のx86、Sparcなど)。浮動小数点演算に適切に使用すると、非常に多くの計算を必要とするタスク(フィルターなど)に非常に役立ちます。私の経験では、自動ベクトル化はあまりうまくいきません。

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

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

たとえば、SIMD Intrinsicsを使用して多くの操作を同時に並行して実行できますが、コンパイラはおそらくSIMDレジスタと通常のCPUレジスタ間でデータを転送するアセンブリコードを生成します。 SIMDコードを通常のコードと同様の速度(またはさらに遅い速度)で効果的に実行します!

基本的に:

  • 最大100%の高速化(2x 速度)、その後、購入する 公式のIntel / ARMコンパイラー、またはコードの一部を変換してSIMD C / C ++組み込み関数を使用します。
  • あなたが 1000%の高速化(10倍の速度)が必要な場合、 手動でSIMD命令を使用してアセンブリコードで記述します。または、ハードウェアで利用可能な場合は、OpenCLやNvidiaのCUDA SDKなどの代わりにGPUアクセラレーションを使用します。これらは、CPUのSIMDと同様の高速化をGPUで提供できるためです。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top