2011-01-24 12 views
2

私はSSE(2)組み込み関数で手の最適化を行うアルゴリズムを利用しています。さらに、このアルゴリズムは将来、256ビットAVXレジスタの恩恵を受けることもできます。x86 CPU C++でのSSE/AVXのディスパッチ

私の質問は、コンパイル時に私のクラスの可用性のバリアントを登録し

  • するための最良の方法は何かということです。だから私のクラスは:FooFooSSE2FooAVX私は実行時にコンパイルするクラスを決定する手段が必要です。
  • 現在のCPUの能力を決定します。最低レベルでは、cpuidコールになります。
  • コンパイルされたものとサポートされているものに基づいて、実行時に何を使用するかを決定します。

私は上記のほとんどをハックすることができますが、いくつかのベストプラクティスが浮かび上がっているに違いない共通の問題であるようです。理想的には私はちょうどあなたのクラスの適切なインスタンスを作成し、工場を実装して、ファイル内のすべてのロジックを非表示にするには、「工場」クラスや関数を作成#ifdef混乱

#ifdef COMPILE_SSE2 
    if (sse2_supported) 
     // Use the SSE2 class 
#endif 

答えて

0

を避けるためにしようとしています。

"isSSE2Supported"や "isAVXSupported"のようないくつかのクラスまたはファイルローカルブール値があります。起動時に、これらの値を初期化するためにいくつかの関数を呼び出します。ファクトリー・ロジックは、値をチェックして、使用するクラスを決定します。

SSE2は常にx64チップで使用できるため、実際にはifdefのすべてを避けたくありません。 x64ビルドのいくつかのクラスでのコンパイルを避けることができます。

関連する問題