Ответ 1
Если вы используете несколько потоков, операционная система автоматически позаботится об использовании нескольких ядер.
При запуске потока или процесса в .NET или Java существует ли способ выбрать, какой процессор или ядро запускается? Как работает модель общей памяти в таких случаях?
Если вы используете несколько потоков, операционная система автоматически позаботится об использовании нескольких ядер.
Есть ли способ выбрать, какой процессор или ядро запускается?
Вы можете использовать диспетчер задач, чтобы сообщить о том, на какой процессор должна быть запущена ваша программа. Обычно это полезно только для устранения устаревших программ, которые нарушили реализацию многопоточности. Для этого
Processes
.Set Affinity...
Если я правильно помню, окна будут "помнить" эти параметры для последующего запуска вашего процесса, но, пожалуйста, не цитируйте меня по этому поводу - выполните некоторые тесты самостоятельно: -)
Вы также можете сделать это программно в .NET после запуска вашей программы с использованием свойства System.Diagnostics.Process.ProcessorAffinity, но я не подумайте, что он "запомнит" настройки, поэтому всегда будет короткий период, в течение которого ваше приложение будет запускаться в зависимости от того, какие окна процессора подходят. Я не знаю, как это сделать в java извините.
Примечание:
Это относится ко всему процессу. Если вы устанавливаете близость только для CPU0, а затем запускаете 50 потоков, все 50 из этих потоков будут выполняться на CPU0, а CPU1, 2, 3 и т.д. Будут сидеть без дела.
Чтобы повторить это, это в первую очередь полезно для устранения неполадок с устаревшим программным обеспечением. Если ваше программное обеспечение не сломано, вы действительно не должны вмешиваться в какие-либо из этих параметров, и пусть окна решат лучший процессор для запуска вашей программы, поэтому он может учитывать остальную часть производительности системы.
Что касается модели с "общей памятью", она работает одинаково, но есть много вещей, которые могут выглядеть неправильно, когда ваше приложение работает на нескольких процессорах, а не только на один раз.
Для примера с открытием для глаз прочитайте эту статью о смехотворной планете о CPU и Memory Barriers.
Он нацелен на разработку OSX на PowerPC, но достаточно общий, что он должен применяться повсеместно. ИМХО, это одна из десяти лучших разработчиков, которые должны прочитать эти статьи, которые я прочитал.
Операционная система заботится о многопоточности, когда виртуальная машина использует собственные потоки (в отличие от зеленых потоков), и вы не можете указывать детали низкого уровня, например, выбирать процессор для определенного потока. Это лучше, потому что у вас, как правило, гораздо больше потоков, чем у вас есть процессоры, поэтому операционная система должна выполнять временную привязку, чтобы дать всем потокам возможность запускать.
При этом вы можете установить приоритеты потоков, если у вас есть критическая задача, и API-интерфейс потоков обычно предоставляет эту возможность. См. API Java, например: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)
PS: там что-то сломалось в синтаксическом движке... Мне пришлось добавить ссылку выше как обычный текст
Я использовал это в нескольких программах, потому что мое ядро 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".
Я бы посмотрел на параллельные расширения в .NET framework. Он по-прежнему находится в CTP, однако он должен наилучшим образом использовать многоядерные процессоры. Самое легкое место для начала работы .NET - это блог параллельных команд.
Что касается Java, я понятия не имею.