Условный параллелизм (смешение параллелизма с последовательностью) - PullRequest
1 голос
/ 26 марта 2011

Привет Переливы,

Я работаю с C # .Net 4. Я хочу отдать приоритет определенным частям моего кода для использования параллелизма, в то время как другие части также могут делать то же самое, только если есть место (свободные ядра), в противном случае они должны переключаться на последовательное выполнение (в потоке invoker), а не просто временно блокированы.
Как я могу это сделать ? Любое хорошее недавнее чтение по этому конкретному вопросу?
Выполняет ли Parallel.Invoke (...) материал последовательно в задаче / потоке invoker, если ядра недоступны?

Привет

Ответы [ 5 ]

1 голос
/ 26 марта 2011

Нет такой вещи как «свободная нить».Там только неиспользованное ядро.Вы можете просто посчитать их с помощью Environment.ProcessorCount и основывать свою стратегию потоков на этом.Неэффективное использование ThreadPool обычно является ошибкой, оно хорошо справляется с распределением потоков по ядрам.Но он не может дать вам то, о чем вы просите, ThreadPool.GetAvailableThreads - это постоянно меняющееся число.Должно быть в любом случае.

0 голосов
/ 27 марта 2011

Ваша проблема в расстановке приоритетов.Вы говорите, что у вас есть два типа задач: важные задачи (которые должны выполняться) и задачи досуга (которые могут выполняться только при наличии свободного ЦП и без важных задач в очереди).

Простое решениеназначить очень высокий приоритет для важных задач и очень низкий приоритет для досуга.Таким образом, вы почти гарантируете, что большая часть ресурсов ЦП вашей системы направляется на выполнение важных задач.Тем не менее, не гарантирует, что ваши задачи досуга всегда запускаются после всех важных задач.Система может по-прежнему планировать некоторые задачи для досуга на некоторое время.

Однако параллельная библиотека задач не позволяет планировать задачи с разными приоритетами.Вы можете использовать что-то вроде этого или переопределить планировщик TPL с помощью пользовательской реализации BlockingCollection, которая всегда сначала удаляет важные задачи.

Одним из решений является планирование важных задач с помощью TPL,но вручную планируйте задачи досуга в своем собственном фоновом потоке (с наименьшим приоритетом потока) - и этот поток последовательно запускает задачи досуга.

0 голосов
/ 26 марта 2011

Свободные потоки - это концепция, которая существует только в пуле потоков .Net. Возможно, вы имели в виду свободные ресурсы процессора!?

Если вы объявляете свои собственные потоки с новым потоком (), вы не связаны этим.

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

Вы можете проверить использование процессора следующим образом:

PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
double cpuUsage = Convert.ToDouble(cpuCounter.NextValue());

А затем в вашем коде используйте переменную для:

int threadId;
if (cpuUsage > threshold) {
    DoWork();
}
else {
    threadId = YourThreadManager.Queue(DoWork);
}
0 голосов
/ 26 марта 2011

По моему опыту работы с F #, можно контролировать / настраивать использование параллелизма за пределами вашего основного кода приложения. Я ожидаю, что C # Async CTP предложит аналогичную функциональность.

0 голосов
/ 26 марта 2011

У меня сложилось впечатление, что параллельная структура раздает потоки в зависимости от физической доступности. http://msdn.microsoft.com/en-gb/concurrency/default.aspx

Возможно, я думаю о параллельных расширениях (http://blogs.msdn.com/b/pfxteam/), или они могут быть одним и тем же, или я говорю чепуху: -)

...