インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

共通ブロックの割り当て

[Q]dyncom オプションを使用して、ランタイム時に共通ブロックを動的に割り当てます。

このオプションは、共通ブロックを動的にするために指定します。データ領域はコンパイル時ではなくランタイム時に割り当てられます。ダイナミック共通ブロックの宣言を含む各ルーチンへの入口で、共通ブロックの領域が割り当てられているかどうかがチェックされます。ダイナミック共通ブロックがまだ割り当てられていない場合は、領域が割り当てられます。

macOS* で共通ブロックの動的割り当てを有効にするには、リンク時のオプション -undefined dynamic_lookup-dyncom を指定する必要があります。

次のコマンドラインは、ランタイム時に動的に割り当てられる共通ブロックの名前と、ダイナミック共用オプションを指定します。

ifort -dyncom "blk1,blk2,blk3" test.f ! Linux* および macOS*
ifort /Qdyncom"BLK1,BLK2,BLK3" test.f ! Windows*

BLK1BLK2、および BLK3 は、動的にする共通ブロックの名前です。

[Q]dyncom オプションの使用ガイドライン

次に、[Q]dyncom オプションを使用する場合に注意する必要のあるいくつかの制限を示します。

ダイナミック共通ブロックを使用する理由

ダイナミック共通ブロックを使用する主な理由は、独自の割り当てルーチンによって共通ブロックの割り当てが制御できるからです。独自の割り当てルーチンを使用するには、そのルーチンを Fortran ランタイム・ライブラリーの前にリンクする必要があります。

C 関数のプロトタイプ:

void _FTN_ALLOC(void **mem, int *size, char *name);

説明:

等価な Fortran INTERFACE 定義:

interface
subroutine my_ftn_alloc (mem, size, name) bind (C, name="_FTN_ALLOC")
    use, intrinsic                :: ISO_C_BINDING
    implicit none

    type(C_PTR),    intent(OUT)         :: mem
    integer(C_INT), intent(INOUT)       :: size
    character, dimension(*), intent(IN) :: name
end subroutine my_ftn_alloc
end interface

また、Fortran ランタイム関数 FOR__SET_FTN_ALLOC を用いて、独自の割り当てルーチンを使用することもできます。この手法は、共有ライブラリーを使用する場合に役立ちます。デフォルトのルーチン _FTN_ALLOC がオーバーライドされます。

ルーチン FOR__SET_FTN_ALLOC_FTN_ALLOC は、インテル® Xeon Phi™ プロセッサー上でネイティブ実行するアプリケーションでは動作しますが、

ホスト CPU とインテル® Xeon Phi™ プロセッサー間の境界を越えて動作しません。例えば、ホスト側のコードで FOR__SET_FTN_ALLOC を使用し、ほかのホスト側のコードで COMMON を割り当てることができます。これは、双方がインテル® Xeon Phi™ プロセッサー上で実行する場合も同じです。

ただし、ホスト上の割り当てルーチンを変更しても、インテル® MIC アーキテクチャー・ベースのプロセッサー上のルーチンは変更されません。また、その逆についても同じことがいえます。

ダイナミック共通ブロックへのメモリーの割り当て

ランタイム・ライブラリー・ルーチン f90_dyncom は、メモリー割り当てを実行します。コンパイラーは、ダイナミック共通ブロックを含むプログラム内の各ルーチンの開始時に、このルーチンを呼び出します。次に、このライブラリー・ルーチンが _FTN_ALLOC を呼び出して、メモリーを割り当てます。デフォルトでは、コンパイラーが、各ルーチンで宣言されたとおりの共通ブロックのサイズ (バイト数) を f90_dyncom に渡し、次にそのサイズが _FTN_ALLOC に渡ります。Fortarn ランタイム・ライブラリーには、単に要求されたバイト数を割り当てて返す _FTN_ALLOC のデフォルトのバージョンが含まれます。

別のルーチンにおいて異なるサイズで宣言された同じ名前の共通ブロックを持つ非標準の拡張を使用する場合、その共通ブロックの宣言を含むルーチンが呼び出される順序によっては、ランタイムエラーが発生する可能性があります。

また、独自のルーチンを作成し、共通ブロックを動的に割り当てることができます。これは、特にライブラリーを共有する場合に便利です。独自のルーチンを使用するには、ランタイム関数 FOR__SET_FTN_ALLOC を指定する必要があります。

関連情報