872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
1

Есть ли смысл создавать потоки количество которых больше чем количество ядер процессора?

29.10.2016, 13:09. Показов 7263. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сабж. Есть ли смысл? Ведь одновременно одно ядро процессора не может выполнять более одной задачи (а поток это задача)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2016, 13:09
Ответы с готовыми решениями:

Имеет ли смысл создавать больше потоков, чем ядер в процессоре?
Всем привет! Такой вопрос, имеет ли смысл создавать больше потоков, чем ядер в процессоре? if...

Найти количество строк, в которых количество отрицательных элементов больше, чем количество положительных.
Двумерные массивы. Задание 1. В каждом варианте дан двумерный массив A из N строк и М...

Найти количество строк, в которых количество отрицательных элементов больше, чем количество положительных
Найти количество строк, в которых количество отрицательных элементов больше, чем количество...

Вывести номера столбцов, в которых количество отрицательных элементов больше, чем количество положительных
Помогите пожалуйста решить задачу Матрицу D(8, 9) заполнить целыми случайными числами в...

35
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
02.11.2016, 19:31  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от ct0r Посмотреть сообщение
тебе стоит почитать про то, что такое concurrency, а что такое parallelism, зачем они нужны и чем отличаются.
Про это читал, но к какой составляющей именно ты клонишь не могу понять

Цитата Сообщение от ct0r Посмотреть сообщение
green threads.
Это вроде только в виртуальных машинах есть, а в си нет виртуальной машины (тема изначально была создан в разеделе Си)

Цитата Сообщение от ct0r Посмотреть сообщение
Принять к сведению существование hyper-threading technology
Нашел информацию. Но эта технология только у intelовских процессоров и судя по всему логический процессор все равно не может параллельно выполнить 2 потока

Добавлено через 1 минуту
Выходит 1 ядро = 1 поток идеальный вариант
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.11.2016, 19:54 22
Цитата Сообщение от sys_beginner Посмотреть сообщение
Выходит 1 ядро = 1 поток идеальный вариант
Если потоки работают с высоким темпом в память, то может получиться так, что они друг другу вышибают данные из кэша. Проблема может быть не только с кэшем, но и на более поздних стадиях подсистемы памяти. Например, когда физически установлена одна планка памяти, то при высоком темпе, идущем от нескольких потоков, она начнёт сдерживать потоки.

Вполне может получиться так, что 3 потока работают быстрее, чем 4. Такая ситуация будет скорее исключением, чем правилом, но при определённых раскладах она может случиться и при проектировании программы нужно иметь её в виду
0
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
02.11.2016, 20:11  [ТС] 23
Цитата Сообщение от Evg Посмотреть сообщение
Если потоки работают с высоким темпом в память, то может получиться так, что они друг другу вышибают данные из кэша.
Кеш насколько мне известно вышибается при переключении контекста, что фактически неизбежно
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.11.2016, 21:01 24
Кэш ничего не знает про переключение контекста и никак от него не зависит. Если у тебя на исполнении крутятся 10 процессов, каждый из которых пасётся внутри одного килобайта памяти, то все они будут сидеть на кэше и ничего оттуда вытравливаться не будет. Если один процесс работает с объёмом памяти, большим, чем размер кэша, то данные в кэше постоянно будут инвалидироваться и безо всякого переключения контекста.

Поведение кэша зависит исключительно от того, по каким адресам в память идут запросы. Чем больше покрытие по адресам (при суммарном объёме, превышающем размер кэша), тем чаще будет инвалидация. И проблема с потоками может в некотором пограничном случае. Допустим, у на 6 мегабайт кэша. Каждый их потоков активно использует память в количестве 2 мегабайт. При трёх работающих потоков постоянно активными должны быть 6 мегабайт и они уместятся в кэше. А при четырёх потоках активными должны быть 8 мегабайт, и при таком раскладе данные из кэша постоянно будут вытравливаться, что может весьма значительно повлиять на производительность
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
02.11.2016, 21:49 25
Цитата Сообщение от sys_beginner Посмотреть сообщение
Про это читал, но к какой составляющей именно ты клонишь не могу понять
К тому, что если у тебя одно ядро, но нужно одновременно что-то считать, скачивать из интернета, отвечать на запросы пользователя, то как думаешь, "есть ли смысл создавать потоки количество которых больше чем количество ядер процессора?"

Цитата Сообщение от sys_beginner Посмотреть сообщение
логический процессор все равно не может параллельно выполнить 2 потока
Логический не может, физический может.
0
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
02.11.2016, 22:00  [ТС] 26
Цитата Сообщение от ct0r Посмотреть сообщение
К тому, что если у тебя одно ядро, но нужно одновременно что-то считать, скачивать из интернета, отвечать на запросы пользователя, то как думаешь, "есть ли смысл создавать потоки количество которых больше чем количество ядер процессора?"
В плане расчета на их параллельное выполнение - думаю нет

Цитата Сообщение от ct0r Посмотреть сообщение
Логический не может, физический может.
Как так? Одно ядро ведь не может параллельно выполнять 2 потока
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
02.11.2016, 22:33 27
Цитата Сообщение от sys_beginner Посмотреть сообщение
В плане расчета на их параллельное выполнение
В том и дело, что тут параллельность не нужна, а нужна конкуррентность, поэтому естественно нам нужно несколько потоков чтобы решить задачу, даже если ядро у нас одно.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Как так? Одно ядро ведь не может параллельно выполнять 2 потока
Как только в одном потоке будет промах кэша, неверное предсказание ветвления или ожидание данных по зависимости, ядро не будет стоять, а начнет исполнять другой поток. Это, само собой, не полная параллельность, но прирост производительности может дать неплохой.
1
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
02.11.2016, 22:45  [ТС] 28
Цитата Сообщение от ct0r Посмотреть сообщение
В том и дело, что тут параллельность не нужна, а нужна конкуррентность, поэтому естественно нам нужно несколько потоков чтобы решить задачу, даже если ядро у нас одно.
Это да.

Цитата Сообщение от ct0r Посмотреть сообщение
Как только в одном потоке будет промах кэша, неверное предсказание ветвления или ожидание данных по зависимости, ядро не будет стоять, а начнет исполнять другой поток. Это, само собой, не полная параллельность, но прирост производительности может дать неплохой.
Это очевидно. Но не думаю что такое поведение проявляется всегда. Наверное зависит от того насколько эффективно задание использует процессорное время и у кого какие приоритеты
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.11.2016, 23:17 29
Цитата Сообщение от ct0r Посмотреть сообщение
Как только в одном потоке будет промах кэша, неверное предсказание ветвления или ожидание данных по зависимости, ядро не будет стоять, а начнет исполнять другой поток
Сие возможно только для hyperthreading. Поэтому вам двоим прежде чем спорить, надо определиться с терминологией. sys_beginner под "ядром" понимает простое ядро, а ct0r - ядро с hyperthreading'ом
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,737
07.11.2016, 10:47 30
Возвращаясь к истокам
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ведь одновременно одно ядро процессора не может выполнять более одной задачи (а поток это задача)
С точки зрения приложения поток - совершенно необязательно одна задача, это может быть набор задач связанных между собой или нет.

Именно в этом все дело. Провозгласить идеальную архитектуру (число ниток = числу ядер + (может) 1) очень легко - но реализовать ее нередко столь же трудно, т.к. все заботы по "кормлению ниток задачами" ложатся на программиста. Если "любая нитка выполняет любую задачу", то надо предусмотреть что напр "задача 2" не должна выполняться до того как закончилась "задача 1". А если напр появилась "задача 10" то она должна быть выполнена как можно быстрее, ее приоритет максимальный и.т.д.

Распределение задач по ниткам часто резко упрощает логику, но увы, часто в ущерб производительности. А примитивное "заводим нитку на каждую задачу" быстро заводит в тупик и (справедливо) осуждается.

