Si le code de notre projet ne fait pas appel explicitement à numpy, il l’utilise indirectement au travers des packages pillow (PIL) et pygame. En accélérant l’exécution de numpy, on optimise nettement l’exécution de ces packages graphiques et donc la fluidité de notre jeu.
Pour accélérer numpy on fait appel à des implémentations des APIs d’algèbre linéaire BLAS et LAPACK. Deux solutions majeures s’offrent à nous :
- Intel MKL: librairies au code propriétaire mais dont l’usage est de type Freeware (Intel Simplified Software License).
- OpenBLAS: librairies open source (licence BSD).
Bien qu’Intel MKL soit très performant, pour rester dans l’approche open source, nous allons choisir la solution OpenBLAS.
Sous Linux, la solution est très simple à mettre en œuvre :
- Des binaires pré compilés d’OpenBLAS sont directement disponibles.
- La compilation de Numpy avec OpenBLAS fonctionne directement avec la configuration par défaut du build numpy.
Sous Windows, l’expérience est réputée plus délicate…
- Si des wheels numpy compilées avec OpenBLAS existent pour windows (voir https://anaconda.org/carlkl/numpy/files), celles-ci sont malheureusement anciennes (2016). La plus récente étant pour numpy 1.11 pour python 3.4. Dans ce projet nous allons utiliser numpy 1.19 pour python 3.7.5.
- Des binaires pré compilés d’OpenBLAS existent pour windows (voir : https://sourceforge.net/projects/openblas/files/). Cependant nous devons nous assurer d’utiliser les mêmes compilateurs pour les build d’OpenBLAS et de numpy (d’après : https://docs.scipy.org/doc/numpy/user/building.html). La seule approche garantissant ceci consiste à compiler nous-mêmes OpenBLAS et numpy, depuis leurs sources.
- Dernière contrainte sous windows, nous devrons produire une dll d’OpenBLAS. Plusieurs sources indiquent qu’il s’agit d’une nécessité :
- Pour numpy elle-même :
NOTE to self: I previously included the option NO_SHARED=1, but in recent versions, NumPy doesn’t like the static libs anymore[…] —http://lucasb.eyer.be/articles/sci-env.html.
- Pour le plugin numpy de Nuitka (outil de freeze que l’on envisage) qui recherche des librairies dynamiques/partagées (voir https://github.com/Nuitka/Nuitka/blob/jorj/nuitka/plugins/standard/NumpyPlugin.py).
- Pour numpy elle-même :
Le plus gros de nos efforts va effectivement être consacré au build d’OpenBLAS puis de numpy+OpenBLAS sous Windows. Si la solution proposée n’est pas la plus concise ni la plus élégante elle a le mérite de fonctionner.