Показать сообщение отдельно
  #10  
Старый 17.05.2015, 13:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
TThread не делит потоки на разные ядра. Увы. Автору читать про SetThreadAffinityMask.
Конечно, нет однозначного соответствия. Именно поэтому распараллеливание на 24 потока дало прирост не в 24 раза, а немного меньше. Более того, если запустить много нагружающих процессор приложений, то все потоки вероятнее всего будут выполняться по очереди на одном и том же ядре, т.к. другие будут заняты. Но это редкая ситуация.
А потоки на разные ядра распределяет не TThread и делфовый рантайм, а сама система. Конструктор TThread вызывает BeginThread, а тот есть обертка над WinAPI-шным CreateThread, поэтому делфовый поток есть обычный системный поток. Диспетчер при освобождении любого ядра проверяет, нет ли еще каких потоков в ожидании, и если есть, то запускает. Скорее всего, потоки будут циклически "кочевать" между ядрами, но тем не менее в любой момент времени будут заняты все доступные ресурсы процессора, минус только в том, что часть ресурсов будет постоянно заниматься переключением, но время этой операции по сравнению с квантом времени потока - ничто. Поэтому хоть формально и нет однозначного соответствия ядро->поток, это не сильно вредит производительности.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием