3 / 3 / 1
Регистрация: 15.01.2025
Сообщений: 52

Как распараллелить вычисления не множа копии данных и получить прирост производительности?

23.02.2025, 04:39. Показов 7158. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
 Комментарий модератора 
Сообщение вынесено из темы Реализация потока в Delphi


Цитата Сообщение от krapotkin Посмотреть сообщение
1. каждый поток должен иметь свою копию данных
Подскажите пожалуйста: Есть массив данных в 3 ГБ. Т.к. накладно иметь копию таких данных для каждого потока, то была идея сделать общий массив в глобальной переменной и каждый поток будет обращаться к нему по мере надобности (в одно вычисление читается 1-3 байта. Массив не изменяется.). Но на практике получилось, что на одной и той же задаче один поток работает быстрее, чем несколько.
Вопрос: Как распараллелить вычисления не множа копии данных и получить прирост производительности?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2025, 04:39
Ответы с готовыми решениями:

Будет ли заметен прирост производительности?
В данный момент сижу на core 2 quad q9300 2.5Ghz. Естественно сокет старый. Решил собирать новую конфигурацию, но так как с бюджетом туго,...

Найти среднегодовой прирост производительности
Среднегодовая производительность труда. За первый год производительность труда на предприятии возросла на p1 %, за второй и третий - ...

Стоит ли прирост производительности приросту t?
Поставил в ПК 2ую видеокарту. До этого Heaven DX11 Benchmark 3.0 на ATI HD 7750 показывал FPS:22.8. Пошаманив и подключив Nvidea GeForce...

65
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
24.02.2025, 21:59
Студворк — интернет-сервис помощи студентам
As17, я надеюсь sinchronize не используете???
0
462 / 185 / 32
Регистрация: 04.08.2018
Сообщений: 732
24.02.2025, 23:08
As17, есть книга про потоки в Дельфи Martin Harvey 2000. "Multithreading - The Delphi Way.". Её можно не сложно нагуглить по названию в яндексе, первая выдача. В главе "Chapter 2. Creating a thread in Delphi." написано:
Communication issues.
These occur when you have two threads which are both running, and you need to communicate between them in any way, shape or form. This program dodges the issue, by simply not having any communication at all between separate threads. Suffice to say at this point, that unless you protect all operations on shared data (for an adequate definition of "protect"), your program is quite likely to be non-deterministic. If you do not have adequate synchronization or concurrency control, the following are no-no's:
Accessing any form of shared resource between two threads.
Playing with thread unsafe parts of the VCL in a non-VCL thread.
Attempting to do graphics operations in a separate thread.
Even doing things as simple as having two threads accessing a shared integer variable can result in complete disaster, and unsynchronized access to shared resources or VCL calls will result in many hours of fraught debugging, considerable confusion, and eventual consignment to the nearest mental hospital. Until you have learnt the appropriate techniques in later chapters,dDon't do it.
Где-то ещё я читал, что если в потоке есть обращение к общему ресурсу, то Дельфи запустит оба потока в не параллельном режиме, а в последовательном. В каждый момент времени будет работать только один из потоков (т.е. использовать процессор и что либо ещё). Итого все запущенные потоки будут работать на одном процессорном потоке или логическом ядре. Если у вас тяжёлые расчёты, то будет упор в процессор. Выглядеть это будет так: процесс полностью занимает только одно логическое ядро. Если одно логическое ядро это 8% от всего (100/12), то программа в диспетчере будет занимать 8% "всего процессора". Если такую программу Дельфи запустит в параллельном режиме, то загрузка процессора сможет вырасти выше 8%.
Скорее всего вы не занимались управлениями потоков, поэтому у вас не доступ к массиву последовательный, а даже расчёт последовательно выполняется.
Как заставить Дельфи запустить потоки параллельно написано в книге. Если в двух словах - или избавиться от доступа к общему ресурсу или использовать приёмы типа синхронизации, критических секций. Есть ещё штуки для управления потоками, но я не освоил Mutex-ы.
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
24.02.2025, 23:13
As17, нашел свой тест параллельной сортировки. работает. написано тупо и линейно. нажать тымпочки ген, копиарр, тестпаралл.

ParallelSort.zip
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
24.02.2025, 23:21
тогда нужно всего лишь взять пример массива в 1 мбайт и сделать тестовый проект, который нужно выложить сюда, чтобы можно было понять, в чем проблема
чаще всего предположения автора о том как работает его программа, немного расходятся с реальностью...

