Numpy işlevinin çoğu varsayılan olarak çoklu okuma özelliğini etkinleştirir.
örneğin, bir komut dosyası çalıştırırsam, 8 çekirdekli bir intel cpu iş istasyonunda çalışıyorum
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
linux top
gibi çalışan sırasında% 800 CPU kullanımını gösterecektir
benim iş istasyonu 8 çekirdeğe sahip olduğunu otomatik olarak algılar hangi araçlar numpy ve np.sqrt
hesaplama hızlandırmak için 8 çekirdek kullanmaya otomatik.
Ancak, garip bir hata buldum. Senaryo çalıştırırsam
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)
cpu kullanımı% 100 !!. Herhangi bir numpy işlevini çalıştırmadan önce iki panda DataFrame eklerseniz, numpy'nin otomatik çoklu okuma özelliği herhangi bir uyarı yapılmadan gitti demektir! Bu kesinlikle mantıklı değil, Panda'nın dataFrame hesaplaması neden Numpy diş açma ayarını etkiler? Bu bir hata mı? Bu sorunu nasıl çözebilirim?
Not:
Linux perf
aracını kullanarak daha fazla kazıyorum .
ilk senaryo gösterilerini çalıştırma
İkinci senaryo şovlarını çalıştırırken
Bu yüzden her iki komut dosyası da dahil libmkl_vml_avx2.so
edilirken, ilk komut dosyası libiomp5.so
openMP ile ilişkili gibi görünen ek içerir .
Ve vml intel vektör matematik kütüphanesi anlamına geldiğinden, vml doc'a göre en azından aşağıdaki fonksiyonların hepsi otomatik olarak çok iş parçacıklı
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)