Как приложение может использовать несколько ядер или процессоров в .NET или Java? - PullRequest
10 голосов
/ 01 сентября 2008

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

Ответы [ 5 ]

6 голосов
/ 01 сентября 2008

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

4 голосов
/ 01 сентября 2008

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

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

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

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

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

Примечание:

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

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


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

Для наглядного примера прочитайте эту нелепую статью о процессорах и барьерах памяти .

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

1 голос
/ 01 сентября 2008

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

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

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

0 голосов
/ 01 сентября 2008

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

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

0 голосов
/ 01 сентября 2008

Я использовал это в нескольких программах, потому что мое ядро ​​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 Property ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...