E=m*c^2
|
|
1 | |
Многопоточность01.03.2020, 13:13. Показов 4218. Ответов 5
Метки нет (Все метки)
Возможно ли указать системе что потоки должны запускаться на разных физических ядрах? я предполагаю запуск идентичных потоков и как понимаю запуск их на одном ядре не имеет смысла. хотелось бы полностью физически реальной многопоточности. к примеру один главный поток и четыре вычислителя. при этом желательно на разных процессорах.
ответ интересен в общем виде. примеры решения пока не требуются, достаточно общего ответа.
0
|
01.03.2020, 13:13 | |
Ответы с готовыми решениями:
5
Многопоточность в asm Многопоточность Многопоточность Многопоточность |
4164 / 1816 / 216
Регистрация: 06.10.2010
Сообщений: 4,070
|
|
02.03.2020, 06:57 | 2 |
Вроде бы KeSetSystemAffinityThreadEx привязывает поток к определённому ядру. Но на скорость выполнения это не сильно повлияет - система всегда пытается равномерно распределить нагрузку по ядрам. Исключением являются например процессоры с HyperThreading, где одно ядро в системе представлено как 2 виртуальных, но система об этом не знает и распределяет нагрузку по виртуальным ядрам вместо физических. Аналогичная проблема была у процессоров AMD FX - там на 2 физических ядра один общий блок для вещественной арифметики, даже патч для windows делали.
0
|
E=m*c^2
|
|
02.03.2020, 08:59 [ТС] | 3 |
именно эта опасность меня и беспокоит. я опасаюсь что четыре одинаковых потока займут два физических ядра и будут в итоге работать как два. или даже хуже из за расходов на сохранение контекста переключение между ними.
0
|
4164 / 1816 / 216
Регистрация: 06.10.2010
Сообщений: 4,070
|
|
02.03.2020, 09:31 | 4 |
Насколько я понимаю по-умолчанию потоки не привязываются к ядрам а выполняются на том ядре, которое свободно в данный момент. А если учесть, что потоков в современной ОС сотни (если не тысячи), то поток постоянно будет выполняться на разных ядрах.
Добавлено через 5 минут отсюда
0
|
1486 / 1413 / 240
Регистрация: 19.02.2010
Сообщений: 3,914
|
|
02.03.2020, 11:53 | 5 |
Не обязательно лезть к функциям ядра Винды - SetThreadAffinityMask() тоже работает. И так же не разделяет физические и логические ядра процессора.
0
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
02.03.2020, 21:10 | 6 |
Сообщение было отмечено K_ILYA_V как решение
Решение
У вас может быть несколько физических процессоров (P - physical processors), несколько ядер (C - cores), несколько гиперпотоков (H - hyper-threads), кол-во логических процессоров будет = P*C*H = T, которое система вам и покажет (через GetLogicalProcessorInformation или кол-вом бит GetProcessAffinityMask). Можно смело создавать T потоков, и все они будут управляться процессорами без какого-либо переключений контекста между ними от ОС. Для надёжности можно, как уже сказали, выставить SetThreadAffinityMask (желательно предварительно получив маску процесса: GetProcessAffinityMask, либо кол-во логических процессоров: GetLogicalProcessorInformation и скорректировать маску процесса SetProcessAffinityMask, но обычно по умолчанию она установлена на все лог.процессоры). Но обычно всего этого не требуется, система сама делает всё как надо.
Если нужна максимальная скорость, выставляйте своему процессу максимальный приоритет (SetPriorityClass), каждому потому максимальный приоритет (SetThreadPriority), только учтите, что система будет слабо реагировать на действия пользователя и сильно тормозить в работе остальных процессов.
1
|
02.03.2020, 21:10 | |
02.03.2020, 21:10 | |
Помогаю со студенческими работами здесь
6
Многопоточность Многопоточность многопоточность Многопоточность Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |