Windows 版 PGI コンパイラの使用法特集(1)

PGI Visual Fortran 製品を使う

対象 Windows用コンパイラ、シェル操作、Visual Studio、Visual Fortran

 PGIコンパイラ製品の中で Windows® 版のコンパイラ製品は、二種類あります。Fortran/C/C++ 言語を完備する PGI Workstation/Server 製品シリーズの中の「Windows版」と、Fortran のみの製品となりますが Microsoft® Visual Studio にプラグインすることができる PGI Visual Fortran(「PVF」と言う。)の二つです。PGI 10.9(2010年9月)より、Fortran 言語を含んだ PGI Workstation/Server 製品(Windows版のみ)PGI Visual Fortran 製品の使用権もバンドルされ二つの使用インタフェースを使用して、Fortran コンパイラを利用できます。従来、PGI Workstation/Server シリーズの製品は、Linux版や OS X版と同じ bash シェルのコマンド・インタフェースで使用できるのみでしたが、PVF ソフトウェアも併用可能となり、Microsoft® Visual Studio 上で Fortran コンパイラを利用できます。1台のPC上で、この二つのインタフェースを併用できるため、コンパイラの操作性の自由度を高めます。これから何回かに分けて、Windows版のコンパイラの様々な使用法に関して、その操作法を含めてご紹介することにします。
2010年11月12日 Copyright © 株式会社ソフテック 加藤

(2018年9月1日)PVFソフトウェアの新規提供は終息しました。Windows 版にバンドルしていた Visual Studio 統合化可能な PGI Visual Fortran(PVF) に関しまして、新規販売としてのソフトウェアの提供は、2018年9月1日以降、行われません。(PVF ソフトウェア内部の Visual Studio にプラグインするモジュールソフトウェアの開発を終息しました。)

Windows版 PGI Workstation 製品と PGI Visual Fortran 製品の概要

 Windows版の「PGI Workstation製品」と「PGI Visual Fortran 製品」の概要については、以下のリンク先のページにて説明しております。

実際に、二つのPGIコンパイラ・ソフトウェアを使って見よう

 ここでは、実際のアプリケーションを使用して、ポーティング方法も含めて、PGIコンパイラの使用法について説明します。使用する題材は、米国地質調査所(USGS)が開発している、地下水流動モデルと輸送モデルとして有名な パブリックドメイン・ソフトウェア SEAWAT v.4 です。従来から広範に使用されている、MODFLOW、MT3DMSのソフトウェアを統合したこのプログラムは、FortranとC言語が混在したアプリケーションです。従って、PGI の Cコンパイラあるいは Microsoft® Visual C++ コンパイラで作成した C ルーチンのオブジェクトと Fortran ルーチンオブジェクトをビルドして実行モジュールを作成する方法も説明します。本稿では、(1) Visual C++ 環境を含む PGI Visual Fortran で開発環境を作成して、ポーティングする方法を説明します。次稿では、(2) PGI Fortran/C/C++ Workstation 製品を使用しての方法を説明します。

 ダウンロードしたアーカイブは、SEAWAT Version 4.00.03 program (updated September 22, 2009)で、swt_v4_00_03.zip と言うファイルです。これを、Windows上の任意のフォルダ配下に展開します。私の場合は、C ドライブの C:\PGI\SEAEWAT4 と言うフォルダを作成し、その配下に展開しました。展開されたファイルは、この配下に置かれ、その時に swt_v4_00_03 と言うトップのフォルダが作成されます。

実装場所

 C:\PGI\SEAEWAT4\swt_v4_00_03 と言うフォルダ配下に、SWEWAT パッケージの各フォルダが存在します。この中に、ソースプログラムが含まれた sources と言うフォルダも存在します。これと横並びで、Visual Studio 用のソリューション/プロジェクトを保存するために「projects」と言うフォルダを新設しておきます。

最初に、Microsoft® Visual Studio上で、PGI Visual Fortran (PVF)を使ってみる

 Visual Studio上に Fortranソースと C ソースの配置を行います。Fortran と C 言語が混在する場合は、「一つのソリューション」の中に、Fortran 用のプロジェクトと C 用のプロジェクトの二つを作成し、別々に管理します。Visual Studio上では、Fortran と C のプログラムを一つのプロジェクト内に混在することはできません。最初に、PVF で一つのソリューションを新設し、同時に Fortran ソース用の「空(empty)プロジェクト」を作ります。そのプロジェクト内に、既存の SEAWAT の Fortran ソースを配置を行います。

プロジェクト内にFortran ソースを配置する

 Visual Studio を起動します。今回は、64ビットWindows Vista上で 64bit(Win64) のアプリケーションを作成することにします(なお、32ビットWinodws 上では Win64 用のアプリケーションは作成できません)。既存のソースファイルを後で追加しますので、64ビットの Empty Project を選択してプロジェクトの器を作成します。その際に「プロジェクト名」、「保存する場所」、「ソリューション名」を定義します。ここでの「プロジェクト名」は、Fortran 用のプロジェクト名の定義をしますが、「ソリューション名」と同一とします。

新プロジェクト

 「SEAWAT403」と言うPVF用のプロジェクトが作成されました。その Source Files のフォルダには何も入っていませんので、この中に既存の別の場所に存在するソースファイルを配置するための手続きを行います。 Source Files をドラッグし、右ボタンをクリック、「追加」-->「既存の項目」を選択します。この操作は、別の場所に存在するファイルをこのプロジェクトで使用すると言う操作です。

既存項目追加

 既存のFortran ソースファイル(今回は、C:\PGI\SEAEWAT4\swt_v4_00_03\source内の *.f、*.f90ソース)を選択して「追加」ボタンを押します。以下のように、プロジェクト内にファイルが追加されます。

include追加

 次に、include ファイルがある場合は、そのファイルもこのプロジェクトに追加します。「Include Files」フォルダに対して、上記のソースファイルの追加と同じ操作法で、既存の Include ファイルを追加します。SEAWAT の場合は、*.inc と *.com と言うファイルが、インクルードするファイルとして用意されています。これらを取り込みます。以上で、SEAWAT の Fortran 関連のソースファイル等が登録されました。

include追加

include追加

 結果として、Fortran プロジェクト(SEAWAT403)は以下のような状態として見えます。

Fortranプロジェクトの状態

Visual Studio 上で SEAWAT の C プログラムを別のプロジェクトとして登録する

 SEAWATは、Fortran と C の混在プログラムのため、C のルーチン群を同じ SEAWAT403 ソリューション配下の別のプロジェクトとして登録します。上記、Fortran プロジェクトの登録後、この状態で再度、新しいプロジェクトの作成を行います。Visual C++ のプロジェクトでは、64ビット用の Win64 のテンプレートが明示されないため、ここでは、「Win32 コンソールアプリ」を選択します。後で、Visual Studio の構成マネージャで、64ビット Win64モードの構成を追加できます。C ルーチンの方のプロジェクトをここでは、「SWT-C」と言う名前で登録します。また、このプロジェクトの「ソリューション」は、Fortranプロジェクトのものと同じとするため、必ず、「ソリューションに追加」を選択します。

Cプロジェクトの新設

 次に、C のアプリケーション・ウィザードが現れ、どの形態のCアプリケーションを作成するかを尋ねてきますので、スタティック・ライブラリとして生成することを選びます。SEAWAT 内の C プログラムはメインプログラムではありません。Fortran の補助ルーチンの扱いですので、Windowsの(スタティック)ライブラリとして作成します。以上で完了を押すと、Visual Studio の「ソリューションエクスプローラ」の中に、Fortran プロジェクトと並び、SWT-C と言うプロジェクトが作成されます。

Cプロジェクトの追加

 この SWT-C プロジェクトの Source Files の中に、ソースプログラムを追加します。上記の Fortran ソースの追加方法と全く同じ方法で行います。Source Files をドラッグし、右ボタンをクリック、「追加」-->「既存の項目」を選択します。既存の SEAWAT のソースが置かれている C:\PGI\SEAEWAT4\swt_v4_00_03\source を指定して、その中の C プログラムだけを検索 (*.C) すると、以下のような画面となります。ここで、C ソースを選択して追加します。さらに、既存項目の追加操作を再度行い、Cプログラムのヘッダーファイル *.h も追加します。以上の操作で、C プログラムに関係する既存ファイルの登録(Visual Studio への追加)が終わりました。

Cルーチンの追加

ヘッダーの追加

(ご注意)上記のように、別フォルダー上に Fortran と C のソースファイルが存在している場合、Visual Studio 上では、「既存項目の追加」の方法で、既存ソースファイルを Visual Studio 上のプロジェクトに追加します。このような形式の場合、既存のソースファイルが、Visual Studio 管理下のプロジェクト・フォルダーにコピーされるわけではありません。あくまでも、Visual Studio 上から「既存場所のソースファイル」が使用され、変更・保存等が行われます。

プログラムの SWT-C プロジェクトの Visual C++ プロパティの設定

64bit Win64用の x64 プラットフォーム項目を作成

 Visual C++の新規プロジェクトの作成において、Visual Studio 2008 standard では、そのテンプレートが win32 用しか用意されていないため、とりあえず、win32 用のものとして上記の C のプロジェクト(SWT-C)は作成してあります。これを基に、新たに win64 用のプロジェクトを作成します。以下のように、ソリューション エクスプロア内の SWT-C プロジェクト名をドラッグ(選択)します。

構成マネージャを開く

 構成マネージャを開くと、SWT-C には、x64プラットフォームが登録されていません。そこで、新規に作成します。「プラットフォーム」のプルダウンを開き、新規作成を選びます。「新しいプロジェクト プラットフォーム」の画面が開きます。ここで、「新しいプラットフォーム」に x64 が現れますので、win32 からコピーすると言う形で OK を押します。(ここでは、新しいソリューション プラットフォームは作成しないでください)以上で、C 言語 の x64 用のプラットフォーム設定が終了します。

構成マネージャ設定

Visual C++ 用のプロパティの設定

 C ルーチン群はライブラリとして作成し、メインプログラムを有する Fortran プログラムのビルドの時にリンクする形をとります。従って、今回は、スタティックライブラリ(*.lib) の形式のオブジェクトを作成するようにします。すでに、Win32 用の SWT-C のプロジェクトを作成したときに、「ライブラリ形式の作成」を選択していますので、そのイメージをコピーして作った x64 用のデフォルトのプロパティもライブラリを作成するモードとなっています。今回のビルドの「構成」は、「Release」モードで作成します。以下に、プロパティの設定時に、変更あるいは確認が必要な部分を列挙し、図示します。以下に従って、変更して下さい。

全般

 プリプロセッサの設定。プログラムに依存した、プリプロセッサへの定義がある場合は、ここに定義します。SEAWAT では、C ルーチンを Fortran とリンクするためにシンボル名変換(MF2KGMG.h)を行っており、Fortran 型シンボル名に変換するため、以下の _UF の定義でプリプロセスを行います。

/* Append underscore to functions called from FORTRAN GMG interface */
#ifdef _UF
#define MF2KGMG_ALLOCATE   mf2kgmg_allocate_
#define MF2KGMG_FREE       mf2kgmg_free_
#define MF2KGMG_ASSEMBLE   mf2kgmg_assemble_
#define MF2KGMG_EVAL       mf2kgmg_eval_
#define MF2KGMG_UPDATE     mf2kgmg_update_
#define MF2KGMG_BIGR       mf2kgmg_bigr_
#define MF2KGMG_BIGH       mf2kgmg_bigh_
#endif

プリプロセッサ

 コード生成のプロパティ、ランタイムライブラリは、静的なモードを指定します。

ランタイム

 コンパイル言語の種別を指定する。今回は C プログラムです。

言語

 最後に、重要な設定を行います。作成するCのライブラリの保存場所の設定を行います。これは、「ライブラリアン」-「全般」の出力ファイルの指定で行います。どこに保存されるかは、Visual Studio のマクロの意味を理解するか、あるいは、明示的に自分の都合の良い場所を指定するか、どちらでも良いですので、保存場所だけは意識的に設定して下さい。(よくあるリンク時の問題は、この保存場所が、Fortran プロジェクトのプロパティ上で設定されていないことです。)以上で、主だった C 関係のプロジェクトのプロパティの設定は終わりです。

言語

Fortranの SEAWAT403 プロジェクトの PGI Visual Fortran プロパティの設定

PVFのコンパイル条件の設定(プロパティ設定)

 次に、Fortran のプロジェクトの設定を行います。以下のように、ソリューション エクスプロア内の SEAWAT403 プロジェクト名をドラッグ(選択)します。その後、プルダウンメニューの「プロジェクト」->「プロパティ」をクリックします。

構成マネージャを開く

 SEAWAT403のプロパティ設定画面が現れます。ここで、「構成」を Release モードとします。PVFのコンパイル、リンクの設定画面は以下のように見えますが、特別の設定が無い場合はデフォルトのままでコンパイルして結構です。ただ、今回は、特殊な設定がありますので、その設定を行います。

