Die meisten Funktionen des Numpy aktivieren standardmäßig Multithreading.
Ich arbeite beispielsweise auf einer Intel-CPU-Workstation mit 8 Kernen, wenn ich ein Skript ausführe
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
Das Linux top
zeigt 800% CPU-Auslastung während des Betriebs an,
was bedeutet, dass numpy automatisch erkennt, dass meine Workstation 8 Kerne hat, und np.sqrt
automatisch alle 8 Kerne verwendet, um die Berechnung zu beschleunigen.
Ich habe jedoch einen seltsamen Fehler gefunden. Wenn ich ein Skript ausführe
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)
Die CPU-Auslastung beträgt 100% !!. Dies bedeutet, dass die automatische Multithreading-Funktion von numpy ohne Vorwarnung wegfällt, wenn Sie vor dem Ausführen einer Numpy-Funktion zwei Pandas DataFrame plus verwenden! Dies ist absolut nicht sinnvoll. Warum wirkt sich die Berechnung von Pandas dataFrame auf die Numpy-Threading-Einstellung aus? Ist es ein Fehler? Wie kann man das umgehen?
PS:
Ich grabe weiter mit Linux- perf
Tool.
Das erste Skript wird angezeigt
Beim Ausführen zeigt das zweite Skript
Beide Skripte beinhalten also libmkl_vml_avx2.so
, während das erste Skript zusätzliche beinhaltet libiomp5.so
, die mit openMP in Zusammenhang zu stehen scheinen.
Und da vml Intel Vector Math Library bedeutet, werden laut vml doc zumindest die folgenden Funktionen automatisch alle multithreaded
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)