3

SSE(2) 組み込み関数を使用した手動最適化の恩恵を受けるアルゴリズムがあります。さらに、このアルゴリズムは、将来的に 256 ビット AVX レジスターの恩恵を受けることもできます。

私の質問は、最善の方法は何ですか

  • コンパイル時にクラスの可用性バリアントを登録します。したがって、私のクラスがたとえば:でFooある場合、どのクラスがコンパイルされているかを実行時に決定する手段が必要です。FooSSE2FooAVX
  • 現在の CPU の機能を確認します。最低レベルでは、これはcpuid呼び出しになります。
  • 何がコンパイルされ、何がサポートされているかに基づいて、実行時に何を使用するかを決定します。

上記のほとんどをハッキングできますが、いくつかのベストプラクティスが出現したに違いないほど一般的な問題のようです. #ifdef理想的には、私は混乱を避けようとしています

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

1 に答える 1

1

「ファクトリ」クラスまたは関数を作成して、クラスの適切なインスタンスを作成し、ファクトリを実装するファイル内のすべてのロジックを非表示にします。

「isSSE2Supported」や「isAVXSupported」などのクラスまたはファイルのローカルブール値を用意します。起動時に、これらの値を初期化するためにいくつかの関数を呼び出します。次に、ファクトリロジックは値と照合して、使用するクラスを決定できます。

SSE2は常にx64チップで利用できるため、すべてのifdefを避けたくはありません。x64ビルドの一部のクラスでのコンパイルを回避できます。

于 2011-11-07T02:30:50.113 に答える