Ядра (или процессоры) - это физические элементы вашего компьютера, которые выполняют код. Обычно каждое ядро имеет все необходимые элементы для выполнения вычислений, регистрации файлов, линий прерываний и т. Д.
Большинство операционных систем представляют приложения как процессы . Это означает, что приложение имеет свое собственное адресное пространство (== представление памяти), где ОС гарантирует, что это представление и его содержимое изолированы от других приложений.
Процесс состоит из одного или нескольких потоков , которые выполняют реальную работу приложения, выполняя машинный код на процессоре. Операционная система определяет, какой поток исполняется на каком процессоре (используя умную эвристику для улучшения баланса нагрузки, энергопотребления и т. Д.). Если ваше приложение состоит только из одного потока, тогда вся ваша многопроцессорная система вам не сильно поможет, поскольку она все равно будет использовать только один процессор для вашего приложения. (Тем не менее, общая производительность может все еще улучшиться, поскольку ОС будет запускать другие приложения на других процессорах, чтобы они не смешивались с первым).
Теперь к вашим конкретным вопросам:
1) ОС обычно позволяет вам по крайней мере давать подсказки о том, на каком ядре вы хотите выполнить определенные потоки. Что OpenMP делает, так это генерирует код, который порождает определенное количество потоков, чтобы распределить общую вычислительную работу из циклов вашей программы в несколько потоков. Для этого он может использовать механизм подсказок ОС (см .: привязка потоков).
Тем не менее, приложения OpenMP по-прежнему будут работать одновременно с другими, и, таким образом, ОС может свободно прерывать один из потоков и планировать другую (потенциально не связанную) работу на ЦП.
В действительности существует множество различных схем планирования, которые вы, возможно, захотите применить, в зависимости от вашей ситуации, но это очень специфично, и большую часть времени вы должны быть в состоянии доверять своей ОС, делая то, что вам нужно.
2) Даже если вы запускаете однопоточное приложение на многоядерном процессоре, вы замечаете, что другие процессоры также работают. Это происходит из-за того, что ОС выполняет свою работу в то же время, и б) из-за того, что ваше приложение никогда не запускается в одиночку - каждая работающая система состоит из целого ряда одновременно выполняемых задач. Проверьте диспетчер задач Windows (или ps / top в Linux), чтобы проверить, что работает.