Większość funkcji Numpy domyślnie włącza wielowątkowość.
na przykład pracuję na 8-rdzeniowej stacji roboczej z procesorem Intel, jeśli uruchomię skrypt
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
Linux top
wyświetli 800% użycia procesora podczas pracy,
co oznacza, że numpy automatycznie wykrywa, że moja stacja robocza ma 8 rdzeni i np.sqrt
automatycznie używa wszystkich 8 rdzeni, aby przyspieszyć obliczenia.
Znalazłem jednak dziwny błąd. Jeśli uruchomię skrypt
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)
użycie procesora wynosi 100% !!. Oznacza to, że jeśli dodasz dwie pandy DataFrame przed uruchomieniem dowolnej funkcji numpy, funkcja automatycznego wielowątkowości numpy zniknie bez żadnego ostrzeżenia! To absolutnie nieuzasadnione, dlaczego obliczenia Pandas dataFrame wpłynęłyby na ustawienie wątków Numpy? Czy to błąd? Jak obejść ten problem?
PS:
Kopie dalej za pomocą perf
narzędzia Linux .
uruchamianie pierwszych pokazów skryptów
Podczas uruchamiania drugiego pokazuje skrypt
Zatem oba skrypty obejmują libmkl_vml_avx2.so
, podczas gdy pierwszy skrypt obejmuje dodatkowe, libiomp5.so
które wydają się być powiązane z openMP.
A ponieważ vml oznacza bibliotekę wektorów matematycznych Intel, więc zgodnie z vml doc myślę, że przynajmniej poniższe funkcje są automatycznie wielowątkowe
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)