|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|||||||||||
Оптимизировать работу программы10.03.2025, 11:12. Показов 3716. Ответов 16
Можно ли сделать программу быстрее не меняя алгоритм вычисления? Я пробовал сделать ее быстрее, но тогда она считает неправильно, но сейчас она считает правильно, но параллельная программа медленнее обычной
0
|
|||||||||||
| 10.03.2025, 11:12 | |
|
Ответы с готовыми решениями:
16
Компиляция и запуск программ из mpi
Запуск программ mpi. Как посмотреть результат работы? |
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
|
| 10.03.2025, 11:32 | |
|
А чему равно N?
0
|
|
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|||||||
| 10.03.2025, 11:35 [ТС] | |||||||
|
датасеты находятся в adi.h
0
|
|||||||
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
|
| 10.03.2025, 11:44 | |
|
Проще говоря, у вас примерно квадратичный по размеру матриц алгоритм, в котором размер матрицы максимум 4000. Ну, в общем, я бы сказал, что в такой ситуации меньшая производительность MPI-версии вполне нормальна. За какое время на максимальном датасете отрабатывают и та, и другая?
0
|
|
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
||
| 10.03.2025, 12:04 [ТС] | ||
|
0
|
||
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
|||
| 10.03.2025, 12:27 | |||
|
Я, собственно, веду все это к очередному вредному вопросу: MPI вам реально нужен? В наличии есть кластер, на котором можно все это считать, причем потенциальная экономия времени окажется заведомо больше затрат на дополнительную отладку? Или это учебно-тренировочная задача?
0
|
|||
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|
| 10.03.2025, 12:51 [ТС] | |
|
Я отправлял эту задачу, но мне пришел более подробный ответ:
Смотрите, немного подробнее объясним задачу. У нас получается, такая задача. Стояла, была последовательная программа одисси, которая реализовывала некий математический алгоритм работы с матрицами. Решала эти матрицы и, соответственно, дела какой-то результат. Эта программа являлась эталоном этого алгоритма. То есть её решение необходимо считать заведомо правильным. 2 программа, которая, которую следует сделать, это параллельная версия этой программы, её необходима с помощью Реализовать это мы определили в тз, прописали. Вот как бы это этот момент у нас указан. И самая главная задача, о которой я говорил, необходимо, чтобы параллельная версия Выдавала тот же результат, что и последовательно, последовательно, менять нельзя. Последовательно. Это, по сути, я говорю, вот эталон, по которому нужно равняться. Параллельная версия может изменяться, но она должна представлять одно и то же решение с Последовательная версия, то есть результаты должны сходиться на одних и тех же параметрах. Вот в 1 случае у нас было недопонимание насчёт этого. Вот, ну как бы мы это разрешили с вами. Хорошо. Хорошо. Сейчас, смотрите, у нас вот этот керна лади метод, который, собственно, производит решение. Этой матрицы он представлен, да, он хорошо, но в нём как раз-таки есть загвоздка, его необходимо распараллелить. И вот там как раз-таки наблюдается эта зависимость по данных, о которых я описал. Вот необходимо вот с этим всем, с этой всей проблематикой как бы справиться и представить параллельную версию программы сейчас, просто на данный момент, что последовательно, что параллельная версия программы, ну, они, по сути, работают одинаково по времени. Никакого ощутимого ускорения не наблюдается при учёте того, что запускали на разном количестве ядер везде время одинаковое должно быть некое ускорение, которое реализована программа именно в этой, в этом методе карма лади, дабы вот эту работу циклов их распараллелить. Вот это вот основная задача. Что касается других методов, там, ну, возможно необходимо добавить распараллеливание, но тем не менее, они выполняют не столько ключевую роль и как бы не являются основным время затрачивающим методами. Вот поэтому больше нужно сейчас сконцентрироваться именно на 1 Методе термина. Вот по остальному программа, да, выдаёт одинаковое решение и все хорошо. Просто нужно доправить этот момент.
0
|
|
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
||
| 10.03.2025, 13:04 | ||
0
|
||
|
58 / 2 / 0
Регистрация: 24.03.2022
Сообщений: 104
|
|
| 10.03.2025, 13:07 [ТС] | |
|
Это голосовое сообщением, распознанное в виде текста. Как я понял, есть такой метод adi, который относится к численным методам, и основная задача распараллелить его и главное условие, чтобы обычная программа была медленнее, чем распараллеленная. Я вроде так и сделал, но время оставляет желать лучшего. Поэтому вопрос, можно ли улучшить его или все и так уже отлично?
0
|
|
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
||
| 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
|
|
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
|
| 10.03.2025, 14:16 | |
|
0
|
|
|
Просто Икс
691 / 233 / 47
Регистрация: 15.12.2009
Сообщений: 696
|
|
| 10.03.2025, 17:02 | |
|
Не по теме: Вы уж извините, но мимо такого пройти невозможно... :pardon: Добавлено через 7 минут А это уже по теме... P.P.S. И если говорить совсем откровенно: Это крайнее неуважение к присутствующим тут, к тем у кого Вы просите помощи.
1
|
|
|
2741 / 1667 / 269
Регистрация: 19.02.2010
Сообщений: 4,411
|
||
| 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
|
||
|
2326 / 1568 / 722
Регистрация: 17.03.2022
Сообщений: 5,064
|
|
| 11.03.2025, 11:33 | |
|
VTsaregorodtsev, все правильно, но можно, пожалуй, добавить еще пару слов.
Когда (и если) все это будет учтено, следующий шаг - использование более чем одного ядра, коих в нынешних процессорах много. Но это тоже не MPI, а что-нибудь вроде OpenMP. А дальше, если производительности все равно не хватит - графические ускорители, эта задача для них вполне подходит.
0
|
|
|
2741 / 1667 / 269
Регистрация: 19.02.2010
Сообщений: 4,411
|
||
| 11.03.2025, 15:14 | ||
|
Может показаться, что невозможность разделить тут матрицу на совершенно независимые блоки (см на паттерн доступа к элементам матрицы: и по строкам, и по столбцам) как-то помешает многопоточке. На самом деле же - потоки будут/могут синхронизировать обрабатываемые ими данные через общую память, т.е. синхронизировать данные они будут неявно = БЕЗ внешнего управления (управлять тут надо будет синхронизацией потоков - а не gathering'ом данных). Так что если правильно реализовать многопоточность (это я ТСу опять намекаю, что вижу-знаю, как тут надо действовать) - то эффект должен быть.
0
|
||
| 11.03.2025, 15:14 | |
|
Помогаю со студенческими работами здесь
17
Запуск MPI программ Работа с GPU Работа с OpenCL Работа с массивом с MPI C++ (есть код) Работа с OpenMP. Распараллеливание цикла for Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|