Использование 2d-массива против массива производного типа в Fortran 90

Предполагая, что вам нужен список массивов, каждый из которых имеет одинаковый размер. Лучше ли с точки зрения производительности использовать 2D-массив:

integer, allocatable :: data(:,:)

или массив производных типов:

type test
    integer, allocatable :: content(:)
end type
type(test), allocatable :: data(:)

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


person alex_reader    schedule 12.08.2013    source источник


Ответы (2)


В общем, вы хотите использовать самую простую структуру данных, которая подходит для вашей задачи. Если двумерный прямоугольный массив удовлетворяет вашим потребностям — и подходит для огромного количества задач научных вычислений, для которых Fortran — хороший выбор, — тогда это тот выбор, который вам нужен.

Массив 2d будет непрерывным в памяти, что обычно ускоряет доступ к нему как из-за кэширования, так и из-за меньшего уровня косвенности; массив 2d также позволит вам делать такие вещи, как data = data * 2 или data = 0., которые подход массива массива не [Отредактировано для добавления: хотя, как указывает IanH в комментариях, вы можете создать определенный тип и определенные операции над те типы, которые разрешают это]. Эти преимущества настолько велики, что даже если у вас есть «неоднородные массивы», если диапазон ожидаемых длин строк не так велик, реализация его в виде прямоугольного массива 2d иногда является выбором, заслуживающим внимания.

person Jonathan Dursi    schedule 12.08.2013
comment
Рассмотрите возможности, предлагаемые определенными операциями в отношении вашего комментария об умножении и присваивании массивам. - person IanH; 13.08.2013
comment
Достаточно справедливо, но остается верным то, что использование встроенных 2d-массивов дает вам (а) более быстрое (б) возможно меньшее количество временных (например, d=a*b+c), (в) с одновременным разделением по обоим измерениям время, все (г) бесплатно. В некоторых случаях по-прежнему имеет смысл использовать массивы массивов, но если вам не нужна эта дополнительная общность, вероятно, имеет смысл использовать более простой случай. - person Jonathan Dursi; 13.08.2013

Выберите реализацию, которая сводит к минимуму концептуальное расстояние, на которое ваш разум должен прыгать между проблемой в вашей голове и решением в вашем коде. Сила этого подхода увеличивается с возрастом, как с возрастом вашего кода (хороший концептуальный дизайн является прочной основой для будущей разработки), так и с вашим собственным возрастом (чем меньше усилий требуется для понимания вашего кода, тем дольше вы будете оставаться умственно компетентными, чтобы понять его). Это).

Что касается не определяемой мнением части вашего вопроса о способе управления памятью... Мое наивное ожидание состоит в том, что большинство компиляторов в большинстве случаев будут выделять непрерывную память для первого из ваших набросков, а не для второй. Но меня это мало волнует, чтобы проверять, и я не думаю, что вам следует это делать. Этим я не предлагаю вам не интересоваться тем, что происходит под капотом, а скорее, что вы должны больше заботиться о вопросах, упомянутых в первом абзаце.

person High Performance Mark    schedule 12.08.2013
comment
+1 - чем больше я об этом думаю, минимизация концептуального расстояния, вероятно, важнее, чем какая-то абстрактная мера простейшего. - person Jonathan Dursi; 13.08.2013
comment
это точно! Вы должны найти баланс между читабельностью и производительностью... - person Girardi; 15.02.2014