2016-09-14 3 views
1

Я разрабатываю виджет QT, который использует наборы инструкций SIMD. Я скомпилировал 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), что заставляет использовать nmake в Windows, и я старался, действительно, но это было похоже на худший опыт в моей жизни программиста ,

Заранее спасибо, программисты мира!

+1

Вы не можете создать один и тот же файл несколько раз с QMAKE. Вам нужно будет найти способ обойти это (разделить код ifdef'd на несколько файлов и т. Д.) – peppe

ответ

1

Это только проект определяет. Вы устанавливаете их с помощью DEFINES + = в ваш .pro-файл. Вы устанавливаете флажки для наборов инструкций, которые хотите поддерживать, и simdpp заботится о выборе лучшего для процессора во время выполнения.

Смотрите, например, Add a define to qmake WITH a value?

+0

Идея, выраженная в make-файле, основана на создании нескольких объектных файлов на основе одного .cpp-файла, связывая их все с измененными именами, а затем при необходимости использовать правильные. Это то, что я не знаю, как это сделать. Определение символа не является проблемой. –

+0

Я понимаю, что вы сейчас имеете в виду, и я думаю, что peppe прав, что с Qt нет такого способа сделать это легко. Я думаю, вы могли бы создать другой файл .pro для каждой версии файла, который вы хотите построить. Вы должны создавать разные библиотеки (TEMPLATE = lib), а затем связывать все версии библиотеки с вашим приложением. Вероятно, вам придется сделать #defines также изменить пространство имен функций/классов, иначе у вас будет несколько версий тех же функций, которые не будут работать. Может быть, это уже сделано в simdpp? –

Смежные вопросы