Цитата:
TThread не делит потоки на разные ядра. Увы. Автору читать про SetThreadAffinityMask.
|
Конечно, нет однозначного соответствия. Именно поэтому распараллеливание на 24 потока дало прирост не в 24 раза, а немного меньше. Более того, если запустить много нагружающих процессор приложений, то все потоки вероятнее всего будут выполняться по очереди на одном и том же ядре, т.к. другие будут заняты. Но это редкая ситуация.
А потоки на разные ядра распределяет не TThread и делфовый рантайм, а сама система. Конструктор TThread вызывает BeginThread, а тот есть обертка над WinAPI-шным CreateThread, поэтому делфовый поток есть обычный системный поток. Диспетчер при освобождении любого ядра проверяет, нет ли еще каких потоков в ожидании, и если есть, то запускает. Скорее всего, потоки будут циклически "кочевать" между ядрами, но тем не менее в любой момент времени будут заняты все доступные ресурсы процессора, минус только в том, что часть ресурсов будет постоянно заниматься переключением, но время этой операции по сравнению с квантом времени потока - ничто. Поэтому хоть формально и нет однозначного соответствия ядро->поток, это не сильно вредит производительности.