Комментарии 32
А вы сравнивали, какое ускорение дает MPI версия? Я не вчитывался в код, но кажется что объем обменов и вычислений одного порядка, не понятно, почему вы пишете что задача CPU bound. Использование Scatter / Gather в вашем случае скорее всего убивает всю производительность.
Пример для 3D не удачный - ППП не применяют для 3D, так как она теряет свойство безусловной устойчивости.
Уравнение теплопроводности с переменным коэффициентом записывается как
В вашем случае нарушается условие непрерывности теплового потока через поверхность где коэффициент теплопроводности меняется. Но численный метод у вас как раз для правильной формы записан.
Да, в данном случае ускорение бы дало использование SIMD.
Видимо, использование MPI было просто требованием к курсовой.
На самом деле и прогонку можно распараллелить с помощью MPI. Просто это делается не тривиально.
Вообще говоря, MPI на SMP системе не сильно проиграет. На том же самом алгоритме крупнозернистого распараллеливания (не трогаем векторизацию и пр). До тех пор, пока сообщение помещается в кеш. Насколько я помню, на SMP-узлах основные реализации MPI через mm используют общую память для передачи сообщений, и потому, до тех пор, пока это сообщение помещается в кеш, разницы нет практически.
То же самое можно написать интегральным тождеством. Построить ортогональную сетку, каждый четырехугольник согласованно с остальными разбить на два треугольника (с сохранением конформности), применить МКЭ на полилинейном базисе и получить то же самое.
Обнаружилось, что у таких оладьев серединка пропекается недостаточно, тесто там остается сырым
Хотелось свести объяснение к решению краевой задачи для обыкновенного дифференциального уравнения, но не получилось, а более сложные методы использовать было лень. Понятно, что решать нужно в цилиндрических координатах и что решения — это функции Бесселя. Понятно также, что теплопроводность у яблока и теста разная, хотя, возможно, даже без яблока серединка пропекается хуже, чем края
я думаю что это не только теплопроводность и теплоемкость, но и наличие избытка воды в яблоке. Вы не пробовали резать их на тонкие кольца, подсушивать, а потом печь оладьи из сушеных колец ?
у меня мама делает оладьи с яблоками - но она режет их на тонкие (почти прозрачные) дольки и перемешивает с тестом. тесто запекается отлично.
Или вам важно, чтобы они были именно такой формы ?
Кажется, что единственный вариант, при котором уравнение теплопроводности может объяснить эффект - это если температуропроводность яблок сильно выше температуропроводности теста. Тогда яблоко "втягивает" в себя линии тока тепла, прямо как ферромагнетик втягивает в себя линии напряженности магнитного поля.
Другая гипотеза - что яблоко представляет собой по большей части воду, из-за чего нагреть его выше 100С становится проблематично вплоть до состояния, когда большая часть воды испарится / свяжется с чем-то. А тесту такой температуры недостаточно для застывания, вот тесто вблизи яблок не пропекается.
Но возможно тут существенен еще переход теста из жидкого состояния в твердое с изменением физических характеристик, тогда это уже ближе к задаче Стефана.
Возможно, перенос тепла теплопроводностью сильно хуже переноса тепла конвекцией горячего воздуха вокруг оладьев, это могло бы объяснить, почему центр не пропекается. Но тогда яблоки совсем не при чем.
Осталось дело за малом и conjugate heat transfer можно будет решать. ;)
Сетка ортогональная? График сходимости не строили?
Вопрос, Вам нужно было задачу решить или написать что-то типа курсовой работы, диплома, etc.?
Данная задача не CPU-bound, а memory-bandwidth bound. И, частично, эта проблема может решаеться путем использования MPI и работе на нескольких кластерах. Однако, это не делает ее CPU-bound. Больший эффект при меньших ресурсах даст увеличение локальности данных и оптимизация порядка доступа в кэш\память.
Однако, если задачей было, распараллеливая через MPI, написать код для теплопроводности - отл.
В этой схеме расщепления по-хорошему, надо еще поитерировать на одном временном слое. Вообще, в докладах Нижегородского университета одно время часто возникала их метод распараллеливания прогонки (в том числе для блочно-диагональных матриц). Нашел ссылку на методичку. Стр. 13 http://www.unn.ru/pages/e-library/methodmaterial/files/9.pdf
for (int i = 0; i < length; ++i) { A[i] = - avg(lambda[i + 1], lambda[i]) / 2 * coefficient; B[i] = - avg(lambda[i + 1], lambda[i + 2]) / 2 * coefficient; C[i] = 1 / timeStep - A[i] - B[i]; }
Похоже у вас тут выход за пределы массива для двух последних i.
Это размажется по всей сетке, если NaN-ов не встретится ,)
Да и не все языки относятся выходу за пределы массива так же халатно, как C++.
это коэффициент температуропроводности, а не теплопроводности.
Задача теплопроводности методом продольно-поперечной прогонки средствами MPI