2016-09-14 6 views
1

SIMD命令セットを利用するQTウィジェットを開発しています。 SSE3、AVX、AVX2の3つのバージョンをコンパイルしました(simdppは#defineでそれらを切り替えることができます)。SIMD命令のディスパッチ+ SIMDPP + qmake

私が望むのは、サポートされている最適な命令セットに従って、ウィジェットがこれらの実装間で自動的に切り替わることです。 simdppが設けられており、ガイドは、いくつかのメイクの魔法を使用しています:http://p12tic.github.io/libsimdpp/v2.0~rc2/libsimdpp/arch/dispatch.html

私はどのようにqmakeはこのような動作を実装する見当がつかない:

ここ
CXXFLAGS="" 

test: main.o test_sse2.o test_sse3.o test_sse4_1.o test_null.o 
    g++ $^ -o test 

main.o: main.cc 
    g++ main.cc $(CXXFLAGS) -c -o main.o 

test_null.o: test.cc 
    g++ test.cc -c $(CXXFLAGS) -DSIMDPP_EMIT_DISPATCHER \ 
     -DSIMDPP_DISPATCH_ARCH1=SIMDPP_ARCH_X86_SSE2 \ 
     -DSIMDPP_DISPATCH_ARCH2=SIMDPP_ARCH_X86_SSE3 \ 
     -DSIMDPP_DISPATCH_ARCH3=SIMDPP_ARCH_X86_SSE4_1 -o test_null.o 

test_sse2.o: test.cc 
    g++ test.cc -c $(CXXFLAGS) -DSIMDPP_ARCH_X86_SSE2 -msse2 -o test_sse2.o 

test_sse3.o: test.cc 
    g++ test.cc -c $(CXXFLAGS) -DSIMDPP_ARCH_X86_SSE3 -msse3 -o test_sse3.o 

test_sse4_1.o: test.cc 
    g++ test.cc -c $(CXXFLAGS) -DSIMDPP_ARCH_X86_SSE4_1 -msse4.1 -o test_sse4_1.o 

は、ガイドへのリンクです。何か案は?

まず、ディスパッチされたコードで共有ライブラリを作成し、プロジェクトにリンクすることです。ここで私は再び立ち往生した。アプリケーションはクロスプラットフォームなので、GCCとMSVC(正確にはvc120)でコンパイルする必要があり、Windowsでnmakeを使用するように強制していましたが、実際に試しましたが、プログラマーとしての生活の中では最悪のものでした。

おかげさまで、世界のプログラマーに感謝します!

+1

を参照してください。 (ifdefコードを複数のファイルに分割するなど) – peppe

答えて

1

これは単なるプロジェクト定義です。 .proファイルにDEFINES + =を設定します。サポートする命令セットのフラグを設定し、実行時に最適なものをsimdppが選択します。

あなたが複数回qmakeを持つよりも、同じファイルを構築することはできません、例えばAdd a define to qmake WITH a value?

+0

makefileで表現されるアイデアは、単一の.cppファイルに基づいて複数のオブジェクトファイルを構築し、それらをすべてリンクすることに基づいています変更された名前で、必要に応じて適切な名前を使用します。これは私がどのように行うのか分からないものです。シンボルを定義することは問題ではありません。 –

+0

私はあなたが今何を意味しているのかを見ています。私はpeppeが正しいと思うのは、Qtを使って簡単にそうする方法がないということです。あなたが構築したいファイルのバージョンごとに異なる.proファイルを作成できると思います。別のライブラリ(TEMPLATE = lib)を作成しておき、すべてのライブラリバージョンをアプリケーションにリンクします。おそらく#defineを関数/クラスの名前空間を変更させる必要があります。そうしないと、機能しない同じ関数の複数のバージョンが存在します。多分それはすでにsimdppで行われているでしょうか? –