|
1 / 1 / 0
Регистрация: 28.05.2013
Сообщений: 50
|
||||||
Многопоточное сложение элементов массива01.06.2013, 20:46. Показов 11414. Ответов 26
Метки нет (Все метки)
Здравствуйте.
Задание - сложить многопоточно элементы одномерного массива. На вход подаётся кол-во элементов и кол-во потоков. Как это реализовать? Мне понятно как создать нужное кол-во потоков. Т.е. это приблизительно выглядит так:
А вот как обрабатывать сложение элементов массива? Для каждого потока писать отдельную функцию? Но на вход подаётся случайное кол-во потоков, как тогда нужное кол-во функций создать? По сути, результат сложения будет в виде бинарного дерева, как я понимаю. (Извиняюсь, как картинку вставить я так и не понял, поэтому ссылка) Т.е. на первом уровне происходит попарное суммирование элементов, на втором - суммирование получившихся сумм и так далее до ответа. Подскажите пожалуйста, как вообще правильно разбивать элементы массива по разным потокам и передавать результат вычисления дальше, в эти же потоки?
0
|
||||||
| 01.06.2013, 20:46 | |
|
Ответы с готовыми решениями:
26
Сложение элементов массива Сложение всех элементов одномерного массива
|
|
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
|
|
| 02.06.2013, 06:57 | |
|
Такие вещи вообще на SSE писать надо.
0
|
|
|
1 / 1 / 0
Регистрация: 28.05.2013
Сообщений: 50
|
|
| 02.06.2013, 13:35 [ТС] | |
|
Psilon, задание как раз и состоит в том, чтобы показать как распараллелится сложение элементов массива в зависимости от количества процессоров, т.е. потоков. О скорости тут речь не идёт.
А нужно - чтобы исходный массив разбивался на пары элементов, эти пары распределялись между потоками. И соответственно каждые два элемента складывались между собой параллельно в разных потоках. Затем уже результаты этих сложений разбивались на пары элементов, они распределялись между потоками и т.д. И так до того момента, пока не получится результат - сумма всех элементов массива.
0
|
|
|
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
|
|
| 02.06.2013, 16:44 | |
|
быстрее будет потокам раздать равные куски массива, а потом сложить их результаты. Почитай на досуге про класс Parallel.For
0
|
|
|
Master of Orion
|
|||||||||||
| 02.06.2013, 17:03 | |||||||||||
|
Вот тупой вариант:
1
|
|||||||||||
|
Каратель
|
|
| 02.06.2013, 17:06 | |
|
0
|
|
|
Master of Orion
|
|
| 02.06.2013, 17:08 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 28.05.2013
Сообщений: 50
|
|
| 02.06.2013, 17:14 [ТС] | |
|
Psilon, спасибо, только можно разъяснить что где происходит?
Особенно во втором варианте.
0
|
|
|
Master of Orion
|
|
| 02.06.2013, 17:29 | |
|
Jupiter, существует специальный метод, позволяющий пройти параллельно по всем элементам, есть специальный класс, который позволяет атомарно осуществить сумму. Зачем что-то еще изобретать, особенно если учесть, что этот метод еще и быстрее?
Добавлено через 4 минуты Хотя не, interlocked тормознутее... Тогда нафиг он нужен такой... Добавлено через 4 минуты от двух до 10 раз медленнее. Я в шоке.
0
|
|
| 02.06.2013, 17:31 | |
|
0
|
|
|
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
|
|
| 02.06.2013, 17:56 | |
|
Parallel в задачах массивов работает быстрее. new Thread() надо использовать лишь в ситуациях ограниченного распараллеливания (2-3 потока максимум) или асинхронной подкачки блоков данных(например параллельная выгрузка и индексация текстовых страниц), когда поток никогда не завершает свою работу, а временно уходит в Sleep. Ну тут короче надо пробовать разные варианты.
0
|
|
|
Higher
|
|||||||||||||||||||||
| 05.06.2013, 19:33 | |||||||||||||||||||||
|
Провел небольшой бенчмарк
Реализация функций на с++
Ключи компиляции -
Мои результаты:
1) LINQ дико тормозит 2) LINQ дико параллелится (ускорение почти в 6 раз, с учетом того, что у меня 4 ядра + гипертрединг - превосходно). 3) for == foreach в данном случае (я ожидал того, что в for'e будет проверятся выход за границы). 4) JIT плохо инлайнит (ForEach сильно тормозит, видимо, из-за постоянных вызовов функций) 5) JIT не умеет векторизацию 6) тормоза с Parallel.ForEach наводят на мысли, что шарповский тредпул - не самая эффективная штука (omp вроде тоже через тредпул и атомики параллелит, разница видна невооруженным глазом)
2
|
|||||||||||||||||||||
|
Master of Orion
|
|
| 05.06.2013, 20:28 | |
|
diagon, сделай массив байтов длинной int.MaxValue/3 (чтобы не вылетело OutOfMemory) и затести на нем.
На ночь поставлю (на сотню прогонов каждый способ), а пока так: debug Any CPU release x64 release x32
0
|
|
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
||||||
| 05.06.2013, 20:57 | ||||||
|
обязательно надо было считерить на с++ варианте?)
тогда уже надо добавить такой вариант
на anycpu release есть ускорение от без-поточного варианта (у меня аж на 3000 тиков, логических ядер всего 2)
1
|
||||||
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
| 05.06.2013, 21:07 | |
|
вот примерно так
0
|
|
| 05.06.2013, 21:07 | |
|
Помогаю со студенческими работами здесь
20
массив string сложение элементов массива в разной последовательности, все возможные варианты Сложение двух элементов массива
Сложение элементов массива
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|