|
2357 / 1775 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
|
|||||||
Эффект от применения потоков к сумированию элементов массива12.11.2015, 02:29. Показов 2069. Ответов 33
Метки нет (Все метки)
Здраствуйте, есть массив на 100000000 элементов. В него пихаем рандомные данные типа double.
Потом считаем суму всех элементов. Получаеться, что выполнение в главном потоке в 3 раза быстрее, чем, если бы запускать 2 потока Почему так? И почему результаты не совпадают в дробной части?
0
|
|||||||
| 12.11.2015, 02:29 | |
|
Ответы с готовыми решениями:
33
Ошибка из-за применения массива
Связка массива структур с классом без применения указателей |
|
Кодогенератор
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
|
|
| 12.11.2015, 23:07 | |
|
1
|
|
|
2357 / 1775 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
|
||
| 13.11.2015, 00:54 [ТС] | ||
|
какой у вас ЦП?
0
|
||
|
Кодогенератор
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
|
|
| 13.11.2015, 02:53 | |
|
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
|
|||
| 13.11.2015, 04:09 | |||
|
У меня оригинальный код вот так отрабатывает (процессор i5 760)
Дебаг
0
|
|||
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
||
| 13.11.2015, 10:22 | ||
|
А вот ещё любопытный момент:
набросал dll на плюсах имеющую одну функцию суммирования элементов массива, подключил её к шарповскому проекту и сравнил все варианты. Результаты:
Камень АМД А10-7700К, 4 ядра. В студии: конечная платформа х86, релизная сборка, оптимизация включена.
0
|
||
|
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
|
||||||
| 13.11.2015, 11:34 | ||||||
|
Результат сортировки массива с библиотекой BindingAndServiceCoreParellel.
...N.............1 thread............8 Core 1000...............0.01.............0.19 ..........x = 0.05 10.000............0.56..............0.47 .........x = 1.19 50.000...........14.38.............3.90. .........x = 3.68 100.000..........57.34...........12.88.. ........x = 4.45 300.000........8.37.17........1.38.56... .......x = 6.00 500.000......24.02.64.........4.24.32... .......x = 5.65
0
|
||||||
| 13.11.2015, 11:50 | |
|
Не по теме: Тотальное отсутствие у человека логики. Это печально.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 13.11.2015, 13:04 | ||||||
Сообщение было отмечено zewer как решение
Решение
zewer,
Во-первых, результат теста очень зависит от методики тестирования. Вот вы, к примеру, тестируя суммирование массива зачем-то в обоих случаях включили в замер еще и вывод результата на консоль, но при этом не посчитали время на создание потоков, которое может быть значительным. Во-вторых, вы по сути тестируете не один и тот же метод, но распараллеленный, а два разных подхода к задаче, и проблема здесь в оптимизаторе: в первом случае у вас идет цикл от 0 до длины массива. Оптимизатор обучен засекать такие циклы и вырезать из генерируемого кода проверки на выходы за пределы массива. Во втором случае у вас переменная цикла высчитывается (деление на 2), потому оптимизатор здесь ничего не делает и на каждой итерации вставляет проверку — не вышел ли массив за пределы. В-третьих, и это отчасти связано с во-вторых — для того, чтобы параллельный код работал быстро, недостаточно взять метод, написанный для одного потока, разбить его на 2 куска и запустить в двух потоках для повышения быстродействия. Код, который подразумевается выполнять в разных потоках, должен изначально писаться для работы в разных потоках — это значит, что нужно учитывать переключение контекста, локальность данных и, как сказано в предыдущем пункте, возможные оптимизации, которые будет делать компилятор. Вот тот же самый код, но всего лишь малость измененный с учетом вышеперечисленного: 1. В однопоточном случае убрана фора в виде вырезанной проверки индексов. Как вариант для уравновешивания можно использовать небезопасный код во втором случае, чтобы избавиться от проверки, но просто убрать оптимизацию проще в плане реализации. 2. Из замера времени убран вывод в консоль в обоих случаях. 3. Во втором случае так же учитывается время на создание потоков. 4. В многопоточный код добавлен учет кэша процессора в виде локальной переменной, куда пишется сумма. Статическая переменная записывается только один раз после цикла. Для честности то же самое сделано в однопоточном методе.
В первом методе многопоточного способа, кстати, еще можно убрать деление длины массива на 2 на каждой итерации, ну да бог с ним.
2
|
||||||
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
||
| 13.11.2015, 13:17 | ||
|
kolorotur, шикарно, я даже как-то не подумал, что использование глобальных переменных затормозит потоки. В своём варианте дополнительно убрал деление длинны архива пополам из цикла в переменную. Результат:
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 13.11.2015, 13:30 | ||
|
1. Статическая переменная и массив живут в куче 2. Массив большой. 3. В кэш процессора память помещается сплошным блоком по принципу "если идет запрос к этому адресу, то, возможно, будут запросы к адресам поблизости". Из этого следует, что на ранних итерациях с большой вероятностью и статическая переменная и кусок массива попадут в кэш, т.к. в программе между их созданием происходит немного и скорее всего они лежат где-то рядом. А вот на поздних итерациях им обоим в кэше уже не быть, т.к. интервал памяти между переменной и обрабатываемым в данный момент куском массива будет больше, чем размер кэша. Вот процессор и будет метаться от одного к другому. В случае с локальной переменной джиттер увидит, что эта переменая мало того, что локальная, так еще и часто используется в цикле и с большой вероятностью поместит эту переменную сразу в регистр процессора, а не в стэк или кучу. Вот, кстати, почему-то любители порассуждать о том, где хранятся переменные: в стэке или в куче, почему-то всегда забывают про регистры
0
|
||
| 13.11.2015, 15:42 | |
|
0
|
|
|
2357 / 1775 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
|
||
| 13.11.2015, 17:43 [ТС] | ||
|
Тестил свой код на AMD Phenom II x4 965 3,7 GHz
Перетестил на другом компе на базе Intel Core 2 Quad 9505 2,83 Ghz, и там потоки заметно быстрее выполнились чем один мейн поток Может феном не дружит с потоками дот нета? Добавлено через 5 минут kolorotur, спасибо, прошел у себя С вашим кодом мой феном 965 быстрее мотает чем Q9505 Результат с 965 фенома, в релизе, и общий прирост в потоках, по сравнению с мейн потоком, теперь равен почти 2 раза
0
|
||
|
Master of Orion
|
||||||
| 13.11.2015, 20:26 | ||||||
|
OwenGlendower, для этого вообще стоит использовать специальные библиотеки, высчитывающие погрешность, прогревающие кэш и прочее...
Я обычно юзаю BenchmarkDotNet (небольшая реклама ), с недавних пор в её разработке участвует Джон Скит (хотя я начал ей пользоваться еще до этого), что косвенно говорит о том, что либа довольно интересная. Ну и я позволили себе добавить для сравнения еще и свою реализацию. ![]()
0
|
||||||
| 13.11.2015, 23:08 | |
|
0
|
|
| 13.11.2015, 23:08 | |
|
Последнее значение массива x, после применения функции обращается в 0 Как реализовать код без применения ассоциативного массива (map)?
Как сделать эффект размытия (эффект стекла) в Xaml? Необходимо разработать функцию, вычисляющую среднее арифметическое массива (без применения рекурсии) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|