データ型とアライメントの設定

データのアライメントを考慮するべき変数には、次のものがあります:

最高のパフォーマンスを得るには、データを次のようにアライメントします。

アライメントされないデータの原因と自然なアライメントを行う方法

最適な性能を得るため、データが自然にアライメントされるように注意してください。自然境界とは、データ項目のサイズの倍数であるメモリアドレスのことです。例えば、自然境界上にアライメントされた REAL(KIND=8) のデータ項目は、8 の倍数のアドレスを持ちます。配列については、すべての要素がこのようにアライメントされているときに、配列がアライメントされているといいます。

開始アドレスが自然境界上にあるデータ項目は、「自然にアライメントされている」といいます。自然境界にアライメントされていないデータは「アライメントされていないデータ」と呼びます。

インテル® Fortran コンパイラは、可能ならば各データ項目を自然にアライメントしますが、一部の Fortran 文では、データがアライメントされないことがあります。

コマンドライン・オプション -align を使うと、データを自然にアライメントすることができますが、共通ブロック、派生型、レコード構造体中のデータ項目のデータ宣言を検証し、順序を変更することを検討してください。

次のような文は、アライメントされていないデータの原因となります。

共通ブロック、派生型構造体、またはレコード構造体中にアライメントされないデータが生じるのを防ぐには、次のいずれか、または両方の手段を取ってください。

アライメントされないデータが生じるその他の原因としては、アライメントされていない実引数や、派生型構造体またはレコード構造体を含む配列などがあります。

非効率的なアライメントされていないデータの検証

コンパイルの際に、インテル Fortran コンパイラは、できるだけ多くのデータを自然にアライメントします。アライメントされないデータが生じるような例外的な状況については、上記で説明しています。

アライメントされていないデータはランタイム性能を低下させる可能性があるので、次の対処策を取ることをお勧めします。

アライメントされていないデータをレポートするには、2 つの方法があります:

以下のランタイム・メッセージについて考えてみます:

Unaligned access pid=24821 <a.out> va=140000154, pc=3ff80805d60, ra=1200017bc

このメッセージでは次のことを示しています。

アライメントされないデータの発生を防ぐためのデータ宣言の順序

新規のプログラムや、ソースコードの宣言を簡単に変更できるプログラムでは、データ宣言の順序を慎重に計画し、共通ブロック、派生型構造体、レコード構造体、または EQUIVALENCE 文によって等価にされたデータ項目が自然にアライメントされるようにします。

アライメントされないデータの発生を防ぐには、次の規則を使用します。

データの宣言時、KIND パラメータを指定するなど、明示的に長さを宣言することを検討してください。例えば、INTEGER より INTEGER(KIND=4) (または INTEGER(4)) を指定します。デフォルトのサイズを使用する場合 (INTEGERLOGICALCOMPLEXREAL など)、-integer_size{16|32|64} -real_size{32|64|128} コンパイラ・オプションは、個々のフィールドのデータ宣言サイズを変更できることに注意してください。つまり、慎重に計画されたデータ宣言の順序のデータ・アライメントが変えられてしまう可能性があります。

データ宣言のガイドラインに従うことで、データを自然にアライメントさせるためのパディング・バイトを追加する -align keyword オプションの必要性を最小限に抑えることができます。-align keyword オプションが必要な場合でも、データ宣言のガイドラインに従うと、コンパイラが追加するパディング・バイト数を最小限に抑えることができます。

共通ブロック中のデータ項目の配置

common 文中のデータ項目の順序は、データ項目が格納される順を決定します。x という名前の共通ブロックが次のように宣言されているとします。

logical (kind=2) flag
integer          iarry_i(3)
character(len=5) name_ch
common /x/ flag, iarry_i(3), name_ch

図 1-1 に示すように、適切な Fortran コマンド・オプションを省略すると、共通ブロックには iarry_i の第 1 配列要素の先頭から、アライメントされていないデータ項目が含まれるようになります。

図 1-1 アライメントされていないデータを含む共通ブロック

図 1-2 に示すように、共通ブロックを使用しているプログラム・ユニットを -align commons オプションを付けてコンパイルすると、データ項目は自然にアライメントされます。

図 1-2 自然にアライメントされたデータを含む共通ブロック

共通ブロック x は、大きさが 32 ビット以下のデータ項目を含むため、-align commons オプションを指定するようにします。共通ブロックが 32 ビットよりも大きくなる可能性のあるデータ項目 (REAL (KIND=8) のデータなど) を含む場合、-align commons オプションを使用します。

共通ブロックデータを使用するソースファイルを簡単に変更できる場合は、COMMON 文中の数値変数をサイズの大きい順に定義して、文字変数を最後に置きます。これは、移植性を高め、パディングなしにデータ項目を自然にアライメントし、コマンドライン・オプション -align commons または -aligndcommons オプションを必要としません。

logical (kind=2) flag
integer          iarry_i(3)
character(len=5) name_ch
common /x/ iarry_i(3), flag, name_ch

図 1-3 に示すように、変数をサイズの大きい順に並べ、文字データを最後に置けば、データ項目は自然にアライメントされます。

図 1-3 自然にアライメントされるように並べ替えられたデータを含む共通ブロック

共通ブロックデータを使用するソースファイルをすべて変更または作成するときには、宣言に一貫性を持たせるために、共通ブロックデータ宣言を 1 つのモジュールにまとめることを検討してください。互換性の理由から共通ブロックが不要な場合 (ファイルへの格納や、Fortran 77 に使用する場合) には、共通ブロックを使わずに、データ宣言をモジュールに入れることができます。

派生型データのデータ項目のアライメント

共通ブロックと同様に、派生型構造体には複数のデータ項目が含まれることがあります。

派生型構造体中のデータ項目コンポーネントは、SEQUENCE 文と Fortran オプションの使用に関連するいくつかの例外を除いて、最大 64 ビットの境界上に自然にアライメントされます。例外については、「アライメント・オプション」を参照してください。

インテル Visual Fortran は、派生型データを、次のように値の線形な並びとして格納します。

次に示す例は、派生型 PART_DT の配列 CATALOG_SPRING の宣言です。

module data_defs
type part_dt
integer           identifier
real              weight
character(len=15) description
end type part_dt
type(part_dt) catalog_spring(30)
.
.
.
end module data_defs