Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
E=m*c^2
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
1

Многопоточность

01.03.2020, 13:13. Показов 4218. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возможно ли указать системе что потоки должны запускаться на разных физических ядрах? я предполагаю запуск идентичных потоков и как понимаю запуск их на одном ядре не имеет смысла. хотелось бы полностью физически реальной многопоточности. к примеру один главный поток и четыре вычислителя. при этом желательно на разных процессорах.

ответ интересен в общем виде. примеры решения пока не требуются, достаточно общего ответа.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2020, 13:13
Ответы с готовыми решениями:

Многопоточность в asm
Нужно создать два потока чтобы они одновременно выводили на экран сообщения. Или может кто...

Многопоточность
Как создать 2 функции. Главную и второстепенную. Чтобы в определенный момент из главной в...

Многопоточность
Доброго времени суток всем. Народ задача стоит многопоточное умножение матриц. Ну если я правильно...

Многопоточность
Доброго времени суток! Прокомментируйте пожалуйста данный код по использованию потоков. В чем его...

5
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
160 / 47 / 10
Регистрация: 04.02.2019
Сообщений: 263
Записей в блоге: 5
02.03.2020, 08:59  [ТС] 3
именно эта опасность меня и беспокоит. я опасаюсь что четыре одинаковых потока займут два физических ядра и будут в итоге работать как два. или даже хуже из за расходов на сохранение контекста переключение между ними.
0
4164 / 1816 / 216
Регистрация: 06.10.2010
Сообщений: 4,070
02.03.2020, 09:31 4
Насколько я понимаю по-умолчанию потоки не привязываются к ядрам а выполняются на том ядре, которое свободно в данный момент. А если учесть, что потоков в современной ОС сотни (если не тысячи), то поток постоянно будет выполняться на разных ядрах.

Добавлено через 5 минут
отсюда
При вытесняющей многозадачности каждое приложение,которое выполняется,периодически получает квант процессорного времени. Блок Windows,который отвечает за распределение времени процессора,может в любое время прервать активную задачу и передать управление следующей.
То есть планировщик переключает задачи десятки раз в секунду, у каждого потока свой приоритет (квант времени). И при переключении Windows просто выбирает то ядро, на котором поток уже исчерпал свой квант. Но это не точно...
0
1486 / 1413 / 240
Регистрация: 19.02.2010
Сообщений: 3,914
02.03.2020, 11:53 5
Цитата Сообщение от murderer Посмотреть сообщение
KeSetSystemAffinityThreadEx
Не обязательно лезть к функциям ядра Винды - SetThreadAffinityMask() тоже работает. И так же не разделяет физические и логические ядра процессора.
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,124
Записей в блоге: 12
02.03.2020, 21:10 6
Лучший ответ Сообщение было отмечено K_ILYA_V как решение

Решение

Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2020, 21:10
Помогаю со студенческими работами здесь

Многопоточность
Меня заинтересовало то, как работает многопоточный процессор с оперативной памятью - ведь она одна?...

Многопоточность
Здравствуйте, программу написал и что самое странное - работает:), но не до конца въехал в тему,...

многопоточность
есть скрипт, который выполняет одинаковые действия для каждого id, этот id передается через get,...

Многопоточность
Данный код должен в теории выдавать произвольное число (в определенном интервале). У меня четко...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru