2014-09-12 4 views
0

При запуске следующего кода на четырехъядерном процессоре я уверен, что эти четыре потока будут запущены на четырех разностных ядрах?C++ Многопоточность в многоядерной системе

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

Я полагаю, что нет способа закодировать приложение, которое заставляет потоки запускаться на разных ядрах?

int main() 
{ 
    std::vector<std::thread> threads(3); 

    for (size_t i = 0; i < 3; i++) 
    { 
     threads[i] = std::thread(DoSomethingLengthy); 
    } 

    DoSomethingLengthy(); 

    for (auto& thread : threads) 
    { 
     thread.join(); 
    } 
} 
+0

Здесь есть два вопроса ... – KiaMorot

+1

Сначала прочитайте о [аффинности процессора] (http://en.wikipedia.org/wiki/Processor_affinity). И чтобы ответить на ваш вопрос: если вы не «привязываете» поток к определенному ядру, это зависит от операционной системы, в которой ядро ​​запускает ваш поток. Операционная система может даже менять ядро ​​несколько раз за время, когда поток активен. –

+1

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

ответ

4

Do не Играйте с маской близости, если вы не знаете, что делаете.

В современной системе планирование представляет собой сложную логику, которая включает в себя терморегулирование, локальность кэш-памяти, расстояние NUMA и множество факторов. Система лучше понимает текущее состояние машины, чем вы (или иначе вы даже не имеете доступа к какой-либо информации), чтобы принять лучшее решение.

Для мгновенного планирования планировщик может решить разместить несколько потоков на одном и том же ядре (работает на частоте 4 ГГц), чтобы другое остыло (работало на частоте 500 МГц), и результат все же лучше, чем равномерно помещать потоки во все сердечники.

0

вы могли бы попробовать setting the affinity mask

ссылка только окно .. так что если вы работаете на другой ОС, которую вы могли бы проверить это comment слишком

0

Нити под управлением операционной системы. Второй ответ правильный. Для контроля этого существуют определенные API для ОС (обычно требуются более высокие привилегии), но ответ на C++ вы не гарантируете ...

+0

В типичной системе есть несколько ядер и сотни тысяч потоков. – Jakub

Смежные вопросы