Как parallelism в одном потоке/ядре возможно?

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

Тем не менее, большинство этих платформ также поддерживают параллельные процессы в одном потоке.

  • Выполняются ли эти процессы параллельно?
  • Как на уровне сборки могут выполняться две разные процедуры одновременно в одном потоке?

Ответы

Ответ 1

транслятор;: parallelism (в смысле истинного одновременного выполнения) на одном, не гиперпоточном ядре ЦП, НЕ возможно.


Аппаратное обеспечение (< - EDIT) Параллеллизм может быть достигнут на нескольких уровнях. Упорядочено путем уменьшения детализации:

  • multi-host
  • многопроцессорный
  • многоядерные
  • многопоточность ( "Hyper-Threading", т.е. "HT" ) (EDIT: я voluntarity опускают случай векторизованных вычислений, когда несколько ALU могут управляться одним и тем же ядром)

Ваш вопрос связан с запуском двух программных потоков в случаях 3. (в случае, если HT недоступен/отключен) или 4.

  • В обоих случаях процессы фактически НЕ запускаются параллельно. Пользователь имеет впечатление одновременности из-за чрезвычайно быстрых переключателей контекста, выполняемых на уровне ЦП, которые, как правило, выделяют, последовательно физическое ядро ​​(соответственно поток), на один или другой программный поток

  • В обоих случаях эти процедуры просто не выполняются одновременно, а последовательно

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

НТН.

Чтобы выполнить тесты, чтобы лучше понять эту тему, вы можете захотеть "cpu affinity" в Google. Это позволит вам запустить двухпоточный процесс на одном физическом ядре многоядерного процессора и время, затрачиваемое каждым из потоков, изменяя их приоритет и т.д.

Ответ 2

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

Он называется уровень на уровне parallelism. Детали довольно сложны и различаются между различными микро-архитектурами процессора.

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

Для получения дополнительной информации см. следующие ссылки:

http://en.wikipedia.org/wiki/Superscalar

http://en.wikipedia.org/wiki/Instruction_pipelining

http://en.wikipedia.org/wiki/Out-of-order_execution