Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 3 / 1
Регистрация: 15.01.2025
Сообщений: 52

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

23.02.2025, 04:39. Показов 7136. Ответов 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,683
Записей в блоге: 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
Модератор
4152 / 2361 / 814
Регистрация: 15.11.2015
Сообщений: 9,494
25.02.2025, 01:33
As17, давайте проект на пробу. И с данными как-то придумать бы, чтобы сгенерировать похоже и тоже попробовать потестить.

Цитата Сообщение от As17 Посмотреть сообщение
Такое чувство, что при чтении одного элемента массива одним потоком, данные из ВСЕГО массива для второго потока на какое-то время не доступны.
Чтение одного байта из 3 ГБ массива будет идти не быстро - его скорее всего не будет в кэше процессора, и использование 2 потоков этот процесс практически не ускорит.
В общем, давайте проект на пробу.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,683
Записей в блоге: 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 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
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 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
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,683
Записей в блоге: 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,683
Записей в блоге: 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,683
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru