2017-01-13 13 views
5

Tôi có một COM được viết bằng Delphi 101 Berlin. Và tôi viết một kịch bản để gọi API của nó (chỉ một API, một luồng và mỗi lần mất khoảng 1 phút để hoàn thành).Làm cách nào để hệ điều hành có thể sử dụng tất cả các lõi cho ứng dụng của tôi?

Tôi chạy tệp vbs bằng cscript.exe (64 bit) (và tôi sử dụng simple job runner here), nhiều bản sao (vì vậy có nhiều quy trình), cùng một lúc.

Tuy nhiên, tôi đã thử nghiệm trên nhiều PC (Windows 10 Pro), và nó được quan sát thấy rằng chỉ có khoảng 1 lõi đang chạy mặc dù nó có nhiều lõi.

Ví dụ, trên 2 CPU của tôi (HPZ800 Intel Xeon X5650, 6 lõi mỗi = 12 lõi), chỉ có 1 lõi đang được sử dụng.

Nếu một số tập lệnh thoát sớm, thì việc sử dụng CPU còn lại sẽ được cải thiện, nhưng tất cả cùng nhau tổng không quá 1 lõi.

Câu hỏi của tôi, là cách viết mã để hưởng lợi từ nhiều lõi?

enter image description here

+0

Bạn nói "Tôi chạy tệp VBS bằng cscript.exe ... nhiều bản sao (vì vậy có nhiều quy trình)". Bạn có bất kỳ bằng chứng nào cho thấy có nhiều quá trình được chia nhỏ/sinh ra bởi cscript.exe không? Có vẻ khá rõ ràng với tôi rằng dự án của bạn đang chạy như một quá trình đơn luồng. –

+0

như bạn có thể thấy trong ảnh chụp màn hình, có rất nhiều bản sao của cscript.exe (quy trình), trên ứng dụng của tôi, nó là đơn luồng. –

+0

Ngoài ra, chỉ vì có nhiều quy trình đang chạy, điều này không có nghĩa là bạn sẽ tối đa hóa CPU của mình. Nó phụ thuộc vào bản chất của quá trình. Nếu mỗi quá trình chỉ làm một giấc ngủ() trong 60 giây, bạn có thể có hàng ngàn người trong số họ mà không làm phiền CPU của bạn cả. –

Trả lời

0

Để sử dụng nhiều lõi cùng một lúc, nhiều luồng là yêu cầu. Nghịch đảo không đúng!

Để thực sự tận dụng lợi thế của hệ thống đa lõi, ứng dụng cũng cần chia quá trình xử lý chính thành nhiều chuỗi. Các thuật toán của nó cần phải được song song.

Nguồn: https://scalibq.wordpress.com/2012/06/01/multi-core-and-multi-threading/

COM API của tôi là đơn luồng. Do đó, nhiều quy trình không cho phép hệ điều hành sử dụng tất cả các lõi. Như đã giải thích trong các ý kiến, nếu mỗi quá trình chỉ ngủ trong 60 giây, không có cách nào để làm phiền tất cả các lõi.

Tôi cũng có một API khác với đa luồng hoàn toàn và có thể sử dụng tất cả các lõi ngay cả với 1 quy trình.

Ngoài ra, nó được đề cập rằng nếu có I/O cuộc thi hoặc nhiều quy trình chiến đấu cho cùng một nguồn lực, việc sử dụng cho lõi sẽ bị ảnh hưởng.

Cập nhật Tôi thực hiện một số thử nghiệm và chỉ ra rằng một quy trình đơn luồng có thể sử dụng nhiều nhất, tuy nhiên việc khởi chạy nhiều lõi có thể sử dụng tất cả các lõi thực sự quyết định. Vui lòng xem các thử nghiệm của tôi chi tiết When Can Windows Utilize All the Cores?

+1

Tôi muốn thêm rằng: bạn không có quyền kiểm soát chuỗi nào chạy trên quy trình nào và khi nào .. Đây là trách nhiệm của hệ điều hành hoặc cụ thể hơn cho trình lập lịch biểu. Tất cả những gì bạn có thể làm là bạn đặt mức độ ưu tiên cho các quy trình, vì vậy công cụ lên lịch cho phép nhiều không gian hơn. –

+0

Tôi đã thử đặt mức ưu tiên cao cho các quy trình, nhưng có vẻ như nó không giúp ích gì nhiều. –

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