58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|||||||||||
Оптимизировать работу программы10.03.2025, 11:12. Показов 1384. Ответов 16
Можно ли сделать программу быстрее не меняя алгоритм вычисления? Я пробовал сделать ее быстрее, но тогда она считает неправильно, но сейчас она считает правильно, но параллельная программа медленнее обычной
0
|
10.03.2025, 11:12 | |
Ответы с готовыми решениями:
16
Компиляция и запуск программ из mpi
Запуск программ mpi. Как посмотреть результат работы? |
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|||||||
10.03.2025, 11:35 [ТС] | |||||||
датасеты находятся в adi.h
0
|
![]() 2101 / 1347 / 651
Регистрация: 17.03.2022
Сообщений: 4,246
|
|
10.03.2025, 11:44 | |
Проще говоря, у вас примерно квадратичный по размеру матриц алгоритм, в котором размер матрицы максимум 4000. Ну, в общем, я бы сказал, что в такой ситуации меньшая производительность MPI-версии вполне нормальна. За какое время на максимальном датасете отрабатывают и та, и другая?
0
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
||
10.03.2025, 12:04 [ТС] | ||
0
|
![]() 2101 / 1347 / 651
Регистрация: 17.03.2022
Сообщений: 4,246
|
|||
10.03.2025, 12:27 | |||
Я, собственно, веду все это к очередному вредному вопросу: MPI вам реально нужен? В наличии есть кластер, на котором можно все это считать, причем потенциальная экономия времени окажется заведомо больше затрат на дополнительную отладку? Или это учебно-тренировочная задача?
0
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|
10.03.2025, 12:51 [ТС] | |
Я отправлял эту задачу, но мне пришел более подробный ответ:
Смотрите, немного подробнее объясним задачу. У нас получается, такая задача. Стояла, была последовательная программа одисси, которая реализовывала некий математический алгоритм работы с матрицами. Решала эти матрицы и, соответственно, дела какой-то результат. Эта программа являлась эталоном этого алгоритма. То есть её решение необходимо считать заведомо правильным. 2 программа, которая, которую следует сделать, это параллельная версия этой программы, её необходима с помощью Реализовать это мы определили в тз, прописали. Вот как бы это этот момент у нас указан. И самая главная задача, о которой я говорил, необходимо, чтобы параллельная версия Выдавала тот же результат, что и последовательно, последовательно, менять нельзя. Последовательно. Это, по сути, я говорю, вот эталон, по которому нужно равняться. Параллельная версия может изменяться, но она должна представлять одно и то же решение с Последовательная версия, то есть результаты должны сходиться на одних и тех же параметрах. Вот в 1 случае у нас было недопонимание насчёт этого. Вот, ну как бы мы это разрешили с вами. Хорошо. Хорошо. Сейчас, смотрите, у нас вот этот керна лади метод, который, собственно, производит решение. Этой матрицы он представлен, да, он хорошо, но в нём как раз-таки есть загвоздка, его необходимо распараллелить. И вот там как раз-таки наблюдается эта зависимость по данных, о которых я описал. Вот необходимо вот с этим всем, с этой всей проблематикой как бы справиться и представить параллельную версию программы сейчас, просто на данный момент, что последовательно, что параллельная версия программы, ну, они, по сути, работают одинаково по времени. Никакого ощутимого ускорения не наблюдается при учёте того, что запускали на разном количестве ядер везде время одинаковое должно быть некое ускорение, которое реализована программа именно в этой, в этом методе карма лади, дабы вот эту работу циклов их распараллелить. Вот это вот основная задача. Что касается других методов, там, ну, возможно необходимо добавить распараллеливание, но тем не менее, они выполняют не столько ключевую роль и как бы не являются основным время затрачивающим методами. Вот поэтому больше нужно сейчас сконцентрироваться именно на 1 Методе термина. Вот по остальному программа, да, выдаёт одинаковое решение и все хорошо. Просто нужно доправить этот момент.
0
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|
10.03.2025, 13:07 [ТС] | |
Это голосовое сообщением, распознанное в виде текста. Как я понял, есть такой метод adi, который относится к численным методам, и основная задача распараллелить его и главное условие, чтобы обычная программа была медленнее, чем распараллеленная. Я вроде так и сделал, но время оставляет желать лучшего. Поэтому вопрос, можно ли улучшить его или все и так уже отлично?
0
|
![]() 2101 / 1347 / 651
Регистрация: 17.03.2022
Сообщений: 4,246
|
||
10.03.2025, 14:03 | ||
По названию можно предположить, что это должен быть неявный метод переменных направлений, но по коду я это не вижу.
0
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|
10.03.2025, 14:14 [ТС] | |
Если использовать определения чатика по программе, то он дает это
Этот код представляет собой параллельную реализацию алгоритма ADI (Alternating Direction Implicit method) с использованием MPI (Message Passing Interface) для решения системы уравнений. ADI метод используется для численного решения многомерных дифференциальных уравнений в частных производных, таких как уравнения теплопроводности или диффузии. ### Основные этапы работы кода: 1. **Инициализация и распределение данных:** - Код распределяет строки матриц `X`, `A`, и `B` между процессами. Каждый процесс обрабатывает свою часть строк (chunk) матриц. - `rank` — это идентификатор текущего процесса, а `size` — общее количество процессов. - `start_row` и `end_row` определяют диапазон строк, которые обрабатывает текущий процесс. 2. **Этап 1: Обновление `X` и `B` по строкам:** - В этом этапе происходит обновление значений матриц `X` и `B` по строкам. Каждый процесс обновляет только свои строки 3. **Синхронизация данных:** - После обновления строк происходит синхронизация данных между всеми процессами с помощью `MPI_Allgather`. Это необходимо, чтобы все процессы имели актуальные данные для дальнейших вычислений. 4. **Этап 2: Нормализация последнего столбца `X`:** - В этом этапе происходит нормализация последнего столбца матрицы `X`: 5. **Этап 3: Обратное обновление `X`:** - В этом этапе происходит обратное обновление значений матрицы `X`: 6. **Этап 4: Обновление `X` и `B` по столбцам:** - В этом этапе происходит обновление значений матриц `X` и `B` по столбцам: 7. **Этап 5: Нормализация последней строки `X`:** - В этом этапе только последний процесс (с `rank == size - 1`) нормализует последнюю строку матрицы `X`: 8. **Этап 6: Обратное обновление `X` по строкам:** - В этом этапе происходит обратное обновление значений матрицы `X` по строкам: 9. **Цикл по времени:** - Весь процесс повторяется для каждого временного шага `t` в пределах `_PB_TSTEPS`. ### Основные моменты: - Код использует MPI для параллельного выполнения, что позволяет ускорить вычисления за счет распределения работы между несколькими процессами. - Синхронизация данных между процессами происходит после каждого этапа, чтобы все процессы имели актуальные данные для дальнейших вычислений. - Код предполагает, что матрицы `X`, `A`, и `B` имеют размер `N x N`. ### Замечания: - В коде используются макросы `_PB_TSTEPS` и `_PB_N`, которые должны быть определены где-то в коде или переданы как параметры. - Тип данных `DATA_TYPE` должен быть определен, например, как `double` или `float`. Этот код является примером того, как можно параллельно решать сложные системы уравнений с использованием метода ADI и MPI.
0
|
Asm/C++/Delphi/Py/PHP/VBA
![]() |
|
10.03.2025, 16:33 | |
Pphantom, меня терзают смутные сомнения, что ТС написал этот код сам
![]()
1
|
Просто Икс
![]() 691 / 233 / 47
Регистрация: 15.12.2009
Сообщений: 696
|
|
10.03.2025, 17:02 | |
Не по теме: Вы уж извините, но мимо такого пройти невозможно... :pardon: Добавлено через 7 минут А это уже по теме... P.P.S. И если говорить совсем откровенно: Это крайнее неуважение к присутствующим тут, к тем у кого Вы просите помощи.
1
|
1672 / 1568 / 261
Регистрация: 19.02.2010
Сообщений: 4,171
|
||
11.03.2025, 11:01 | ||
Надо в первую очередь переписать этот говнокод, не обеспечивающий нормального кэширования данных. Ибо сейчас код тормозит не о вычисления - а о постоянный обмен с памятью. Понятно, что 3 дабл-матрицы 4000*4000 (т.е. суммарно на 384МБ) ни в какой кэш не влезут. Но использование L1- (для мелких матриц) и L2-кэшей (для средних-больших матриц) ядра улучшить у однопоточной проги можно. Смотрим-анализируем дальше, на примере матриц 4000*4000. Берём все 4 сдвоенных цикла (на этапы 2 и 5 обработок последнего столбца и последней строки можно не глядеть - они добавляют копейки) - имеем в них суммарно 18 арифметических команд (для плавающей точки) на элемент [i][j] матриц, независимо от числа этих матриц. Ну и перемножаем: 4000*4000*18*100(внешних итераций)=28 800 000 000 арифметических плавучих операций, предполагая, что вся целочисленка (вычисление индексов/адресов) и чтение-запись данных выполняются другими исполнительными блоками ядра (а это так и есть). Итоговая цифра оч.удобно ложится на 28сек времени выполнения. При частоте ядра 4ГГц (условно) - имеем по 4 такта ядра на одну плавучую арифм.операцию. Но, например, интеловское ядро начиная с 6ого поколения - может по паре операций умножения/вычитания за такт делать. И не просто скалярные операции оно может делать - а векторные, обрабатывая по 2 (SSE) и 4 (AVX) дабла одной командой. Т.е. имеем сейчас счёт на скорости в 1/16 или 1/32 от потенциальной пиковой производительности ядра для даблов. Понятно, что пик никогда достигнут не будет. И есть ещё медленные деления. Но в коде же есть "общие множители", которых я из числа 18 отдельных команд не искючал. Т.е. тут лимиты и ещё неучтённые возможности во многом взаимно компенсируются - и всё равно можно итожить, что неиспользование кэширования и, возможно, не сделанная компилятором векторизация (а компилятору её легко будет сделать только для этапов 4-6) тормозят прогу в 1-2-3 ДЕСЯТКА раз. Так что я бы ещё поглядел и ассемблерный выхлоп компилятора, чтобы понять, сколько проигрывается от отсутствия (или от недостаточно полной) автоматической векторизации. И, м.б., переписал бы переделанный (под улучшение кэширования) сишный код kernel_adi() на ассемблере - именно для максимально эффективного задействования векторизации математики. Но это я - я и неоптимальности машинного кода вижу/увижу, и переписать смогу. А MPI тут нафиг не нужен.
1
|
![]() 2101 / 1347 / 651
Регистрация: 17.03.2022
Сообщений: 4,246
|
|
11.03.2025, 11:33 | |
VTsaregorodtsev, все правильно, но можно, пожалуй, добавить еще пару слов.
Когда (и если) все это будет учтено, следующий шаг - использование более чем одного ядра, коих в нынешних процессорах много. Но это тоже не MPI, а что-нибудь вроде OpenMP. А дальше, если производительности все равно не хватит - графические ускорители, эта задача для них вполне подходит.
0
|
1672 / 1568 / 261
Регистрация: 19.02.2010
Сообщений: 4,171
|
||
11.03.2025, 15:14 | ||
Может показаться, что невозможность разделить тут матрицу на совершенно независимые блоки (см на паттерн доступа к элементам матрицы: и по строкам, и по столбцам) как-то помешает многопоточке. На самом деле же - потоки будут/могут синхронизировать обрабатываемые ими данные через общую память, т.е. синхронизировать данные они будут неявно = БЕЗ внешнего управления (управлять тут надо будет синхронизацией потоков - а не gathering'ом данных). Так что если правильно реализовать многопоточность (это я ТСу опять намекаю, что вижу-знаю, как тут надо действовать) - то эффект должен быть.
0
|
11.03.2025, 15:14 | |
Помогаю со студенческими работами здесь
17
Запуск MPI программ Работа с GPU Работа с OpenCL Работа с массивом с MPI C++ (есть код) Работа с OpenMP. Распараллеливание цикла for Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
|
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
|
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
|
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг.
Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя.
Странные серые краски проникают и. . .
|
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
|
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
|
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
|
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
|
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
|
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
|