2011-01-26 29 views
17

Tôi có bộ xử lý lõi tứ với hyper-threading. Khi tôi sử dụng make -j8, nó nhanh hơn make -j4 (Tôi đã đọc số lõi trong Java và sau đó được gọi là make -j<number of cores>).Tại sao make -j hoạt động tốt hơn khi nó được truyền một số lớn hơn số lõi có sẵn?

Tôi không hiểu tại sao make -j32 nhanh hơn make -j8 khi tôi có (đọc bằng Java) chỉ 8 lõi (siêu phân luồng tăng gấp đôi số lõi vật lý). Làm thế nào là có thể?

Trả lời

19

Có nhiều tính toán hơn tốc độ CPU và số lõi có sẵn: băng thông đĩa và băng thông bộ nhớ rất quan trọng.

Trong trường hợp của bạn, tôi tưởng tượng rằng mỗi CPU HT anh chị em nhận được khoảng 4 quy trình để thực thi. Khi nó bắt đầu một, nó chặn trên đĩa IO và chuyển sang quá trình tiếp theo. Người thứ hai cố gắng mở một tập tin thứ hai, chặn trên đĩa IO, và anh chị em chuyển sang tiến trình tiếp theo. Bắt đầu từ bốn trình biên dịch trước khi đĩa IO đầu tiên sẵn sàng sẽ không làm tôi ngạc nhiên.

Vì vậy, khi người đầu tiên cuối cùng đọc trong nguồn chương trình, trình biên dịch phải bắt đầu tìm kiếm thông qua các thư mục để tìm các tệp #included. Mỗi một yêu cầu một số cuộc gọi mở() được theo sau bởi các cuộc gọi read(), tất cả đều có thể chặn, và tất cả đều sẽ từ bỏ anh chị em cho các tiến trình khác để chạy.

Bây giờ nhân với tám anh chị em - mỗi lõi HT sẽ chạy cho đến khi nó chặn truy cập bộ nhớ, tại thời điểm đó nó sẽ chuyển sang người anh em khác, và chạy một lúc. Khi bộ nhớ của anh chị em đầu tiên đã được tìm nạp vào bộ nhớ cache, có lẽ là thời gian để anh chị em thứ hai đứng yên trong khi đợi bộ nhớ.

Có giới hạn trên về số lần biên dịch của bạn chạy nhanh hơn bằng cách sử dụng make -j, nhưng hai lần-số-cpus đã là điểm khởi đầu tốt cho tôi trong quá khứ.

1

Bắt đầu nhiều quy trình hơn vẫn có thể mang lại lợi ích cho bạn. Ví dụ, một quá trình có thể sử dụng CPU trong khi một quá trình khác trên cùng một CPU đang đợi tập tin

Các vấn đề liên quan