Поведение компонентов, когда структуры находятся в массиве - PullRequest
0 голосов
/ 13 июня 2018

В настоящее время я работаю над моделированием физической системы в Fortran90 с чем-то вроде 50 миллионов частиц.У каждого есть позиция x (для упрощения).

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

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

Итак, что делает компилятор для хранения атрибутов объекта?И тем более, как насчет случая с более чем одним атрибутом?

Спасибо, что уделили время.

1 Ответ

0 голосов
/ 13 июня 2018

В « как хранятся производные типы »:

Fortran Standard требует, чтобы компоненты типа последовательности были сохранены (в памяти) как последовательность смежныххранение, в порядке декларирования компонентов.Типы последовательностей - это типы, объявленные с оператором SEQUENCE, что подразумевает, что тип должен иметь хотя бы один компонент, каждый компонент должен иметь внутренний или последовательный тип, не должен быть параметризованным или расширяемым типом и не может иметь типпроцедуры.Если вы хотите, чтобы это поведение соответствовало вашему типу, сделайте его типом последовательности (вы можете принять во внимание выравнивание данных ).

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

Из Стандарта:

Структура разрешается в виде последовательности компонентов.Если структура не содержит оператора SEQUENCE, использование этой терминологии никоим образом не означает, что эти компоненты хранятся в этом или любом другом порядке.Нет также никаких требований, чтобы непрерывное хранение использовалось.Последовательность просто относится к тому факту, что при написании определений обязательно будет порядок, в котором появляются компоненты, и это будет определять последовательность компонентов.Этот порядок имеет ограниченное значение, потому что компонент объекта производного типа всегда будет доступен по имени компонента, за исключением следующих контекстов: последовательность выражений в конструкторе значений производного типа, внутреннее присваивание, значения данных во входном списке именданные и включение структуры в список ввода / вывода при форматированной передаче данных, где она расширяется до этой последовательности компонентов.При условии, что в этих случаях процессор придерживается определенного порядка, в противном случае он может свободно организовать хранение компонентов для любой непоследовательной структуры в памяти, наиболее подходящей для конкретной архитектуры.


Вкл« Быстрее ли иметь производный тип, чем независимые массивы »:

Как сказал в комментарии @VladmirF, его широкая тема во многом зависит от того, как вы получаете доступ к своим данным и используете их,и был задан вопрос и ответил раньше (Проверьте ссылки на свой комментарий).Вы можете найти много об этом вокруг ( link1 , link2 ), и я добавлю этот к "блокировке кэша", что может вас заинтересовать.

...