Générer du code de vecteur de Haskell?
-
12-09-2019 - |
Question
Est-il possible d'obtenir GHC pour produire du code SIMD pour les différentes générations SSE?
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é pour 64 bits x 86) en utilisant les instructions SSE en mode scalaire (les deux backends C et EAM). Alors addsd plutôt que addpd. Pour les types de programmes que je travaille sur l'utilisation des instructions vectorielles est important pour la performance. Est-il un moyen facile pour un débutant comme moi pour obtenir GHC à SIMDize le code en utilisant SSE?
La solution
Oui, il est possible, via le back-end C, mais il est tâtonnement. 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.