Представление выделяемой памяти Fortran во внутренней памяти

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

Я понимаю, что это немного сложнее, чем необработанный указатель, поскольку форма и ранги также должны быть сохранены.

Я также предполагаю, что это зависит от реализации, поскольку я не нахожу информации в Стандарт Fortran 2003.

Однако я хотел бы знать, какие структуры используются для представления размещаемых массивов (даже для одного компилятора).

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


person Regis Portalez    schedule 24.02.2017    source источник


Ответы (1)


Выделяемые массивы, массивы указателей, а также предполагаемые аргументы массива форм обрабатываются с помощью дескриптора массива (также называемого вектором допуска).

У любого компилятора может быть своя структура дескриптора массива. Его можно найти в руководстве к компилятору. Но есть стандартизированный формат для дескриптора, который используется для связи с C (и, возможно, с другим программным обеспечением за пределами Fortran, которое может взаимодействовать с C.

Этот стандартный дескриптор не может использоваться компилятором внутри компании, но может. Если он используется также внутри, компилятору не нужно подготавливать новый дескриптор при вызове C-совместимой процедуры. Например, gfortran планирует, что стандартный дескриптор будет поддерживаться «предпочтительно в собственном формате» .

Пример дескриптора собственного массива, отличного от C-совместимого, описан Intel по адресу https://software.intel.com/en-us/node/678452.

Структура дескриптора массива для аргументов массива, совместимого с C, определена Технической спецификацией ISO / IEC TS 29113: 2012 о дальнейшей совместимости Fortran с C, которая должна стать частью Fortran 2015.

В заголовочном файле C ISO_Fortran_binding.h определяется структура C, которая определяется дескриптором Fortran (предполагаемая форма, указатель или размещаемый).

Выглядит это так (из веб-сайт IBM, некоторые детали могут зависеть от компилятора):

CFI_cdesc_t 
    A type definition that describes a C descriptor. It contains the following structure members:

void *base_addr
    The base address of the data object that is described. For deallocated allocatable objects, base_addr is NULL. 
size_t elem_len

        For scalars: The size in bytes of the data object that is described.
        For arrays: The size in bytes of one element of the array.

int version
    The version number of the C descriptor. Currently, the only valid value is available by using the CFI_VERSION macro.
CFI_attribute_t attribute
    The attribute code of the C descriptor. For the valid values for attribute, see Table 1.
CFI_type_t type
    The type code of the C descriptor. Describes the type of the object that is described by the C descriptor. For the valid values for type, see Table 2. 

CFI_rank_t rank
    The rank of the object that is described by the C descriptor. Its value must be in the range 0 ≤ rank ≤ CFI_MAX_RANK. A value of 0 indicates that the object is a scalar. Otherwise, the object is an array.
CFI_dim_t dim[]
    An array of size rank that describes the lower bound, extent, and stride of each dimension.

There is a reserved area between rank and dim. The size of the reserved area is 12 words in 32-bit mode and 9 words in 64-bit mode.

Указанные типы CFI_ также определены в заголовке ISO_Fortran_binding.h.

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

Однако будьте осторожны, gfortran, очень распространенный компилятор, еще не использует этот тип дескриптора. Существует только экспериментальная версия с новым дескриптором, а текущий дескриптор описан в руководстве.

person Vladimir F    schedule 24.02.2017
comment
Потрясающий. Спасибо - person Regis Portalez; 24.02.2017
comment
Для нового gfortran требуется обновленная общая библиотека, если вы ее попробуете. Эта библиотека может не отображаться автоматически по пути. - person tim18; 24.02.2017
comment
Ответ Владимира неверен. Дескриптор CFI относится только к определенным аргументам, переданным из Фортрана в совместимую (BIND (C)) подпрограмму. Это не обязательно отражает внутреннюю реализацию компилятора Фортрана. Кроме того, спецификация оставляет некоторые аспекты дескриптора C зависимыми от реализации. Единственное, на что вы можете положиться, это то, что если подпрограмма C получает один из них, макет указывается в CFI_CDESC_T в ISO_Fortran_binding.h, что может варьироваться в зависимости от реализации. Тем не менее, если вы общаетесь с C, это способ сделать Это. - person Steve Lionel; 26.02.2017