2013-12-10 8 views
1

Прежде всего, я не изучал информатику, и я преподавал программирование себя, сказал это;Использование процессора (полное использование)

У меня есть программа на C#, которая управляет сильным силовым движением потока для очень больших профилей спроса. Я использую ноутбук с процессором Intel i7 (4 ядра -> 8 потоков) под окнами 7. Когда я запускаю симуляции, процессор ussage составляет около 32%.

Я читал другие темы о процессе prority, и у меня есть более или менее ясно, что когда что-то работает на ОС, она работает на полной скорости, но операционная система поддерживает интерфейсы реагирующие (это правильно?)

Ну, я хочу «полностью заливать процессор» симуляцией; получить 100% использования (если возможно)?

Заранее спасибо.

Ref # 1: Is there a way of restricting an API's processor resource in c#?

Ref # 2: Multiple Processors and PerformanceCounter C#

EDIT: кусок кода, который вызывает моделирования после удаления нон соответствующего материала

while (current_step < sim_times.Count) { 

    bool repeat_all = false; 
    power_flow(sim_times[current_step]); 

    current_step++; 
} 

Я знаю, что это супер просто , и это время, потому что в исходном коде я могу повторить определенное количество шагов.

Функция power_flow() вызывает стороннее программное обеспечение, поэтому, я думаю, это стороннее программное обеспечение, которое должно выполнять многопоточность, не так ли?

+0

ли создать приложение несколько потоков? или все на одном потоке? Обычно поток ограничивается использованием только одного процессора, поэтому вам нужно разделить свою работу на несколько потоков. – PCG

+0

Я использую многопоточность (ThreadPool.QueueUserWorkItem (_ => {/ * Things * /});) Но я также называю стороннее программное обеспечение COM, использующее 8 системных потоков (я вижу это на системном мониторе) –

+0

Обновленный мой ответ, надеюсь, он указывает вам в правильном направлении. Проблема в том, что нарезание резьбы так много, чтобы учиться. Дайте мне знать, если что-то неясно. –

ответ

3

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

Если вы используете стороннюю часть программного обеспечения для обработки данных, это часто затрудняет разделение на несколько потоков. Одной тактикой, которая часто бывает полезной, является разделение ваших входных данных, а затем запуск нового потока для каждого набора данных. Для этого требуется знание домена, чтобы знать, что вы можете разделить. Для симуляций, как только вы разделите один прогон как можно больше, альтернативой является параллельное выполнение нескольких прогонов.

Task Parallel Library может быть очень полезно разбивать ваш код на несколько потоков без большого количества рефакторинга. В частности, раздел data parallelism.

Замечание: вам нужно убедиться, что вы делаете thread-safe. Я расскажу вам кое-что. Основной принцип заключается в том, что вам нужно убедиться, что вы делитесь данными между потоками, тогда вам нужно быть очень осторожными, они не влияют друг на друга - это может вызвать странные проблемы!

Что касается вашего вопроса относительно интерфейсов - в рамках вашего процесса вы можете выделить приоритет потока для каждого потока. Поток интерфейса - это просто поток, как любой другой. Обычно потоку пользовательского интерфейса присваивается наивысший приоритет, чтобы оставаться отзывчивым, тогда как длинному фоновому процессу присваивается нормальный/ниже нормальный приоритет, так как он может обрабатываться во время простоя. Вы можете установить приоритет manually, по умолчанию для любого нового потока будет Normal.

0

Вы должны обработать эти симуляции параллельно, чтобы использовать как можно больше ЦП.Сделайте это, создав Task для каждого прогона моделирования.

using System.Threading.Tasks; 

... 

List<Task> tasks = new List<Task>(); 

for(;current_step < sim_times.Count; current_step++) 
{ 
    var simTime = sim_times[current_step]; //extract the sim parameter 
    Task.Factory.StartNew(() => power_flow(simTime)); //create a 'hot' task - one that is immediately scheduled for execution 
} 

Task.WaitAll(tasks.ToArray()); //wait for the simulations to finish so that you can process results. 

Data Parallelism (Task Parallel Library)

+0

Хороший совет, но стороннее программное обеспечение не позволяет этого: в digApiWrapper.dll произошла первая случайная ошибка типа «System.AccessViolationException» Дополнительная информация: Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена. Если есть обработчик для этого исключения, программа может быть безопасно продолжена. –

+0

@ пользователь3020849 это разумно. мой ответ лишний, если ваш сторонний код запускает собственные потоки. – Gusdor

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