2016-09-14 2 views
1

Je développe un widget QT qui utilise des jeux d'instructions SIMD. J'ai compilé 3 versions: SSE3, AVX, et AVX2 (simdpp permet de basculer entre elles par un seul #define).Envoi d'instructions SIMD + SIMDPP + qmake

Maintenant, ce que je veux, c'est que mon widget permute automatiquement entre ces implémentations, selon le meilleur jeu d'instructions supporté. Guide qui est fourni avec simdpp utilise la magie 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 

Voici un lien vers le guide: http://p12tic.github.io/libsimdpp/v2.0~rc2/libsimdpp/arch/dispatch.html

Je ne sais pas comment mettre en œuvre un tel comportement avec qmake. Des idées?

D'abord, je pense à la création d'une bibliothèque partagée avec du code distribué et au lien avec le projet. Ici, je suis coincé à nouveau. App est multi-plateforme, ce qui signifie qu'elle doit compiler avec GCC et MSVC (vc120, pour être exact), ce qui oblige à utiliser nmake dans Windows, et j'ai essayé, vraiment, mais c'était comme la pire expérience de toute ma vie de programmeur .

Merci d'avance, les programmeurs du monde!

+1

Vous ne pouvez pas construire le même fichier plus d'une fois avec qmake. Vous aurez besoin de trouver un moyen de contourner cela (diviser le code ifdef'd entre plusieurs fichiers, etc.) – peppe

Répondre

1

Ce ne sont que des définitions de projet. Vous les définissez avec DEFINES + = dans votre fichier .pro. Vous définissez les indicateurs pour les jeux d'instructions que vous souhaitez prendre en charge et simdpp prend soin de sélectionner le meilleur pour le processeur lors de l'exécution.

Voir par exemple, Add a define to qmake WITH a value?

+0

L'idée exprimée dans makefile est basée sur la construction de plusieurs fichiers objets basés sur un seul fichier .cpp, les reliant tous avec des noms modifiés, puis en utilisant les bons si nécessaire. C'est ce que je ne sais pas comment faire. Définir un symbole n'est pas le problème. –

+0

Je vois ce que vous voulez dire maintenant et je pense que Pegase a raison de dire qu'il n'y a pas moyen de le faire facilement avec Qt. Je pense que vous pouvez créer un fichier .pro différent pour chaque version du fichier que vous souhaitez créer. Vous créez des bibliothèques différentes (TEMPLATE = lib) et reliez ensuite toutes les versions de la bibliothèque à votre application. Vous devriez probablement faire en sorte que les #defines changent aussi l'espace de noms des fonctions/classes, sinon vous auriez plusieurs versions des mêmes fonctions qui ne fonctionneraient pas. Peut-être que c'est déjà fait dans simdpp? –