Добавлено через 4 минуты
Цитата Сообщение от Rayvenor Посмотреть сообщение
Дельфи запустит оба потока в не параллельном режиме, а в последовательном
что за городские легенды?
делфи вообще ничего не проверит и не запустит "в последовательном режиме" хотя бы потому, что запущенными потоками управляет ОС
если ресурс read-only, то его чтение хоть из 100 потоков не приведет к изменению памяти, поэтому будет вполне безопасно
0
462 / 185 / 32
Регистрация: 04.08.2018
Сообщений: 732
24.02.2025, 23:27
As17, и если вы задумались добавить в свою программу классические потоки, то первое что нужно прочитать это статью из блога krapotkin https://www.cyberforum.ru/blogs/469693/4875.html
Есть ещё другая реализация потоков в Дельфи из библиотеки Parallel Programming Library (PPL). Там сделано всё проще и удобнее, но мне было освоится так же тяжело, как и с классическими, т.к. информации в интернете очень мало, и она вся перекопипащена друг у друга. Даже стрим русскоязычных комьюнити-менеджеров и демо-проект оставили вопросы.

Добавлено через 2 минуты
Цитата Сообщение от krapotkin Посмотреть сообщение
делфи вообще ничего не проверит и не запустит "в последовательном режиме" хотя бы потому, что запущенными потоками управляет ОС
Да, не Дельфи, а "программа, написанная на Дельфи". Про другие ЯП не знаю, не сравнивал. Я лично столкнулся с таким поведением.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
25.02.2025, 01:33
As17, давайте проект на пробу. И с данными как-то придумать бы, чтобы сгенерировать похоже и тоже попробовать потестить.

Цитата Сообщение от As17 Посмотреть сообщение
Такое чувство, что при чтении одного элемента массива одним потоком, данные из ВСЕГО массива для второго потока на какое-то время не доступны.
Чтение одного байта из 3 ГБ массива будет идти не быстро - его скорее всего не будет в кэше процессора, и использование 2 потоков этот процесс практически не ускорит.
В общем, давайте проект на пробу.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
25.02.2025, 07:05
Ну, с 3 гб ничего и никогда не будет в кэше процессора
Все будет идти со скоростью обращения к памяти, но это все равно немало
Если я правильно понял идею, потоки для вычислений все равно надо кормить, а вычисления скорее всего должны длиться дольше чем доступ, поэтому распараллеливание скорее всего принесет пользу.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
25.02.2025, 15:39
Цитата Сообщение от As17 Посмотреть сообщение
krapotkin, Нашли Х(i). Х это ряд байт, которые мы понимаем как байт данных и адрес в массиве
Что такое "адрес в массиве"? индекс в массиве?
0
3 / 3 / 1
Регистрация: 15.01.2025
Сообщений: 52
26.02.2025, 00:24  [ТС]
stalkernet, процессор ryzen 5 (6 ядер, 12 потоков). Привязка к ядру не влияет на общие тормоза. (На одном потоке результат немного быстрее получается когда поток привязан к ядру.)
Смотрю системным "Монитором ресурсов".

Запусти просто в цикле математику без проверки и посмотри нагрузку.
Ваш совет помог выяснить, что я ошибался.

Запустил только математику без чтения массива в обоих потоках - тормоза остались.
Запустил чтение массива в обоих потоках, а математику оставил в одном потоке - хорошо работает (загрузка каждого ядра 100%, потоки разнесены по ядрам).
Т.е. мое предложение, что чтение общего массива взаимно мешает работе потоков не верно.
А вот математика реализована через стороннюю библиотеку (Velthuis.BigIntegers.pas) и потоки вызывают одни и те же функции. А также следует отметить, что главный поток и вспомогательные потоки описаны в одном файле.

Если поток вынести в отдельный unit это поможет потокам считать математику без тормозов?
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
26.02.2025, 01:14
Цитата Сообщение от As17 Посмотреть сообщение
Если поток вынести в отдельный unit это поможет потокам считать математику без тормозов?
Нет. В исполняемом модуле юниты забыты.
Разделение на юниты нужно только для удобства написания, чтения и отладки кода.
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
26.02.2025, 01:34
As17, за АМДу не чего не скажу. я от него отказался лет 20 назад.

