La plupart des fonctions de Numpy activent le multithreading par défaut.
par exemple, je travaille sur un poste de travail cpu Intel à 8 cœurs, si je lance un script
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
Linux top
affichera une utilisation de 800% du processeur pendant l'exécution,
ce qui signifie que numpy détecte automatiquement que mon poste de travail possède 8 cœurs et np.sqrt
utilise automatiquement les 8 cœurs pour accélérer le calcul.
Cependant, j'ai trouvé un bug bizarre. Si je lance un script
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
l'utilisation du processeur est de 100% !!. Cela signifie que si vous plus deux pandas DataFrame avant d'exécuter une fonction numpy, la fonction de multithreading automatique de numpy a disparu sans aucun avertissement! Ce n'est absolument pas raisonnable, pourquoi le calcul de Pandas dataFrame affecterait-il le paramètre de filetage Numpy? Est-ce un bug? Comment contourner cela?
PS:
Je creuse plus loin en utilisant l' perf
outil Linux .
exécution des premières émissions de script
Lors de l'exécution du deuxième script
Ainsi, les deux scripts impliquent libmkl_vml_avx2.so
, tandis que le premier script implique des éléments supplémentaires libiomp5.so
qui semblent être liés à openMP.
Et puisque vml signifie bibliothèque de mathématiques vectorielles Intel, donc selon le doc vml, je suppose qu'au moins les fonctions ci-dessous sont toutes automatiquement multithread
import numpy as np import pandas as pd import os os.environ["MKL_NUM_THREADS"] = '4' print(os.environ["MKL_NUM_THREADS"]) df=pd.DataFrame(np.random.random((10,10))) df+df print(os.environ["MKL_NUM_THREADS"]) a = np.random.random((20000000, 3)) b = np.random.random((3, 30)) for _ in range(10): c = np.dot(a, b)