LINUX.ORG.RU

фортран, вопрос производительности


0

1

имеется несколько real массивов в 1e6\div1e7x4 (набор векторов в 4-хмерном фазховом пространстве, (от сотни мегабайт, до гигабайта)), в программе нужно будет за каждую итерацию (их очень много) проводить преобразования этих векторов, некоторые из них удалять, добавлять новые. промежуточные результаты не сохраняются — то есть на каждом шаге итерации в памяти хранятся только предпоследнее и последнее состояние массивов.

что в таком случае предпочтительней, в плане удаления-добавления элементов — делать allocatable или как они там, массивы переменного размера, или же заранее зарезервировать под каждый массив побольше памяти и завести дополнительный integer/boolean переменный массив со списком индексов векторов, содержащих полезную информацию?

интересует максимальное быстродействие, на память посрать.

★★★★★

>на память посрать

Тогда очевидно: резервировать по максимуму

annulen ★★★★★
()

Если это та задача, о которой я думаю (PIC?), то во первых там дост. одного массива, во вторых на таких размерах данных это уже не массив (частицы располагаются в своия ячейках и по памяти в т.ч.), в третьих на таких размерах данных нужны как мин. локально-рекурсивные контейнеры ну и LRnLA алгоритмы в идеале. Со вторыми на фортране туго, а вот контейнер локально-рекурсивный сделать можно.

AIv ★★★★★
()
Ответ на: комментарий от thunar

Ну Вы посчитали на сетке поля, заряды, токи - двигайте себе частицы на здоровье. У частицы же меняется импульс и координата, зачем ее куда то при этом копировать? Расщепление же.

AIv ★★★★★
()
Ответ на: комментарий от AIv

нет, копировать никуда не нужно, просто 3 массива — для электронов, для ионов, для нейтралов.

а начальнео и конечное значение нужно же знать для моделирования столкновений в вероятность же входит exp(-l/(x1-x0))

thunar ★★★★★
() автор топика
Ответ на: комментарий от AIv

да та же. сайчас снова время появилось — колупаю её

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Но вот завести в каждой ячейке массив частиц к-е в ней находятся, а не хранить все одним куском необходимо. Если все лежит в общем массиве очень плохая локальность данных (частицы относящиеся к одной ячейки размазаны по всей памяти) -> при расчете значений на сетке теряется производительность.

AIv ★★★★★
()
Ответ на: комментарий от thunar

Жуть какая... ну либо эту величину считать при смещении частицы, либо хранить внутри одной частицы начальное и конечное значение координаты.

Основная аксиома всей этой кухни - данные должны быть локальны.

AIv ★★★★★
()
Ответ на: комментарий от AIv

аа, ну понял я. тогда да так и сделаю, а то у меня на раскидывание заряда больше всего времени тратится.

thunar ★★★★★
() автор топика
Ответ на: комментарий от AIv

ага, то есть ФРЭ должна быть вроде как:

