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)로 컴파일해야한다는 것을 의미합니다. 실제로 시도했지만, 필자의 전체 프로그래머 생활에서 최악의 경험이었습니다. .
미리 감사드립니다. 세계의 프로그래머!
, 예를 참조하십시오. 그 주위에 어떤 방법을 찾아야합니다 (여러 파일에 걸쳐 ifdef 코드를 분할하는 것 등) – peppe