2016-09-14 11 views
1

サポートされている命令セットを示すクラスの例です。 https://msdn.microsoft.com/en-us/library/hskdteyh.aspxMSVC/arch:[命令セット] - SSE3、AVX、AVX2

それぞれ異なる命令セットを使用して、1つの関数の3つの異なる実装を記述したいと思います。しかし、フラグ/ ARCH:AVX2のために、このアプリケーションはIntelプロセッサの第4 +世代で実行されることはありません。そのため、チェックの全ポイントは無意味です。

だから質問は何ですか:正確にはこのフラグはありますか? のサポートを有効にするか、またはコンパイラの最適化を指定の命令セットで有効にしますか?

つまり、このフラグを完全に削除して、immintrin.h、emmintrin.hなどの関数を使い続けることはできますか?

+0

MSVCにSSE3オプションはありません。 64ビットモードでは、オプションは 'AVX'と' AVX2'です。 'AVX'の主なポイントは、MSVCにvexでエンコードされた命令を使用するように指示することです。私はAVX2のポイントを本当に知りません。私はそれが主にFMA3からの最適化のためだと思います。 –

答えて

1

オプション/ ARCH:AVX2を使用すると、CPUのYMMレジスタとAVX2命令を最適な方法で使用できます。しかし、CPUがこれらの命令をサポートしていない場合、プログラムがクラッシュします。 AVX2命令とコンパイラフラグ/ ARCH:SSE2を使用すると、パフォーマンスが低下します(約2倍)。

したがって、関数のすべての実装が対応するコンパイラオプション(/ ARCH:AVX2、/ ARCH:SSE2など)でコンパイルされるときの最適な実装です。それを行う最も簡単な方法 - あなたの実装(スカラー、SSE、AVX)を別々のファイルに置き、各ファイルを特定のコンパイラオプションでコンパイルします。

また、CPUの能力をチェックし、機能の対応する実装を呼び出すことができる別のファイルを作成するとよいでしょう。

CPU checkingcallingに実装されている機能の1つであるlibraryの例があります。

+0

それで、基本的に私の必要性は、独自の実装(および対応するARCHフラグ)を持つ3つのライブラリを作成し、プロセッサの機能をチェックして、それらを一度にリンクするということを正しく理解しましたか? –

+0

はい。 3つのライブラリを作成できます(それぞれに独自のコンパイラオプションがあります)。また、1つのライブラリ内のすべてのファイルに対して個別のコンパイラオプションを設定することもできます(Visual Studioではこれを行うことができます)。 – ErmIg

+0

ありがとう!アドバイスによると、少しリファクタリングされ、今それは動作します! –

関連する問題