F=( (данные в первой ячейке(r1,v1),(r2,v2)...), данные во второй ячейке ((r1,v1),(r2,v2))

то есть N*Nparts*4, где N — число узов, а Nparts - -максимальная оценка кол-ва частиц в узле.

так?

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Это как бы не все. Традиционные двумерные массивы (эмуляция двумерного массива на основе одномерного) очень неэффективны - ближайшие соседи по одному из направлений очень далеко лежат в памяти. Гораздо лучше локально-рекурсивные контейнеры. При этом размер области квадрат со сторонами равными степени двойки, но зато производительность вырастает весьма значительно. Ближайший аналог такого контейнера в 2D случае - четверичные деревья с одинаковой длиной ветвей (данные лежат на листьях).

AIv ★★★★★
()
Ответ на: комментарий от thunar

О_О? Такого размера? Ну тогда локальная рекурсивность данных Вам ненужна. Но можете попробовать запилить LRnLA алгоритм, он в ожномерном случае довольно простой.

AIv ★★★★★
()
Ответ на: комментарий от AIv

это верхняя оценка, скажем так максимальаня точност, на деле скорее всего на порядок-полтора поменьше будет.

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

попробуйте LRnLA таки сделать, в одномерном случае на фортране это гипотетически возможно ИМНО. Производительность должна вырости кардинально.

AIv ★★★★★
()
Ответ на: комментарий от AIv

просто наши теоретики оченоь уж не любят характерные для PIC тепловые флуктуации, если их увидят — хрен им что докажешь, поэтому хочу заложить сразу хорошую точность, хотя бы для демонстрации. поиск неустойчивости уже на меньшей точности искать буду — мне всё таки главное тенденцию и качественную картинку раскрыть, а не реальный ускоритель смоделмироватью.

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

попробую вообще говоря, идея понятна, но надо сидеть с блокнотом и рисовать-рисовать-рисовать, пока не въеду

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Да там все просто, сейчас появилась новая сильно упрощенная версия, но она пока не описана. Ну это... приходи к нам на чаек, расскажем;-) А ты нам о столкновениях.

AIv ★★★★★
()
Ответ на: комментарий от AIv

могу заглянуть только после 15го чила — готовлю доклад на propulsion2012 по переходным процессам в момент зажигания холловского разряда.

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Дык и у нас сейчас всяко-разно... ну в общем имей ввиду, как чего - стучися.

AIv ★★★★★
()

Размещение массива — дорогая операция. Число вызовов allocate-ов нужно делать по-минимуму.

gene
()
Ответ на: комментарий от AIv

Ой, столкновения в PIC — это совсем не тривиально. Особенно если есть внешние переменные поля (а они обычно есть) и размах осцилляций превышает или сравним с размером ячейки.

abalakin ★★
()
Ответ на: комментарий от abalakin

да, но в моей задачи частота столкновений много много меньше плазменной частоты, так что столкновения можно честно присать как малые поправки к функции распределения

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

> да, но в моей задачи частота столкновений много много меньше плазменной частоты, так что столкновения можно честно присать как малые поправки к функции распределения

Если столкновения считаются по известному оператору (например, Ландау), то да. Тут только вопрос в его применимости. Но в случае PIC и молекулярной динамики «небрежность» в расчетах приводит, как правило, к _существенному_ занижению роли столкновений. Исключением является случай плотной (не прозрачной) плазмы. Если надо, то могу дать ссылки на статьи.

abalakin ★★
()
Ответ на: комментарий от abalakin

да, дай пожалуйста. про занижение не слышал — интересно было бы почитать.

//тфу, в формуле ошибка, перевернуть надо дробь под экспонентой.

thunar ★★★★★
() автор топика
Ответ на: комментарий от abalakin

насколько я понял из всей литературы, то обычно метод таков - -сначала расчитываются вероятности, про формуле P=1-exp(-(x1-x0)/lambda)), далее выкидывается случайное число R, и если R<P, то считаем столкновение состоявшимся, а дальше аналогично считаем вероятность угла рассеяния. Для ион-нейтралов всё достаточно просто и по известным формулам рассчитывается энергия выбитого электрона, а ближайший атом заменяется на ион той же скорости. Для кулоновских там сложнее — надо думать какой второй электрон будет учавствовать в парном столкновении.

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

С нейтралами так можно поступать, с некоторой оговоркой электрон-электронные и ион-ионные столкновения так можно считать. А вот с электрон-ионными (притягивающий плохо-локализованный потенциал) нельзя. См. например ЖЭТФ, 115, 463 (1999), Phys. Plasmas, 8, 2502 (2001), Phys. Plasmas, 10, 3385 (2003), Computer Physics Communications, 164, 46 (2004), Phys. Plasmas, 13, 103108 (2006) и т.д. С численной точки зрения лучше смотреть Comp.Phys.Comm.

abalakin ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.