我正在开发一个使用SIMD指令集的QT小部件。我编译了3个版本:SSE3,AVX和AVX2(simdpp允许通过一个#define在它们之间切换)。调度SIMD指令+ SIMDPP + qmake
现在,我想要的是我的小部件根据最佳支持的指令集自动在这些实现之间切换。其设置有simdpp指南使得一些神奇的makefile使用:
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
下面是指南的链接:http://p12tic.github.io/libsimdpp/v2.0~rc2/libsimdpp/arch/dispatch.html
我不知道如何实现与qmake的这种行为。有任何想法吗?
首先想到的是创建一个带有调度代码的共享库,并将其链接到项目。在这里我再次卡住了。应用程序是跨平台的,这意味着它必须使用GCC和MSVC(准确地说是vc120)进行编译,这在Windows中强制使用nmake,而且我尝试过,但它就像我整个程序员生活中最差的体验。
在此先感谢,程序员的世界!
您不能建立相同的文件更比一次的qmake。你需要找到一些解决方法(将ifdef的代码拆分为多个文件等) – peppe