La maggior parte della funzione di Numpy abiliterà il multithreading per impostazione predefinita.
ad esempio, lavoro su una stazione di lavoro Intel a 8 core, se eseguo uno script
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
Linux top
mostrerà un utilizzo della CPU dell'800% durante l'esecuzione come il
che significa che numpy rileva automaticamente che la mia workstation ha 8 core e np.sqrt
usa automaticamente tutti e 8 i core per accelerare il calcolo.
Tuttavia, ho trovato un bug strano. Se eseguo uno 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'utilizzo della cpu è del 100% !!. Significa che se si aggiungono due Panda DataFrame prima di eseguire qualsiasi funzione numpy, la funzione di multithreading automatico di numpy scompare senza alcun preavviso! Questo non è assolutamente ragionevole, perché il calcolo di Pandas dataFrame influirebbe sull'impostazione del thread Numpy? E 'un errore? Come aggirare questo?
PS:
Scavo ulteriormente usando lo perf
strumento Linux .
eseguendo i primi spettacoli di script
Durante l'esecuzione del secondo script mostra
Quindi entrambi gli script coinvolgono libmkl_vml_avx2.so
, mentre il primo script prevede ulteriori libiomp5.so
che sembrano essere correlati a openMP.
E poiché vml significa libreria matematica vettoriale Intel, quindi secondo il documento vml immagino che almeno le funzioni seguenti siano tutte automaticamente 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)