2009-09-20 7 views
3

Est-il possible que GHC produise du code SIMD pour les différentes générations de SSE?Générer du code vectoriel à partir de Haskell?

Par exemple. a obtenu un programme comme celui-ci

import Data.Array.Vector 
main = print . sumU $ (enumFromToFracU 1 10000000 :: UArr Double) 

Je peux voir le code généré (compilé 64 bits x86) utilisent des instructions SSE en mode scalaire (les backends C et asm). Donc ajoute plutôt que addpd. Pour les types de programmes que je travaille sur l'utilisation d'instructions vectorielles est important pour la performance. Existe-t-il un moyen facile pour un débutant comme moi d'amener GHC à SIMDize le code en utilisant SSE?

Répondre

8

Oui, c'est possible, via le backend C, mais c'est une tentative et une erreur. Les drapeaux que j'utilise:

gcc -O2 -funbox-strict-fields -fvia-C -optc-O3 -march=native -optc-msse4 

Alors espérons que la boucle GCC voit serré GHC génère via le code uvector, et se rend compte qu'il est possible SIMD.

+0

Merci pour les conseils - ne peut pas tout à fait coopérer ghc & gcc sur certains appels uvector simples. Je continuerai à expérimenter maintenant que je sais que c'est. Il semble également, superficiellement au moins, que icc ne soit pas utilisable en tant que backend C - il barre sur ghc-6.10.4/lib/ghc-6.10.4/include/Regs.h depuis "error: type de variable" union "ne convient pas pour un registre". – billt

+0

Obtenir ICC travailler serait tout un exploit. –

Questions connexes