и более процессов? Т.е. то же самое, что и при прерывании (сохранение rip, слова состояния программы и всех регистров)?
если ядро одно и на нём запущено несколько потоков, то да, по прерыванию таймера(допустим раз в 10мс) вызывается планировщик, который меняет данные
А avx тоже сохраняются? Это ж крайне долго, однако при текстах с перемножением матриц я получил падение производительности при > 4 потоках ~ в 1,5 раза, но с увеличением числа потоков серьёзной разницы я не заметил. В чём магия?
авх сохраняются только если они использованы
долго потому что перед использованием avx сохраняется состояние sse. поэтому надо крайне внимательно за этим смотреть и делать код так чтоб в больших циклах отсутстовали вызовы sse или апи ос (она тоже использует sse и контекст приходится переключать) и не смешивать sse+avx
Их дефолтными значениями забивают? Скорее всего нет, тогда как это определяется?
Ты именно про многопоток? Я просто не уловил взаимосвязь между большими циклами и sse.
нельзя смешивать в коде работу sse и avx. как вариант у тебя это произошло
я в многопотоке не шарю
Не, я наивный вариант написал и без оптимизаций.
Так ладно, а как всё-таки взаимосвязаны тогда sse и avx? avx же отдельный блок
а может и нет проверки и всё сохраняется при каждом переключении :)
@disba1ancer @s54820 ProMiNick может поучаствуете?)
С avx как и с sse есть какие-то способы не сохранять, если не используется
Со смешиванием и сохранением нет проблем за сохранение состояния отвечает одна инструкция по сути, нужно только выяснить сколько она сохраняет
А в чём вопрос то?
В том то и вопрос, какие способы и как определяется их использование? Плюс хотелось бы узнать подробнее про смешивание sse и avx, а также про циклы с ними (ну то, что писал Айван), а также почему с увеличение количества потоков (с определенного значения > количества ядер) не ухудшается производительность?
Ну как я понял смешивание инструкций только вызывает проблемы производительности, к сохранению состояния это не относится, а про какие потоки вопрос?
Так изначально вопрос то и был про производительность)) Про обычные треды вин32.
Ну вообще, когда потоков больше чем ядер производительность отдельно взятого потока падает, но обычно в системе не так много активных потоков чтобы это было заметно
Ну я ж замерил - взял перемножение матриц, распараллелил, и получил, что производительность на 6 потоках в пределах погрешности совпадает с производительностью на 12, при 4 реальных ядрах.
С 100% нагрузкой?
Т.е ты перемножал одну матрицу кучей потоков, так?
Ну взял две матрицы и перемножал одну на другую
3к на 3к брал
Ну так если все потоки по сути работают над общей задачей значительного падения не будет, будет некоторый оверхед на переключение контекста и всё, потому, чтобы выжать максимум, нужно рабочих потоков по числу ядер держать
Обсуждают сегодня