Цитата Сообщение от As17 Посмотреть сообщение
Если поток вынести в отдельный unit это поможет потокам считать математику без тормозов?
Возможно. всетаки разный namespace. Возможно гуру подскажут.

Монитор пошустрее найди. 1сек ох... долго. в идеале 50-100 мсек на тик.

сколько байт разрядность? похоже перегрузка регистров кучу времени занимает.
Работал с Velthuis.BigDecimals. Завтра посмотрю... по настроению.
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
26.02.2025, 01:36
Цитата Сообщение от stalkernet Посмотреть сообщение
Возможно. всетаки разный namespace.
Бред. В исполняемом модуле никаких имён нет.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
26.02.2025, 07:35
Цитата Сообщение от As17 Посмотреть сообщение
Если поток вынести в отдельный unit это поможет потокам считать математику без тормозов?
Цитата Сообщение от stalkernet Посмотреть сообщение
Возможно. всетаки разный namespace.
ОМГ

Цитата Сообщение от stalkernet Посмотреть сообщение
Монитор пошустрее найди. 1сек ох... долго. в идеале 50-100 мсек на тик.
Точно! Монитор заменить надо.

Добавлено через 2 минуты
Цитата Сообщение от As17 Посмотреть сообщение
Запустил только математику без чтения массива в обоих потоках - тормоза остались.
Цитата Сообщение от As17 Посмотреть сообщение
А вот математика реализована через стороннюю библиотеку (Velthuis.BigIntegers.pas)
Видимо в библиотеке и проблема
Правда не понимаю какая.
Как чисто теоретическое предположение: она особо буйно работает со строками (если внутри строковое представление "длинный математики") и всё упирается в менеджер памяти. Но гипотеза средненькой такой надёжности.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
26.02.2025, 09:04
вообще работа со строками это довольно страшный вызов
если идет постоянная перезапись строк, то это дичайший оверхед по работе менеджера памяти
любая библиотека, где строки используются активно, должна первым делом оптимизировать именно этот момент
1
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
26.02.2025, 12:53
Цитата Сообщение от stalkernet Посмотреть сообщение
всетаки разный namespace
Каюсь. ковырял ся(С). перемкнуло......

И таки да... проблема в либе. два потока на простом с := a + b идут последовательно....

KSergey9, krapotkin, нету там строк. чистая численная математика.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
26.02.2025, 13:36
насколько я понял, сейчас мы здесь:
-расчеты медленные
-чтение из массива ни на что не влияет

а что за числа там такие, что прямо не хватает 64-бит integer и приходится в стороннюю математику ?
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
26.02.2025, 13:43
одна и две копии программы без потоков.
мониторинг

1x


2x


бвло чтото на тему оптимизации asma. может тут?
по ходу приятного мало. расчитывал на потоки.
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
26.02.2025, 13:46
krapotkin,

ну человек свой БИТКОИНТ делает..........
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
26.02.2025, 13:46
но с расчетами-то потоки точно должны помогать
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
26.02.2025, 13:48
Цитата Сообщение от stalkernet Посмотреть сообщение
мониторинг
и что, не умещается в int64 ??
Отмасштабировать точно нельзя вот эти бестолковые нолики?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2025, 13:48

Будет ли прирост производительности в играх?
вопщем у меня примерно такой конфиг: мамка: EGS P4M890T-M (775 сокет) камень: intel pentium 4 531 память: 2048мб DDR2 видео:...

CUDA делся прирост производительности?
Всем привет! Давно читаю этот замечательный форум будучи незарегистрированным (потому что на каждый вопрос находился ответ). Пользуясь...

Даст ли прирост производительности, замена ОЗУ
Даст ли прирост производительности, замена или добавление ОЗУ при такой конфигурации? Компьютер не новый, винда свежая, лицензия. Помогите...

После апгрейда компьютера не наблюдается прирост производительности
Всем привет! Обновил недавно комп, думал сейчас буду игры на ультрах запускать, собрал всё, и что я вижу? прирост в играх 5 фпс?Это как...

Прирост производительности ПК в играх при замене видеокарты
Доброго времени суток. На данный момент у меня Asus GeForce GTX 650 Ti 1024MB GDDR5 (128bit) (928/5400).Планирую брать на замену MSI PCI-Ex...


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

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

Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru