Sebagian besar fungsi Numpy akan mengaktifkan multithreading secara default.
misalnya, saya bekerja pada workstation intel cpu 8-core, jika saya menjalankan skrip
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
linux top
akan menunjukkan 800% penggunaan CPU selama menjalankan seperti
Yang berarti numpy secara otomatis mendeteksi bahwa workstation saya memiliki 8 core, dan np.sqrt
secara otomatis menggunakan semua 8 core untuk mempercepat perhitungan.
Namun, saya menemukan bug aneh. Jika saya menjalankan skrip
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)
penggunaan cpu adalah 100% !!. Ini berarti bahwa jika Anda ditambah dua panda DataFrame sebelum menjalankan fungsi numpy, fitur multithreading otomatis numpy hilang tanpa peringatan! Ini sama sekali tidak masuk akal, mengapa perhitungan dataFrame Pandas memengaruhi pengaturan threading Numpy? Apakah ini bug? Bagaimana cara mengatasinya?
PS:
Saya menggali lebih jauh menggunakan perf
alat Linux .
menjalankan tampilan skrip pertama
Saat menjalankan skrip kedua menunjukkan
Jadi kedua skrip melibatkan libmkl_vml_avx2.so
, sedangkan skrip pertama melibatkan tambahan libiomp5.so
yang tampaknya terkait dengan openMP.
Dan karena vml berarti perpustakaan vektor vektor intel, jadi menurut vml doc saya kira setidaknya fungsi di bawah ini semuanya otomatis 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)