Вот собсно и все, вопрос простой, не надо искать пятый угол с "промахами кеша" и др.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.11.2016, 10:01 31
Согласен с предыдущим оратором. 99% задач обладают свойством того, что подзадачи НЕ сбаллансированы. А потому простые варианты типа распихать каждую подзадачу в отдельный поток не дадут предельной производительности, т.к. потоки будут исполняться разное время. Но такие варианты будут быстрее последовательного исполнения при более-менее правильном разбитии на потоки. Т.е. если программист понимает, что 2+3 вычислять в отдельном потоке слишком накладно
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
08.11.2016, 11:10 32
Я на вычислительных задачах типа перемножения матриц получал (почти) четырёхкратное ускорение на двух-ядерном процессоре с гипер-трейдингом.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.11.2016, 12:01 33
Перемножение матриц - сбаллансированная задача. В том смысле, что при распараллеливании потоки получают одинаковую нагрузку. Но далеко не не все задачи обладают таким свойством. Двумя постами выше я сказал, что 99% задач не такие - тут я явно погорячился, написав цифру в 99%

Добавлено через 1 минуту
Цитата Сообщение от Shamil1 Посмотреть сообщение
получал (почти) четырёхкратное ускорение на двух-ядерном процессоре с гипер-трейдингом
На двух нипердредных ядрах почти четырёхкратное ускорение может получиться только при перемножении больших матриц, когда процессор начинает активно лезть в память мимо кэша. В противном случае такого ускорения быть не может

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от Shamil1 Посмотреть сообщение
с гипер-трейдингом
"трэйдинг" = "trading" = "торговля"
"трэдинг" = "threading" = "дословно не переводимый глагол от слова 'поток' (потокирование)"



Добавлено через 1 минуту

Не по теме:

т.е. не глагол, а отглагольное существительное

1
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
09.11.2016, 11:17  [ТС] 34
Цитата Сообщение от Igor3D Посмотреть сообщение
А примитивное "заводим нитку на каждую задачу" быстро заводит в тупик и (справедливо) осуждается.
А в чем тупик? Можно создать тредпул куда помещать задачи и треды готовые их выполнить, не вижу никаких проблем. При наличии задачи, тред который освободился хватает следующую задачу. Что тут осудительного и что предлагается в замен?

Добавлено через 5 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Если "любая нитка выполняет любую задачу", то надо предусмотреть что напр "задача 2" не должна выполняться до того как закончилась "задача 1". А если напр появилась "задача 10" то она должна быть выполнена как можно быстрее, ее приоритет максимальный и.т.д.
В таком случае да, немного сложно. Но если нет ухищрений с приоритетами то думаю особых проблем возникать не должно
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,737
09.11.2016, 12:16 35
Цитата Сообщение от sys_beginner Посмотреть сообщение
А в чем тупик? Можно создать тредпул куда помещать задачи и треды готовые их выполнить, не вижу никаких проблем. При наличии задачи, тред который освободился хватает следующую задачу. Что тут осудительного и что предлагается в замен?
Так это и не тот вариант что осуждается.

Цитата Сообщение от sys_beginner Посмотреть сообщение
В таком случае да, немного сложно. Но если нет ухищрений с приоритетами то думаю особых проблем возникать не должно
Проблемы найдут Вас сами Напр "схватила" нитка задачу - ну как минимум надо определить тип задачи и получить "контекст", т.е. связанные с задачей данные. При этом весьма вероятно что контекст используется и др нитками. Часто нужно приостановить выполнение какой-то задачи, потом продолжить или вообще отменить и.т.п. - все это "само по себе" не сделается. В общем, начнете делать - увидите
0
872 / 459 / 90
Регистрация: 10.06.2014
Сообщений: 2,665
09.11.2016, 13:34  [ТС] 36
Цитата Сообщение от Igor3D Посмотреть сообщение
При этом весьма вероятно что контекст используется и др нитками.
Конкурентный доступ к общим данным это общеизвестная проблема многопоточного программирования Решений несколько, для каждого случая оно своё
0
09.11.2016, 13:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2016, 13:34
Помогаю со студенческими работами здесь

Подсчитайте количество наборов, в которых как количество десяток, так и количество черных карт больше половины.
Не понятно как-то это все(( Есть аналогично: Из колоды в 36 карт вытаскивают случайным образом 5...

Узнать количество ядер процессора
Какой в питоне правильный способ узнать количество ядер текущей машины?

Температура процессора i5 3470 (+количество ядер)
Здравствуйте , сегодня преобрёл б.у. проц i5 3470 4х ядерный на материнку H61M-K , до этого стоял...

Можно ли подделать количество ядер процессора
я зна есть файлы которые изменяют реестр после которых компьтер думает что к примеру у него sp3 а...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

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