2016-09-14 16 views
1

SIMD 명령어 세트를 사용하는 QT 위젯을 개발 중입니다. SSE3, AVX 및 AVX2 (simdpp는 단일 #define으로 전환 할 수 있습니다)의 3 가지 버전을 컴파일했습니다.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 

이 가이드에 대한 링크입니다. 어떤 아이디어?

먼저 염두에 두어야 할 것은 공유 된 라이브러리를 작성하고 프로젝트에 링크하는 것입니다. 여기 나는 다시 붙어있다. 응용 프로그램은 크로스 플랫폼입니다. 즉, Windows에서 nmake를 사용하도록 강제하는 GCC와 MSVC (정확하게는 vc120)로 컴파일해야한다는 것을 의미합니다. 실제로 시도했지만, 필자의 전체 프로그래머 생활에서 최악의 경험이었습니다. .

미리 감사드립니다. 세계의 프로그래머!

+1

, 예를 참조하십시오. 그 주위에 어떤 방법을 찾아야합니다 (여러 파일에 걸쳐 ifdef 코드를 분할하는 것 등) – peppe

답변

1

이들은 단지 프로젝트 정의입니다. .pro 파일에서 DEFINES + =로 설정합니다. 지원하려는 명령어 세트의 플래그를 설정하면 simdpp는 런타임시 프로세서에 가장 적합한 플래그를 선택합니다.

당신은 한 번 qmake를보다 더 같은 파일을 만들 수 없습니다 Add a define to qmake WITH a value?

+0

makefile에 표현 된 아이디어는 단일 .cpp 파일을 기반으로 여러 개의 객체 파일을 작성하여 모두 링크합니다 변경된 이름으로, 필요한 경우 올바른 이름으로 바꿉니다. 이것은 내가 어떻게 해야할지 모르겠다. 기호를 정의하는 것은 문제가 아닙니다. –

+0

지금 내가 무슨 뜻인지 알기 때문에 Qt로 쉽게 할 수있는 방법이 없다는 peppe의 말이 맞는 것 같습니다. 나는 당신이 만들고자하는 파일의 각 버전마다 다른 .pro 파일을 만들 수 있다고 생각한다. 다른 라이브러리 (TEMPLATE = lib)를 만든 다음 모든 라이브러리 버전을 응용 프로그램에 연결할 수 있습니다. 아마도 #define을 함수/클래스의 네임 스페이스를 변경해야 할 것입니다. 그렇지 않으면 작동하지 않을 동일한 함수가 여러 버전이됩니다. 어쩌면 이미 simdpp에서 끝난 것일까? –