Подтвердить что ты не робот

Как заставить мой код работать на нескольких ядрах?

Я создал приложение на С#, которое я хотел бы оптимизировать для нескольких ядер. У меня есть некоторые потоки, я должен делать больше?

Обновлено для более подробной информации

  • С# 2.0
  • Запуск в Windows Vista и Windows Server 2003

Обновлено снова

  • Этот код работает как служба
  • Я не хочу иметь полный код... моя цель здесь - получить свой опыт и начать. Как я уже сказал, я уже использую потоки. Что еще я могу сделать?
4b9b3361

Ответ 1

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

Я рекомендую начать со следующих шагов:

  • Разделите свои рабочие нагрузки на отдельные параллельные исполняемые модули.
  • Измерение и характеризация типов рабочей нагрузки - интенсивность сети, интенсивность ввода-вывода, интенсивность процессора и т.д. - они становятся основой для стратегий объединения ваших работников. например у вас могут быть довольно большие пулы работников для сетевых приложений, но нет смысла иметь больше рабочих, чем аппаратные потоки для задач с интенсивным процессором.
  • Подумайте о очередности/массиве или ThreadWorkerPool для управления пулами потоков. Прежнее более мелкое зерно контролируется, чем последнее.
  • Научитесь предпочитать шаблоны асинхронного ввода-вывода по шаблонам синхронизации, если можете - освобождает больше времени процессора для выполнения других задач.
  • Работа по устранению или по меньшей мере сокращению сериализации вокруг конкурирующих ресурсов, таких как диск.
  • Свести к минимуму ввод-вывод, получить и удерживать минимальный уровень блокировок на минимальный период. (Блокировка Reader/Writer - ваш друг)
    5. Скомбинируйте этот код, чтобы гарантировать, что ресурсы заблокированы в последовательной последовательности, чтобы свести к минимуму смертельные объятия.
  • Тест как сумасшедшие условия гонки и ошибки в многопоточных приложениях адские для устранения неполадок - часто вы видите только криминалистические последствия массового убийства.

Имейте в виду, что вполне возможно, что многопоточная версия может работать хуже, чем однопоточная версия того же приложения. Нет никакого оправдания хорошим техническим измерениям.

Ответ 2

Возможно, вы захотите взглянуть на параллельные расширения для .NET.

http://msdn.com/concurrency

Ответ 3

Возможно, вы захотите прочитать столбец Herb Sutter "Эффективный Concurrency". Здесь вы найдете статьи и другие.

Ответ 4

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

Ответ 5

Для С#, начните изучать LINQ-способ выполнения действий, затем используйте библиотеку Parallel LINQ и ее расширение .AsParallel().

Ответ 6

Понимая parallelism (или потенциал для parallelism) в проблемах, которые вы пытаетесь решить, ваше приложение и его алгоритмы гораздо важнее любых деталей синхронизации потоков, библиотек и т.д.

Начнем с чтения Шаблоны для параллельного программирования (в котором основное внимание уделяется "нахождению concurrency" и проблемам с более высоким уровнем дизайна), а затем перейдите к Искусство многопроцессорного программирования (практические подробности, начиная с теоретической основы).