Как приложение может использовать несколько ядер или процессоров в .NET или Java?

При запуске потока или процесса в .NET или Java существует ли способ выбрать, какой процессор или ядро ​​запускается? Как работает модель общей памяти в таких случаях?

Ответ 1

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

Ответ 2

Есть ли способ выбрать, какой процессор или ядро ​​запускается?

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

  • Запустить диспетчер задач
  • Найдите ваш процесс в окне Processes.
  • Щелкните правой кнопкой мыши и выберите Set Affinity...
  • Установите флажки рядом с процессором, который вы хотите разрешить запуску своего приложения. Затем Windows будет только планировать потоки из этого процесса на эти конкретные процессоры

Если я правильно помню, окна будут "помнить" эти параметры для последующего запуска вашего процесса, но, пожалуйста, не цитируйте меня по этому поводу - выполните некоторые тесты самостоятельно: -)

Вы также можете сделать это программно в .NET после запуска вашей программы с использованием свойства System.Diagnostics.Process.ProcessorAffinity, но я не подумайте, что он "запомнит" настройки, поэтому всегда будет короткий период, в течение которого ваше приложение будет запускаться в зависимости от того, какие окна процессора подходят. Я не знаю, как это сделать в java извините.

Примечание:

Это относится ко всему процессу. Если вы устанавливаете близость только для CPU0, а затем запускаете 50 потоков, все 50 из этих потоков будут выполняться на CPU0, а CPU1, 2, 3 и т.д. Будут сидеть без дела.

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


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

Для примера с открытием для глаз прочитайте эту статью о смехотворной планете о CPU и Memory Barriers.

Он нацелен на разработку OSX на PowerPC, но достаточно общий, что он должен применяться повсеместно. ИМХО, это одна из десяти лучших разработчиков, которые должны прочитать эти статьи, которые я прочитал.

Ответ 3

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

При этом вы можете установить приоритеты потоков, если у вас есть критическая задача, и API-интерфейс потоков обычно предоставляет эту возможность. См. API Java, например: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

PS: там что-то сломалось в синтаксическом движке... Мне пришлось добавить ссылку выше как обычный текст

Ответ 4

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

// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();

// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);

или

// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);

Подробнее об этом в разделе Свойство Process.ProcessorAffinity".

Ответ 5

Я бы посмотрел на параллельные расширения в .NET framework. Он по-прежнему находится в CTP, однако он должен наилучшим образом использовать многоядерные процессоры. Самое легкое место для начала работы .NET - это блог параллельных команд.

Что касается Java, я понятия не имею.