Hầu hết các chức năng của Numpy sẽ cho phép đa luồng theo mặc định.
ví dụ, tôi làm việc trên máy trạm cpu 8 lõi intel, nếu tôi chạy tập lệnh
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
linux top
sẽ hiển thị mức sử dụng cpu 800% trong khi chạy như thế.
Điều đó có nghĩa là numpy tự động phát hiện ra rằng máy trạm của tôi có 8 lõi và np.sqrt
tự động sử dụng tất cả 8 lõi để tăng tốc tính toán.
Tuy nhiên, tôi tìm thấy một lỗi kỳ lạ. Nếu tôi chạy một kịch bản
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)
việc sử dụng cpu là 100% !! Điều đó có nghĩa là nếu bạn cộng với hai gấu trúc DataFrame trước khi chạy bất kỳ chức năng numpy nào, tính năng đa luồng tự động của numpy sẽ biến mất mà không có bất kỳ cảnh báo nào! Điều này là hoàn toàn không hợp lý, tại sao tính toán DataFrame của Pandas sẽ ảnh hưởng đến cài đặt luồng Numpy? Có phải là một lỗi? Làm thế nào để làm việc xung quanh này?
Tái bút
Tôi đào thêm bằng cách sử dụng perf
công cụ Linux .
chạy chương trình kịch bản đầu tiên
Trong khi chạy tập lệnh thứ hai cho thấy
Vì vậy, cả hai tập lệnh đều liên quan libmkl_vml_avx2.so
, trong khi tập lệnh đầu tiên liên quan đến phần bổ sung libiomp5.so
dường như có liên quan đến openMP.
Và vì vml có nghĩa là thư viện toán học intel vector, vì vậy theo vml doc, tôi đoán ít nhất các hàm bên dưới đều tự động đa luồng
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)