15

例を挙げて質問します。これで、という関数ができましたdo_something()

do_something()、、、の3つのバージョンがdo_something_sse3()ありdo_something_sse4()ます。プログラムを実行すると、CPU機能が検出され(SSE3またはSSE4をサポートしているかどうかを確認)、それに応じて3つのバージョンのいずれかが呼び出されます。

問題は次のとおりです。GCCを使用してプログラムをビルドする場合、コンパイルするように設定-msse4するdo_something_sse4()必要があります(たとえば、ヘッダーファイル<smmintrin.h>をインクルードするため)。

ただし、を設定する-msse4と、gccはSSE4命令の使用を許可され、の一部の組み込み関数do_something_sse3()も一部のSSE4命令に変換されます。したがって、私のプログラムがSSE3のみ(SSE4はサポートされていない)のCPUで実行されている場合、を呼び出すと「不正な命令」が発生しますdo_something_sse3()

多分私はいくつかの悪い習慣があります。いくつか提案をいただけますか?ありがとう。

4

4 に答える 4

11

Mystical のヒントは問題ないと思いますが、本当に1 つのファイルでそれを行いたい場合は、適切なプラグマを使用できます。たとえば、次のようになります。

#pragma GCC target("sse4.1")

AFAIR、GCC 4.4が必要です。

于 2013-03-23T09:16:20.453 に答える
2

「CPUディスパッチャ」と呼ばれるものを構築したいと思います。GCC で (私の知る限り) 動作するものがありますが、Visual Studio では動作しません。
AVX および SSE 用の Visual Studio の CPU ディスパッチャー

Agner Fog の vectorclass とファイル dispatch_example.cpp http://www.agner.org/optimize/#vectorclassを確認します。

g++ -O3 -msse2   -c dispatch_example.cpp -od2.o
g++ -O3 -msse4.1 -c dispatch_example.cpp -od5.o
g++ -O3 -mavx    -c dispatch_example.cpp -od8.o
g++ -O3 -msse2      instrset_detect.cpp d2.o d5.o d8.o
于 2013-03-25T08:38:40.637 に答える
0

以下は、最適化設定ごとに個別のオブジェクト ファイルをコンパイルする例です: http://notabs.org/lfsr/software/index.htm

しかし、gcc リンク時の最適化 (-flto) が使用されている場合、この方法でも失敗します。では、さまざまなプロセッサ向けに完全に最適化された単一の実行可能ファイルをビルドするにはどうすればよいでしょうか? 私が見つけた唯一の解決策は、インクルード ディレクティブを使用して C ファイルを単一のコンパイル ユニットとして動作させ、-flto が不要になるようにすることです。その方法を使用した例を次に示します: http://notabs.org/blcutil/index.htm

于 2013-03-25T05:04:37.813 に答える