構成マネージャ設定

 特殊な設定の前に、コンパイル時の最適化等のメッセージを出力するためのフラグをアクティブにしておきましょう。これは、Diagnostics を選び、コンパイル時の出力メッセージの種類を決め、その出力の Yes/No を設定します。私の場合は、以下の三つの情報はいつも出力するようにしています。

全般

32bitアプリケーション作成の場合の PVF の場合の特殊な設定 ( 重 要 事 項 : win32 の場合のみ )

 ここでの例題は、64ビット版のアプリケーションの作成で話を進めていますが、もし、32ビット版のアプリケーションを作成する際は、必ず、ある「おまじない」が必要です。これは、Fortran と C が混在している場合だけでなく、Fortran のライブラリ・ファイルを別に作り、これを Fortran の本体プログラムにリンクして使う場合にも必ず必要です。すなわち、外部関数(外部ファイルの中の関数)との間で引数を使ってデータの送受がある場合、その呼び出し規約を統一しておく必要があります。Windows の 32ビットの世界では、外部関数に対する引数の引き渡し方法(慣習)がいくつか種類があって非常に煩雑な世界となっております。今回の例は、Visual C++ での引数の呼び出し規約と PVF上のFortran での規約を一致させるて使用する必要があります。Visual C++ のデフォルトは __cdecl(/Gdオプション)です。このデフォルト規約に合わせるため、PVF ではコンパイルオプションとして、-Munix あるいは、-Miface=unix と言うものが用意されています。32ビット環境のコンパイル時には、PVF 側で以下の設定を必ず行って下さい。(64bitアプリケーション作成時には、この概念は必要ありません

外部手続き呼び出し規約

SEAWATプログラムに限ったプロパティの設定項目

 SEAWATプログラムは、浮動小数点変数で単精度、倍精度混合で使用されている部分があります。この影響かどうかは不明ですが、内部の PCG 計算時に収束しない状況があるため、SEAWATのビルドでは、DIMENSION 宣言の単精度実数に関して、全て倍精度に「精度拡張」してコンパイルするように指示します(これについては、SEAWAT のパッケージの readme にも記述されています)。倍精度への精度拡張を行うオプションは、-r8 となりますので、これは、明示的に以下の「Command Line」入力欄に記述します。

(README抜粋)IMPORTANT: For the SEAWAT program to operate correctly, the program must be compiled such that all real variables are defined as double precision. The program may not work correctly using the default option (single precision) in most compilers.

精度拡張

 次に、リンクの設定を行います。今回は、別プロジェクトで SWT-C と言う C ルーチンのライブラリを作成してから、Fortranコンパイラでリンクします。このための設定を行います。SWT-C プロジェクトで作成されたライブラリの保存場所を以下のように記述します。

リンクプロパティ

 次に、リンクの「Input」->「Additional Dependencies」の項目にリンクすべきライブラリのファイル名を記述します。

言語

ソリューションのスタートアッププロジェクトの設定

 最後に、スタートアッププロジェクトの設定を行います。「スタートアッププロジェクト」とは、メイン(主)プログラムが存在するプロジェクトと言う意味です。今回は、一つの Visual Studio のソリューション内に、Fortran プロジェクトと C プロジェクトの二つがあります。そのどちらに、プログラムの開始を行うメインプログラムが存在するかと言う設定です。

スタートアッププロジェクト

スタートアッププロジェクト設定

ソリューションのビルド

 以上の設定が終了後、「ソリューションのビルド」を行います。「ビルド」メニューの中の「ソリューションのビルド」を実行して下さい。正常終了すると、これにて 64ビットアプリケーションが完成します。実行バイナリは、この例の場合、C:\PGI\SEAEWAT4\swt_v4_00_03\projects\SEAWAT403\SEAWAT403\x64\Release\SEAWAT403.exe として、生成されています。このバイナリは、スタティックリンク形式のバイナリですので、これを実際のデータセットが存在するフォルダーへコピーします。そこで、ダブルクリックして実行を開始できます。

ビルド

 以上、PGI Visual Fortran を使用して実行モジュールを作成する手順を説明しました。次のコラムでは、bash コマンドインタフェースの PGI コンパイラを用いて、同じ SEAWAT プログラムを生成する方法を説明します。