2017-01-13 4 views
5

У меня есть COM, написанный в Delphi 101 Berlin. И я пишу сценарий для вызова его API (только один API, однопоточный, и каждый занимает около 1 минуты, чтобы закончить).Как ОС может использовать все ядра для моего приложения?

Я запускаю файл vbs с помощью cscript.exe (64-разрядный) (и я использую simple job runner here), много копий (так много процессов), в то же время.

Тем не менее, я тестировал на многих ПК (Windows 10 Pro), и наблюдается, что работает только примерно 1 ядро, несмотря на то, что у многих из них много ядер.

Например, на моих двух ЦП (HPZ800 Intel Xeon X5650, 6 ядер каждый = 12 ядер) используется только 1 ядро.

Если некоторые сценарии выходят рано, то остальное использование ЦП будет улучшено, но все вместе суммируются не более чем на 1 ядро.

Мой вопрос, как написать код, чтобы извлечь выгоду из нескольких ядер?

enter image description here

+0

Вы говорите: «Я запускаю файл VBS с помощью cscript.exe ... много копий (так много процессов)». У вас есть доказательства того, что cscript.exe существует много процессов, которые разворачиваются/порождаются? Кажется довольно ясным, что ваш проект работает как однопоточный процесс. –

+0

, как вы можете видеть на снимке экрана, в моем приложении много копий cscript.exe (процессов), однопоточное. –

+0

Кроме того, только потому, что выполняется много процессов, это не означает, что вы будете максимизировать свои процессоры. Это зависит от характера процесса. Если каждый процесс просто выполняет сон() в течение 60 секунд, вы можете иметь тысячи из них, не беспокоя свой процессор вообще. –

ответ

0

Для того, чтобы использовать несколько ядер в то же время, несколько потоков требуется. Обратное неверно!

Чтобы действительно воспользоваться многоядерной системой, приложение должно разделить основную обработку на несколько потоков. Его алгоритмы должны быть распараллелены.

Источник: https://scalibq.wordpress.com/2012/06/01/multi-core-and-multi-threading/

Моего COM API является однопоточным. Поэтому несколько процессов не позволяют ОС использовать все ядра. Как поясняется в комментариях, если каждый процесс просто спит в течение 60 секунд, нет никакого способа повредить все ядра.

У меня есть еще один API с полностью многопоточным интерфейсом, и он может использовать все ядра даже с одним процессом.

Также упоминается, что если есть конкуренция I/O или несколько процессов, борющихся за одни и те же ресурсы, это повлияет на использование для ядер.

Обновление Я делаю несколько экспериментов, и выясняется, что однопоточный процесс может использовать не более одного ядра, однако запуск нескольких из них может использовать все ядра, которые действительно могут решить ОС. Подробные сведения см. В моих экспериментах. When Can Windows Utilize All the Cores?

+1

Я хотел бы добавить, что: у вас нет контроля над тем, что поток запускает какой процесс и когда .. Это ответственность операционной системы или более конкретный планировщик. Все, что вы можете сделать, это установить приоритеты процессов, поэтому планировщик дает ему больше места. –

+0

Я пробовал задавать высокий приоритет процессам, но, похоже, это мало помогает. –

Смежные вопросы