2016-09-14 42 views
1

我正在开发一个使用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,而且我尝试过,但它就像我整个程序员生活中最差的体验。

在此先感谢,程序员的世界!

+1

您不能建立相同的文件更比一次的qmake。你需要找到一些解决方法(将ifdef的代码拆分为多个文件等) – peppe

回答

1

这些只是项目定义。你可以在你的.pro文件中用DEFINES + =来设置它们。你为你想要支持的指令集设置标志,simdpp负责在运行时为处理器选择最好的一个。

见例如,Add a define to qmake WITH a value?

+0

在makefile中表达的思想是基于基于单个.cpp文件构建多个对象文件,并将它们全部链接起来更改名称,然后在必要时使用正确的名称。这是我不知道如何做的。定义符号不是问题。 –

+0

我明白你的意思了,我认为佩普是正确的,没有一种方法可以轻松地与Qt做到这一点。我认为你可以为你想要构建的每个版本的文件创建一个不同的.pro文件。您将制作不同的库(TEMPLATE = lib),然后将所有库版本链接到您的应用程序。你可能不得不让#define也改变函数/类的名字空间,否则你会有多个版本的相同的函数,这是行不通的。也许这已经在simdpp中完成了? –