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を使用するように強制していましたが、実際に試しましたが、プログラマーとしての生活の中では最悪のものでした。
おかげさまで、世界のプログラマーに感謝します!
を参照してください。 (ifdefコードを複数のファイルに分割するなど) – peppe