![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> что сотню потоков процессор держит без сколько-нибудь заметного ущерба
поток потоку рознь. Из этой сотни потоков почти все спят, иначе проц постоянно был бы загружен на 100%. И нет смысла запускать 3 тяжелых потока на 2-х ядерном проце, это просто ненужная трата ресурсов на переключения между ними, без повышения производительности. > Затраты на поток по сравнению с секундой совершенно ничтожны. мы говорим об оптимальном варианте. Сегодня надо создать 30 потоков, завтра 300, послезавтра 3000. Пять бабушек - уже рубь!
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#12 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]() Цитата:
Не нужно бояться запускать потоков больше, чем есть ядер. Последний раз редактировалось s-andriano; 31.05.2012 в 18:43. |
|
![]() |
![]() |
![]() |
#13 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
хм, ну вот простой тест:
Код:
Цитата:
> Не нужно бояться запускать потоков больше, чем есть ядер. бояться, конечно, не нужно, проц не сгорит, и ничего страшного не произойдёт. Просто работа будет выполнена медленней, ну, это не так страшно ![]()
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 31.05.2012 в 19:06. |
|
![]() |
![]() |
![]() |
#14 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Запустил Ваш код.
Код:
Цитата:
Это в простейшем случае можно определить объем работы, приходящийся на каждый поток. А когда неопределенность составляет скажем 2-3 раза, то в случае двух ядер/двух потоков: - первое ядро будет делать 25% работы, второе - 75%. По сравнению с однопоточным режимом выигрыш составит 25%. Делим на 100 потоков с тем же разбросом, т.е. от от 0.58 до 1.7% на каждый. В худшем случае ядро в одиночестве будет работать 1.7% времени. Оставшиеся 98.3% будут выполнены за 49.2% времени. Суммарное время составит 50.8% от однопоточного варианта. Т.е. задача будет посчитана примерно в 1.5 раза быстрее при 100 потоках про сравнению с двумя. Последний раз редактировалось s-andriano; 31.05.2012 в 19:59. |
|
![]() |
![]() |
![]() |
#15 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
выводы: 2 ядра, и тест слишком грубый и слишком рано заканчивается, чтобы почувствовать разницу )
Добавьте нолик в цикле по i, разница должна стать заметной.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#16 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]() Цитата:
Измерения, естественно, дают более точные денные. Но даже 4 значащих цифр, оказывается недостаточно, чтобы почувствовать разницу. Вопрос, так есть ли она в действительности. Кстати, результаты демонстрируют некоторый разброс, который, в частности, проявляется и в том, что при большем количестве потоков получаются меньшие цифры. Но я даже готов уступить и согласиться, что разница в 5-м знаке есть. Но советую еще раз перечитать мое сообщение, в котором я обосновал тезис, что с увеличением количества потоков время выполнения задачи сокращается. Естественно, не до бесконечности, но для нескольких сотен потоков. Внес некоторые коррективы в Вашу программу: Код:
Последний раз редактировалось s-andriano; 31.05.2012 в 20:30. |
|
![]() |
![]() |
![]() |
#17 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]()
Чтобы был понятней обсуждаемый вопрос, опишу суть задачи (нужно было это сделать в первом посте).
Это задача на моделирование состояние газовых и жидких сред. Алгоритм расчетов состояния примерно такой: Есть начальное состояние среды (начальные условия), загружаем его в исходный массив данных. В зависимости от необходимой точности и разрешения он может представлять собой матрицу от 1000Х1000 и более элементов. Используя этот массив рассчитываем вклад влияния отдельных факторов (сила трение, гравитация и др.) на состояние среды (Fx, Fy, Fz). Факторов может быть от трех до семи (редко больше), зависит от задачи. Затем влияние отдельных факторов суммируется и рассчитывается новое состояние среды (Fxyz). Новое состояние мы (если это необходимо) как то отображаем графически, записываем его на место начального состояния среды (в исходный массив данных) и рассчитываем следующее состояние. Это все повторяется какое то количество раз (пока не получим интересующий нас результат). Получается что потоков нам нужно от трех до семи, и пока не рассчитано новое состояние (Fxyz) запускать повторно Fx, Fy, Fz мы не можем. Ф-ции Fx, Fy, Fz используют для расчета весь массив данных, нужно синхронизировать доступ к нему или скопировать массив в каждый поток. П.С. С синхронизацией разобрался, понял что она при чтении данных не обязательна. Последний раз редактировалось gusluk; 01.06.2012 в 08:40. |
![]() |
![]() |
![]() |
#18 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Кстати, результаты демонстрируют некоторый разброс, который, в частности, проявляется и в том, что при большем количестве потоков получаются меньшие цифры.
кстати да, я тоже это заметил ) Оказалось, что в Дельфи настолько криво сделана работа с плавающей точкой, что random() в одном потоке выполняется быстрее, чем в двух и более. И код с оптимизацией работает медленней, чем код без неё. Поэтому я исключил работу с плавающей точкой, добавил работу с памятью и расширил тест до 64 потоков. Исходник ниже, а результат вот: Код:
> первое ядро будет делать 25% работы, второе - 75% стоп, мы говорим, что все потоки одинаково загружены. Не важно чем, но они не простаивают. Тезис простой: если потоки не простаивают, то их не должно быть больше, чем ядер. Если 100% работы можно разбить на 100 частей, то оптимальное разбиение по ядрам: 1 ядро: 1 поток, 100 частей 2 ядра: 2 потока, по 50 частей каждый 4 ядра: 4 потока, по 25 частей каждый и т.д. Цитата:
Так вы и не сказали, меняют ли массив Fx, Fy, Fz или нет. Если меняют, то есть очередность их запуска (т.е. очевидно, что результат работы одной из F будет зависеть от данных, изменнёных в другой F), если нет, то никакой синхронизации не нужно и копирования тоже. Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
![]() |
![]() |
![]() |
#19 |
Форумчанин
Регистрация: 16.10.2008
Сообщений: 205
|
![]() |
![]() |
![]() |
![]() |
#20 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> Не меняют.
тогда можно взять за основу исходник из поста #18, там есть и работа с массивом, и ожидание завершения работы всех потоков, и запуск от 1 до 64 потоков сразу. Код из главного тела программы выносим в отдельный поток, запускаем его в гуе и всё. Когда он пошлёт нам сообщение, отрисовываем график и уходим на новую итерацию, если нужно. При желании потом можно ограничить число одновременно работающих потоков, не создавать потоки заново. Но, думаю, на ваших объемах это даст не более 1% выигрыша, так что это скорее академический, чем практический интерес. Update: в коде не хватает закрытия хендлов после остановки потоков: Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 01.06.2012 в 10:56. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
оптимальный план замены оборудования | DampuL | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 23.12.2010 16:04 |
Оптимальный поиск и сравнение строк | Utkin | Общие вопросы по программированию, компьютерный форум | 19 | 30.06.2010 14:54 |
нужно найти оптимальный путь | Marina87 | Фриланс | 16 | 29.04.2010 16:01 |
оптимальный размер окна программы | street-walker | Общие вопросы Delphi | 10 | 06.01.2010 00:04 |