インテル® Parallel Studio XE 2019
Composer Edition for Windows
インテル® Fortran コンパイラー 入門ガイド
エクセルソフト株式会社
バージョン 1.00, 2019 年 1 月 30 日1. はじめに. . . 1 2. サンプルプログラムのダウンロード. . . 2 3. インテル® Fortran コンパイラーを使用してコンパイルする . . . 2 コマンドプロンプトからコンパイルする. . . 3 Visual Studio* からコンパイルする. . . 6 4. Visual Studio 環境からコンパイラーオプションを使用する. . . 11 4.1. サンプルプログラムのビルド . . . 12 4.2. プロジェクト・プロパティとビルド構成について. . . 16 4.3. プロジェクト・プロパティへのアクセスと設定項目. . . 17 4.4. Release でビルド . . . 18 4.5. 自動ベクトル化機能と最適化診断レポートオプション. . . 20 4.6. 自動並列化オプション. . . 23 5. Visual Studio を使用してデバッグする . . . 26 5.1. ブレークポイントの設定. . . 27 5.2. デバッグ実行の開始. . . 28 5.3. デバッグ実行時の操作. . . 29 6. 関連情報. . . 38 6.1. 固定形式と自由形式のコードのコンパイル. . . 38 6.2. 64bitアプリケーションの作成 . . . 39 6.3. ランタイムエラーの対処 . . . 41 6.4. ランタイムライブラリーの不足と再配布可能ファイル . . . 43 6.5. スタック・オーバーフロー. . . 45 6.6. 2GB以上のデータを扱うアプリケーション. . . 47 6.7. Compaq Fortran との違い. . . 49 6.8. 本製品付属ドキュメントの参照. . . 50 7. お問い合わせ. . . 51 8. 参考資料. . . 51
1. はじめに
インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows* (以下、本製品) は、インテ ル® Fortran コンパイラーと数値演算ライブラリー(インテル® MKL)を含むソフトウェア開発製品です。 本ドキュメントは、インテル® Fortran コンパイラーを使用したコンパイル方法や、最適化オプションの設定、 デバッグ手順の説明を目的としてます。これからインテル® Fortran コンパイラーを使い始める方や Visual Studio の操作に慣れていない方を対象としています。 本ドキュメントでは下記の環境を使用します。 項目 構成
CPU インテル® Core™ i7-6700 プロセッサー
メモリ DDR4-2133 16GB
ストレージ HDD 1TB
OS Windows 10 1803
Visual Studio 製品 Visual Studio 2017 バージョン 18.9 (統合済)
本製品をデフォルトの設定でインストールした場合、以下のフォルダーにインストールされます。
C:\Program Files (x86)\IntelSWTools
製品付属の Microsoft* Visual Studio* 2015 Shell や、本製品でサポートされるその他の Visual Studio* 製品を使用している場合でも、基本的な操作は変わりません。
2. サンプルプログラムのダウンロード
本製品向けに提供されているサンプルプログラムを使用します。まずは、サンプルプログラムのパッケージを Web サイトよりダウンロードします。
1. Intel 社の Web サイトにアクセスします。
サンプルプログラムのダウンロードページ(外部ページ)
2. Web サイトから Intel® Parallel Studio XE for Windows* - Sample Bundle の項目を探し、 Download をクリックして .zip ファイルをダウンロードします。 図 1. ダウンロード先 Web サイト 3. ダウンロードしたファイルを解凍します。ここではデスクトップに解凍して使用します。 解凍先: C:\Users\<ユーザー名>\Desktop\ipsxe2019_samples_win_20180731
3. インテル® Fortran コンパイラーを使用してコンパ
イルする
インテル® Fortran コンパイラーを使用したコンパイル方法を説明します。 コマンドプロンプトからコンパ イルする もしくは Visual Studio* からコンパイルする から使用できます。 ここでは、サンプルコードのうち、以下の optimize_samples フォルダに配置されている int_sin.f90 を対象 とします。 <デスクトップ>\ipsxe2019_samples_win_20180731\compiler_f\optimize_samples\srcコマンドプロンプトからコンパイルする
1. スタートメニューから [Intel Parallel Studio XE 2019
›
コンパイラー 19.0 UP1 インテル(R) 64 VS2017 環境] を開きます。異なる Visual Studio を使用している場合は、 VS2017 の表示を対応した Visual Studio バージョンに読み替えてください。 図 2. スタートメニュー 図 3. 表示されるメッセージ Tips 1. コンパイラー 19.0 UP1 インテル(R) 64 VS2017 環境 起動時に以下のバッチファイルが実行され、インテル® Fortran コンパイラーの実行に必要な環境 変数(PATH、LIB、INCLUDE 等)の設定が自動で行われます。C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\ windows\bin\compilervars.bat intel64 vs2017
2. ifort を入力して Enter キーで実行します。
図 4. ifort コマンドの実行結果
コンパイラーのバージョン情報が表示されていれば、インテル® Fortran コンパイラーが使用可能な状態 です。
Tips 2. ifort コマンドの動作
ifort コマンドは、内部でインテル® Fortran コンパイラー(fortcom.exe)を コールしてコンパイル
処理を行い、その後マイクロソフト・リンカー(link.exe)をコールしてリンク処理を行います。
3. ソースコードがあるフォルダーに移動します。
図 5. cd コマンドの実行
図 6. ifort コマンドでサンプルプログラムをコンパイル
実行ファイル(int_sin.exe)が生成されていることを確認します。
図 7. コンパイルの実行後
Visual Studio* からコンパイルする
インテル® Fortran コンパイラーを Visual Studio* 環境で使用する手順を説明します。サンプルプログラム には、既に Visual Studio* 用のプロジェクトファイルが含まれていますが、新規に Visual Studio* のプロジ ェクトを作成します。 ここでは、サンプルプログラムのうち、以下のフォルダパスに配置されている ipo_samples を対象としま す。ipo_samples <デスクトップ>\ipsxe2019_samples_win_20180731\compiler_f\ipo_samples/src 1. スタートメニューから Visual Studio 2017 を開きます。 図 9. スタートメニューの Visual Studio のアイコン 図 10. Visual Studio の画面
2. 上部メニューから、[ファイル
›
新規作成›
プロジェクト] を選択して 新しいプロジェクト ウィンドウを表 示します。 図 11. 新しいプロジェクトへアクセス 3. 新しいプロジェクト ウィンドウから [インストール済み›
インテル® Fortran›
コンソール・アプリケーシ ョン] を選択して、続いて 空のプロジェクト を選択します。 4. プロジェクトの名前に ipo_sample、プロジェクトを作成する場所は、<デスクトップ>¥ を指定しま す。OK をクリックします。 図 12. 新しいプロジェクトの設定5. 作成したプロジェクトにソースファイルを追加します。[ソリューション エクスプローラー] から ソースフ ァイル を右クリックし、[追加
›
既存の項目] を選択して 既存項目の追加 ウィンドウを表示します。 図 13. ソースファイルの追加 6. ソースファイルがあるフォルダーに移動し、ipo_sample_main.f90,ipo_sample_init.f90, ipo_sample_sum.f90 を選択して 追加 をクリックします。 図 14. ソースファイルを指定 (Ctrl を押しながら3ファイルをクリック) プロジェクトの ソースファイル に、3つのソースファイルが追加されたことを確認します。追加した.f90フ ァイルをダブルクリックすると、コードがエディターに表示されます。7. プロジェクトのビルドを行います。Visual Studio* のメニューから、 [ビルド
›
ipo_sample のビルド] を 選択するか、[ソリューション エクスプローラー] のプロジェクトを右クリックして表示されるメニューか ら、 ビルド を選択します。 図 15. ipo_sample プロジェクトのビルド ビルド状況が [出力] ウィンドウに表示されます。正常終了していることを確認します。 図 16. ビルド状況の出力8. ビルドしたプログラムを実行します。Visual Studio* のメニューから、[デバッグ
›
デバッグなしで開始] を選択します。コマンドウィンドウにプログラムの実行結果(1004000)が表示されます。 図 17. デバッグ無しで開始 9. サンプルプログラムの実行ファイルの場所を確認します。[ソリューション エクスプローラー] のソリュー ションを右クリックして表示されるメニューから、エクスプローラーでフォルダーを開く を選択します。 図 18. フォルダーを開くDebug フォルダー内に、ipo_sample.exe が生成されています。 図 19. 実行ファイル (exe) の配置場所
4. Visual Studio 環境からコンパイラーオプションを
使用する
インテル® Fortran コンパイラーには、プログラムの高速化を図るための最適化オプションが多数用意され ています。その中で代表的な最適化オプションを使用して、実際にサンプルプログラムを使用してそれらの最 適化オプションの使用方法とその効果を説明します。4.1. サンプルプログラムのビルド
サンプルプログラムでは行列の積和演算を行います。データサイズが 1500x1500 の配列 a、b、c を宣言し ます。a、b、c 配列の初期化後、3 重ループ内で配列 a と b の掛け算結果を、配列 c へ足し込む処理を行いま す。配列の初期化と行列積和演算の実行時間を dclock 関数を使用して計測して、最後に計算結果と計算時 間を表示しています。 リスト 1. サンプルプログラム program matmul implicit noneinteger, parameter :: SIZE = 1500 real,dimension(SIZE,SIZE) :: a,b,c real*8 clock_start, clock_end integer i, j, k
real*8 dclock
write (*, '(/,A,I0,/)') "計算開始 : 行列サイズ = ", SIZE !時間計測の開始 clock_start = dclock() !配列の初期化 do i=1, SIZE do j=1, SIZE a(j,i) = 1.0 b(j,i) = i c(j,i) = 0.0 end do end do !計算処理 do i=1, SIZE do k=1, SIZE do j=1, SIZE
c(j,i) = c(j,i) + a(k,i) * b(j,k) end do
end do end do !時間計測の終了
clock_end = dclock()
write (*,*) "計算結果 = ", c(SIZE, SIZE)
write (*,*) "計算時間 = ", (clock_end - clock_start), "[秒]" write (*,*) ""
1. まずは、サンプルプログラムをビルドするために Visual Studio* を起動します。 2. Visual Studio* のメニューから、[ファイル
›
新規作成›
プロジェクト] を選択して [新しいプロジェクト] ウィンドウを開きます。 3. [新しいプロジェクト] ウィンドウから [インストール済み›
インテル® Fortran›
コンソール・アプリケー ション] を選択して、続いて 空のプロジェクト を選択します。 ここでは、プロジェクトの名前*に matmul を指定し、プロジェクトの場所は <デスクトップ>¥ としていま す。設定の完了後、 OK をクリックします。 図 20. 新規プロジェクトの作成 4. 作成したプロジェクトにサンプルプログラムのソースファイルを追加します。[ソリューションエクスプ ローラー] の [ソースファイル] を右クリックして、[追加›
新しい項目] を選択します。 図 21. 新しいソースファイルの追加5. Fortran 自由形式ファイル (.f90) を選択します。 6. [名前] に matmul と入力して、[OK] をクリックします。 図 22. matmul.f90 ファイルを作成 7. matmul.f90 ファイルをダブルクリックして、テキストエディターを開きます。エディターにサンプルプロ グラムのコードをコピーします。 図 23. サンプルコードをコピー
8. プロジェクトをビルドします。正常終了することを確認してください。
図 24. matmul プロジェクトのビルド
9. プログラムを実行します。配列のサイズと計算結果、そして計算時間が出力されます。実行環境により計 算にかかる時間が異なります。最適化オプションを使用して、ここで得られた計算時間を短縮します。
4.2. プロジェクト・プロパティとビルド構成について
Visual Studio* では プロジェクト・プロパティから最適化オプションを設定します。プロジェクト・プロパティ には、プログラムをビルドするために関係する設定が項目別で表示されており、コンパイラーやリンカーはこ の設定内容に従って実行ファイルを生成します。 図 26. プロジェクト・プロパティ プロジェクト・プロパティはビルド構成という単位で管理されています。プロジェクトを新規作成する と、Debug と Relase の名前が付いた2つのビルド構成が作成されます。ビルド構成ごとにプロジェクト・プロ パティが用意されており、それぞれのビルド構成で異なるオプションを設定できます。ビルド構成を変更する ことで、コンパイラー・オプションを一括で切り替えることが可能です。 図 27. ビルド構成の選択 構成 説明 Debug 最適化オプションなしで、デバッグオプションあり(デバッグ用途) Relese 最適化オプションありで、デバッグオプションなし(パフォーマンス重視)4.3. プロジェクト・プロパティへのアクセスと設定項目
上部メニューから [プロジェクト›
<プロジェクト名›
のプロパティ] を選択します。 図 28. プロジェクト・プロパティへのアクセス プロパティページの内容を確認します。まず、プロパティページの左上に [構成] があります。Debug と表示さ れているので、Debug のビルド構成のプロジェクト・プロパティを表示しています。 左側は [構成プロパティ] が表示されており、 [Fortran] 以下の項目からインテル® Fortran コンパイラーの オプションを設定します。項目ごとの設定は右側のウィンドウに表示されます。 図 29. Debug のプロジェクト・プロパティページ4.4. Release でビルド
1. ビルド構成を Relase に変更してビルド後、実行します。構成を Debug から Relase に切り替えてビルド します。 図 30. ビルド構成の切り替え 2. プログラムを実行します。実行結果を見ると、Debug の結果と比較して、計算時間が大幅に短縮されてい ます。これは Relase のプロジェクト・プロパティで最適化オプションが設定されているためです。 図 31. Release でビルドされた Matmul の実行 図 32. Debug でビルドされた Matmul の実行
Tips 3. Debug と Release で設定されているオプション
Relase と Debug で使用されている最適化オプションを比較すると、[最適化]項目の [最適化] オプショ ンの内容が異なっています。
図 33. Debug構成のプロジェクト・プロパティページ
図 34. Release構成のプロジェクト・プロパティページ
Debug では 無効(/Od) が設定されているのに対して、Relase では 実行速度 となっています。最適化 オプションを使用することでプログラムの実行速度が飛躍的に向上する可能性があります。
実行速度 と表記されている設定のコンパイルオプションは /O2 です。Relase に切り替えることで、最
適化のコンパイルオプションが /Od → /O2 に変更されたため、最適化されたプログラムが生成されま
4.5. 自動ベクトル化機能と最適化診断レポートオプション
自動ベクトル化機能によるパフォーマンスへの効果を確認します。 4.5.1. 自動ベクトル化機能と SIMD 演算について インテル® コンパイラーの自動ベクトル化機能は、SIMD 演算が可能な箇所をソースコードから探し出し、自 動でSIMD 演算を使用するベクトル化コードに変換します。SIMD 演算は単一命令で複数のデータを処理で きるため、通常のスカラー演算と比べて大幅に実行効率が向上します。 配列 a、b を足して配列 c に格納する処理を max 回繰り返す場合を例にした場合、 スカラー演算では 1 命 令で 1 データを扱うので、ループ処理を max 回実行します。一方、SIMD 演算では 1 命令で4つのデータを 扱うことができるため、ループ処理を max / 4 回繰り返すだけで完了します。 リスト 2. ベクトル化の対象となる処理 do i = 1, max c(i) = a(i) + b(i) end doSIMD 演算では以下の特別な演算命令が使用されており、年々 CPU の進化と共に新しい命令が追加されて います。
4.5.2. 使用される命令セットを制御する インテル® コンパイラーの自動ベクトル化機能が使用する命令セットは、コンパイラーオプションで制御でき ます。 1. プロジェクト・プロパティの [Fortran
›
コード生成›
指定された命令セットの専用コード生成] を確認し ます。 図 35. 使用する命令セットの指定 実行環境に搭載されているプロセッサーが持つ最新の命令セットが推奨されています。開発環境の PC 上でプログラムを実行させる場合は、コンパイルを実行しているホスト・プロセッサーと同じ(/QxHost) を選択することで、PC 上で利用可能な命令セットをコンパイラーが調べて、適切なオプションを設定しま す。ここでは、/QxCORE-AVX2 のオプションが設定されます。 2. コンパイルを実行しているホスト・プロセッサーと同じ(/QxHost) を選択します。 3. 再度ビルドした後、実行して計算時間を確認します。より上位の命令セットを使用することで、計算時間を より短縮することができます。4.5.3. 最適化レポートを確認する 自動ベクトル化機能を含むインテル® コンパイラーが行った最適化は最適化診断レポートで確認します。 最適化診断レポートは、コンパイラーによる最適化の結果を表示する機能です。通常、ベクトル化はコード内 のループ処理に対して適用されますが、すべてのループ処理がベクトル化されるわけではありません。 最適化診断レポートを使用することによって、どのループがベクトル化されたのか、されなかったのか、またさ れなかった場合はその理由などを表示することができます。 1. プロジェクト・プロパティより [診断
›
最適化診断レベル] を レベル 2 (/Qopt-report:2) に設定し、また [ 診断›
最適化診断フェーズ] を ベクトル化(/Qopt-report-phase:vec) に設定します。 図 37. 最適化レポートを出力するように設定 最適化診断レベルの数字が大きいほど詳細なレポートを表示します。ここではベクトル化の可否などを 調べたいので、比較的情報量の少ないレベル2を選択しています。 また、最適化診断フェーズでは、出力するレポートの内容をベクトル化に注目するように指定しています。 2. プロジェクトをビルドします。ビルド後、matmul.f90 ファイルのコード内に、最適化対象となる各ループ に対してレポート結果が表示されます。図 38. エディターに最適化レポートを表示 初期化処理の内側ループと行列積和演算の内側ループの2箇所がベクトル化されたことが確認できま す。ベクトル化できなかったループに対しては、ベクトル化できなかった理由が表示されていることが確 認できます。
4.6. 自動並列化オプション
自動並列化機能を使用して実行時間を検証します。自動並列化機能を使用することで、マルチコア、マルチプ ロセッサーなどの複数のコアを持つ環境上で、効果的なプログラムを作成することができます。 1. プロジェクト・プロパティの [Fortran›
最適化›
並列化] より はい (/Qparallel) を設定して、自動並列化 オプションを有効にします。2. プロジェクト・プロパティより [診断
›
最適化診断レベル] を レベル 2(/Qopt-report:2) に設定し、また [ 診断›
最適化診断フェーズ] を 自動並列化(/Qopt-report-phase:par) に設定します。 図 40. 最適化レポートの設定 3. プロジェクトをビルドします。 ビルド後、matmul.f90 ファイルのコード内に、最適化対象となる各ループに対してレポート結果が表示 されます。診断レポートを確認すると初期化処理の外側ループ、および行列積和演算の一番外側のルー プが自動並列化されたことが確認できます。 図 41. 最適化レポートの確認4. プログラムを実行します。結果を見ると数倍に高速化されていることが確認できます。自動並列化を行う ことで、処理を複数のコアに分散して計算させることができます。 図 42. 実行結果 プログラムが複数のコアを使用しているか確認する場合には、方法の1つとして「タスクマネージャー」を 使用して各コアの使用率を確認します。実行がすぐ終了してしまい使用率の確認が難しい場合は、配列の サイズを増やしてください。 図 43. タスクマネージャーから CPU 使用率を確認
5. Visual Studio を使用してデバッグする
Visual Studio* を使用した基本的なデバッグ方法を説明します。Visual Studio* からコンパイルする で作成 したプロジェクトを使用します。
[ファイル
›
開く›
プロジェクト/ソリューション] から ipo_sample プロジェクトを開きます。5.1. ブレークポイントの設定
ブレークポイントとは、プログラムをデバッグ実行したときに、プログラムを一時中断させる箇所です。プログ ラムの実行を中断させることで、その時点に実行された処理の結果や、変数の値などを確認することができま す。 ソースコード上の停止させたい行の左端をマウスでクリックします。ブレークポイントが設定されると、その行 に赤いマークが表示されます。 図 45. ブレークポイントの設定 28 行目の配列データの初期化処理を行うサブルーチンを呼び出している処理、call init(a, n) にブレークポ イントを設定します。設定したブレークポイントを解除したい場合は、赤いマークをクリックします。5.2. デバッグ実行の開始
デバッグ実行は、 [デバッグ›
デバッグ開始] を選択するか、 F5 を押します。 図 46. デバッグ実行を開始 デバッグ実行が開始されると、 のマークがある行で処理が停止します。 Visual Studio* にデバッグ用のツールバーが追加され、下部に複数のウィンドウが表示されています。ここ に表示される機能を使用して、デバッグ作業の操作、データ内容の確認、編集を行います。5.3. デバッグ実行時の操作
デバッグ実行時は、 ツールバーのボタンから[続行]、[ステップイン]、[ステップオーバー]、[ステップアウト] の4種類の操作を行います。 操作 説明 次のブレークポイントまでプログラムを実行します。ブレークポイントがない場 合はプログラムの最後まで実行してデバッグ実行を終了します。 1行の処理を実行します。モジュールやサブルーチンがコールされる場合は、そ の処理のコードに進みます。 1行の処理を実行します。モジュールやサブルーチンがコールされる場合でも、 現在実行中のプログラムの次の行に進みます。 現在実行中の関数、またはサブルーチンを抜けて、親関数または親サブルーチ ンに戻ります。 図 47. デバッグ中の画面1. 30 行目の print 文にブレークポイントを設定してください。 2. を選択します。ブレークポイントを設定した print 文の行までプログラムが実行されて止ま ります。 図 48. 続行の選択 図 49. 続行の処理後 3. 再度 を選択します。以降の実行箇所にはブレークポイントが設定されていないので、プロ グラムの最後まで実行してデバッグ実行は終了します。
4. 再度デバッグ実行を開始します。 [デバッグ
›
デバッグ開始] を選択します。5. を選択すると、表示されるソースコードが切り替わり、init サブルーチン内の先頭行に
進んだことが確認できます。
図 50. ステップインの実行
6. 続けて を選択します。 init サブルーチン内の do 文の行で停止し、この動作で処理を1ステップ実行したことが確認できます。デ バッグでは通常、変数宣言の行には止まりません。実際の処理がデバッグ実行の対象になります。 図 52. ステップオーバーの実行 図 53. ステップオーバーの処理後 7. ステップオーバーを再度実行します。 次の行であるループ文の処理内容、つまり配列 a への代入処理に進んだことが確認できます。ステップ オーバーを再度実行すると、代入処理を実行して次の行 end do で止まります。さらにステップオーバー を実行すると、代入処理を実行して次の行 end do で止まります。
図 54. ステップオーバーを続けて実行 8.
を選択します。
init サブルーチンを抜けて親関数である main プログラムに戻ります。init サブルーチンの実行を完了し
て親関数に実行が戻された状態です。 9. デバッグ実行を終了します。その後、再度デバッグ実行を開始します。 前回の手順で設定した call init(a, n) の行で実行が中断され、ウィンドウがいくつか表示されます。デバッ グ中に、変数や配列に格納されているデータを確認してみましょう。プログラムの実行中にどのように データが変移しているのか、簡単に把握することができます。 10. [ローカル] ウィンドウをクリックして開いてください。 [ローカル] ウィンドウは、プログラムの変数や配列などのデータ内容を表示します。以下の例では、配列 A と 変数 RES が表示されており、RES の値は現在まだ不定なのでデフォルト値が表示されています。
11. ローカルウィンドウ内の配列 A の左側にある をクリックして内容を展開表示します。 内容を確認すると各要素の値はすべてゼロに設定されていることが分かります。 図 56. 配列 A の要素値 12. 表示を元に戻すには、 をクリックします。ローカルウィンドウには変数の型も表示されていることが 確認できます。本サンプルプログラムでは REAL(4) が使用されています。 図 57. データ型の確認 13. init サブルーチンの中へステップイン実行します。 14. 続けてステップオーバーを実行して、do 文まで進めます。ローカルウィンドウの表示内容が init サブ ルーチンで使用される変数に切り替わります。 ここでは引数 N の値が 1000 であることが確認でき、do 文のループ回数が 1000 であることが分かり ます。また変数 I の値は不定値であることも確認できます。 図 58. 実行中の変数を確認
15. 続けてステップオーバー実行して、do 文の処理の中に入ります。不定値であった変数 I の値が更新さ れ、1 になります。ローカルウィンドウでは、更新されたデータの値が赤色で表示されます。このためステ ップ実行による処理の確認もすることができます。 図 59. 変数が更新されたことを確認 ステップオーバーの実行を何回か続けると、変数 I の値が do 文の実行によって増えている様子が確認で きます。配列 A の内容も確認すると各要素の値が更新されている状況を確認できます。
16. init サブルーチンからステップアウトして main の親関数に戻ります。 17. ソースコード上の変数 a にマウスカーソルを合わせてください。 ポップアップが表示され a 配列の内容が確認できます。ここでは初期化済みの各要素の値が確認できま す。この機能を使うとローカルウィンドウを使用せずに、より直観的に、変数や配列のデータ内容を確認す ることができます。 図 60. 直感的に変数を確認 18. mysum 関数をステップオーバーして print 文まで処理を進めます。デバッグ中に、変数や配列に格納さ れているデータを編集してみましょう。条件分岐に使用する変数の値を一時的に書き換えたり、簡単なテ ストケースとして使用したりすることができます。
この print 文では、計算結果である RES の値を出力表示します。現在 RES の値は“1004000”であること が [ローカル] ウィンドウから確認できます。
19. RES の表示がある行を右クリックして、表示されるメニューから [値の編集] を選択します。 20. 1005000 に変更します。 図 62. 変数の要素を編集 21. ステップオーバーを実行して print 文の処理を実行し、実行結果が 1005000 に変更されていることを 確認します。 図 63. 実行結果 これらの操作を活用することで、プログラムの動作を、わかりやすく把握することができます。
6. 関連情報
本製品を使用する上での、その他の基本情報をいくつか説明します。6.1. 固定形式と自由形式のコードのコンパイル
インテル® Fortran コンパイラーは、ファイルの拡張子によりコンパイル方法を決定しています。固定形式/ 自由形式フォーマットでそれぞれ以下の拡張子が使用されます。 表 1. 対応する拡張子と識別 フォーマット 拡張子固定形式フォーマット .for .f .fpp (例 prog.for prog.f prog.fpp
自由形式フォーマット .f90 (例 prog.f90) Visual Studio* では、上部メニューから ツール
›
オプション を選択して [オプション] ウィンドウにアクセス します。[インテル(R) コンパイラーおよびツール›
Fortran›
全般] に、固定形式と自由形式で使用されるフ ァイルの拡張子が設定されています。もし拡張子を変更/追加したい場合は、この設定内容を編集します。 図 64. 対応する拡張子の設定 また、プロジェクト・プロパティからコンパイルオプションを使用して、コンパイラーに直接指定することもで きます。 図 65. プロジェクト・プロパティの設定6.2. 64bitアプリケーションの作成
インテル® コンパイラーでは、64 ビットのプログラムを簡単に作成することができます。64bit プログラムで は、2G バイト以上の大きなデータを扱うことができます。また、64 bit プログラムでは 32bit プログラムより 高速になる場合もあります。なお、64bit のアプリケーションを実行する場合は、Windows* OS も 64bit で ある必要があります。
Visual Studio* から作成する場合は、64bit のプログラム作成用の新たなビルド構成を作成します。新しい ビルド構成作成は、[構成マネージャー]を通して行います。 [構成マネージャー]のアクセスは、x86 と表示されているボックスを選択して 構成マネージャー を選択しま す。 図 66. 構成マネージャーへアクセス 構成マネージャーでは アクティブ ソリューション構成 と アクティブソリューション プラットフォーム の項目 が表示されます。アクティブ ソリューションプラットフォームの内容に変更を加えます。 図 67. 構成マネージャー [アクティブ ソリューションプラットフォーム] から <新規作成…> を選択して [新しいソリューション プラッ トフォーム] ウィンドウを開きます。 図 68. アクティブ ソリューションプラットフォームの変更
新しいプラットフォームに x64 の表記があることを確認して OK をクリックし、構成マネージャー画面で 閉じ
る をクリックして作業を完了します。
図 69. 64bit アプリケーション向けに設定
Visual Studio* のメイン画面に戻ると、x64 が追加されていることが確認できます。
6.3. ランタイムエラーの対処
プログラムの実行時にエラーが発生すると Fortran ランタイムシステムがエラーメッセージを表示します。 たとえば入力ファイルが見つからなかった場合、以下のようなメッセージが表示されます。 図 71. 実行エラーの例 発生したエラー内容と、ルーチンの呼び出しの流れをさかのぼって表示しますが、メッセージ内容は Unknownと表示された内容が多く、エラー発生箇所を特定することは困難ですが /traceback オプションを 使用することで、詳細なメッセージを表示させることができます。 プロジェクト・プロパティから [Fortran›
ランタイム›
トレースバック情報の生成] より設定します。 図 72. トレースバック情報の生成/traceback オプションを設定してビルド後、プログラムを実行します。/traceback オプションを付加するこ とで問題発生箇所のルーチン名とソースファイル名、またソースコード上の行番号が明記されるため、問題が 発生しているコードをすぐに把握することができます 図 73. 実行エラーの例 Visual Studio* 上でこのオプションの設定時に下記の警告が表示されます。 [フレームポインターなし]を い いえ (/Oy-) に設定し、また [インクリメンタル・リンクを有効にする] を いいえ (/INCREMENTAL:NO) に設 定してください。この操作を行っていない場合、/traceback オプションは動作しません。 図 74. 警告 Fortran ランタイムシステムが通常検出するエラーに加えて、さらにプログラムの実行時にエラーとしてチェ ックする項目を追加することができます。プロジェクト・プロパティの [Fortran
›
ランタイム] には複数のチェ ック項目が用意されています。 図 75. エラーチェックの設定 [配列と文字列範囲のチェック] を はい にすると、実行中に設定した配列や文字列の大きさを超えてアクセス した場合エラーメッセージが表示されます。[初期化されていない変数のチェック] を はい にすると、未初期 化変数に対して書き込みをする前に読み込みを行った時にエラーメッセージが表示されます。6.4. ランタイムライブラリーの不足と再配布可能ファイル
開発したプログラムを他の PC 上で動作させる場合、下記のエラーが発生する場合があります。これはプログ ラムが実行するために必要なランタイムライブラリーが不足しているために発生しています。 図 76. ランタイムライブラリーの不足によるエラー画面 この場合、プログラムの実行に必要なランタイムライブラリーを調査する必要があります。画像では LIBIOMP5MD.DLL が不足していることがわかります。LIBIOMP5MD.DLL はインテル® Fortran コンパイラーが提供する OpenMP のランタイムライブラリーで す。自動並列化機能を使用した場合、そのプログラムの実行に必要となるファイルです。 プログラムを実行す るためには、実行に必要な全てのランタイムライブラリーを実行する PC に配置します。 インテル® Fortran コンパイラーでは fredist.txt に再配布可能ファイルの一覧が記載されています。 C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2018.1.156\licensing\compiler\en 本製品をデフォルトの設定でインストールした場合、インテル® Fortran コンパイラーのランタイムライブラ リーを含む再配布可能ファイルは以下のフォルダーに存在します。 32bit プログラム用
C:¥Program Files (x86)¥Common Files¥Intel¥Shared Libraries¥redist¥ia32_win¥compiler
64bit プログラム用
C:¥Program Files (x86)¥Common Files¥Intel¥Shared Libraries¥redist¥intel64_win¥compiler
実行 PC 上にランライムライブラリーを配置する場合、実行プログラムと同じフォルダー内かシステム環境 変数(PATH)に設定されたフォルダーに配置する必要があります。一般的には実行プログラムと同じフォル ダー内に置く方が簡単です。または、インテル®・レジストレーション・センターから、本製品のダウンロード ページに表示される「再配布可能ファイルパッケージ」から利用することもできます。 図 77. 再配布パッケージのダウンロード画面 再配布可能ファイルパッケージには下記の2つのファイルが含まれています。 • ww_ifort_redist_ia32_2018.1.156.msi(32bit プログラム実行用) • ww_ifort_redist_intel64_2018.1.156.msi (64bit プログラム実行用) 再配布可能ファイルパッケージをインストールすると、再配布可能な全てのランタイムライブラリーが以下の フォルダーに格納され、システム環境変数(PATH)にパスが設定されます。 ランタイムライブラリーの配置先
6.5. スタック・オーバーフロー
ここでは、スタック・オーバーフローが発生した場合の解決策を説明します。以下のサンプルコードでは、スタ ック・オーバーフローが発生します。 リスト 3. スタック・オーバーフローを引き起こすサンプルプログラム program main implicit none call calc(1000000)contains subroutine calc(n) integer, intent(in) :: n integer, dimension(n) :: a, b a = 4
b = 4 a = a + b
print *, "sum=", sum(a) end subroutine calc end program main
このサンプルコードをビルドして実行すると、以下のメッセージが表示されます。 図 78. スタック・オーバーフローの発生 MAIN ルーチンの 3 行目の calc サブルーチンをコールしている箇所でスタック・オーバーフローが発生して います。calc の配列a と配列 b がデフォルトのスタックサイズを超過していることに起因しています。 デフォルトのスタックサイズは通常 1M バイトですが、このサンプルコードは整数型(4 バイト)の配列(a と b)がそれぞれ 1,000,000 要素のデータサイズを宣言しているので合計 8M バイトの容量が必要です。 実行するためには使用可能なスタックサイズを変更する必要があります。Visual Studio* からスタックサイズ を変更する場合は、プロジェクト・ プロパティから [リンカー
›
システム›
スタックのサイズの設定] にサイズ を設定します。下記の画像では 10M を設定しています。図 79. スタックサイズの指定 再度ビルドして実行すると、今度は正常にプログラムが実行されます。 図 80. 実行結果 コマンドプロンプトから指定する場合は、 /F オプションを使用します。 ifort /F10000000 stack_overflow.f90 また、/heap-arrays オプションを使用することで、配列データをスタック領域ではなく動的領域(ヒープ領域) に配置することができます。Visual Studio* 上から設定する場合、プロジェクト・プロパティから [Fortran
›
最適化
›
ヒープ配列] の値を 0 に設定します。図 81. プロジェクト・プロパティの設定
もしくは以下のようにコードを修正することでスタック・オーバーフローを回避することができます。 配列 a と b を allocate 文で動的割り当てを行っています。
リスト 4. スタック・オーバーフローの回避例
program main implicit none call calc(1000000)
contains subroutine calc(n) integer, intent(in) :: n
integer, dimension(:), allocatable :: a, b allocate(a(n), b(n)
a = 4 b = 4 a = a + b
print *, "sum=", sum(a) end subroutine calc end program main
6.6. 2GB以上のデータを扱うアプリケーション
2G バイトを超す大きなデータを使用する場合は、64 bit のプログラムを作成する必要があります。32bit の プログラムでは使用することはできません。ただし、64 bit のプログラムでも配列の宣言方法によって 2G バ イトの制限となるケースがあります。下記のサンプルコードでは整数型(4 バイト)の配列 a を 500,000,000 要素宣言しており、合計で約 2G バイトのデータを使用しています。 リスト 5. 実行できないコード例 program bigdata implicit none integer,dimension(500000000) :: a a(1) = 1print *, "a(1)=", a(1) end program bigdata
リスト 6. 配列の割り当てを変更して修正したコード program bigdata implicit none integer,allocatable,dimension(:) :: a allocate(a(500000000)) a(1) = 1
print *, "a(1)=", a(1) end program bigdata
この変更によりプログラムを実行させることができます。(※ 64 ビットのプログラムを動作させるには、64 ビット Windows* OS が必要です) 図 82. 実行結果 なお、動的領域に割り当てられるサイズはシステムに搭載される「実装メモリー」と「仮想メモリー」の大きさ に依存します。動的領域に割り当て可能なサイズは、システムの状況により変動する場合がありますが、おお よそ実装メモリーと仮想メモリーの合計となります。実装メモリーと仮想メモリーの合計以上のサイズを使用 した場合、実行時にエラーが表示されます。 図 83. 使用可能なメモリーの超過
6.7. Compaq Fortran との違い
インテル® Fortran コンパイラーは、Compaq* Fortran(CVF)コンパイラーの後継製品であるため CVF コン パイラーに対して非常に高い互換性があります。一般的に CVF のコードはそのままインテル® Fortran コン パイラーでコンパイルすることができますが、場合によって変更や調整が必要になります。CVF コンパイラー から移行する際の注意点は、以下の Intel® 社の記事(英語)に細かく纏められています。 http://software.intel.com/en-us/articles/migrating-from-compaq-visual-fortran ここでは、その中でも特にコンパイラー動作の違いについて 3 点説明します。 6.7.1. 引数チェック範囲 CVF では同一ソースファイル内に限定して引数チェックを行いますが、IVF ではソースファイル間の引数チェ ックも行うため、CVF ではなかったエラーが IVF で発生するケースがあります。プロジェクト・プロパティから [Fortran
›
診断›
ルーチン・インターフェイスのチェック] を いいえ に設定します。 図 84. 引数チェック範囲の設定 6.7.2. ローカル変数の扱い CVF ではローカル変数は静的に扱います。そのため、一度ある関数を抜けた後、再度その関数がコールされ た場合、その関数のローカル変数は前回の値を保持しています。また静的扱いの変数は初期値に 0 が自動で 設定されます。 この動作を前提に作成されたプログラムは IVF では異なる結果を出力する可能性があります。プロジェクト・ プロパティから [Fortran›
データ›
ローカル変数の格納場所] に /Qsave を設定します。6.7.3. 浮動小数点数演算 CVF でコンパイルした場合、浮動小数点数演算に x87 命令を使用しますが、IVF では SSE 命令を使用する ため、出力結果や挙動に違いが発生する可能性があります。プロジェクト・プロパティから [Fortran
›
浮動小 数点›
浮動小数点モデル] を /fp:source に設定し、また [Fortan›
コード生成›
拡張命令セットを有効にす る] を /arch:IA32 に設定します。6.8. 本製品付属ドキュメントの参照
製品付属のドキュメントを参照するには、スタートメニューからアクセスしてください。Getting Started は、 リリースノートやサンプルプログラムの紹介、また各種情報サイトへのリンクが貼られています。その他、本製 品にバンドルされる数値演算ライブラリー(MKL)へのマニュアルや各種チュートリアルも参照可能です。 コマンドラインからは、/help コマンドにてコンパイラーオプションに関するヘルプが表示できます 図 86. ヘルプの表示7. お問い合わせ
ご質問、ご意見ございましたら以下のお問合せフォームからお問合せください。 お問い合わせ窓口 URL: https://www.xlsoft.com/jp/services/xlsoft_form.html8. 参考資料
インテル® Parallel Studio XE 製品ページ 関連書籍の紹介 インテル® Fortran コンパイラー OpenMP* 活用ガイド インテル® コンパイラー自動並列化ガイド 日本語環境でのご注意iSUS - IA Software User Society -(インテル® ソフトウェア開発製品に関する技術情報) Compaq* Fortran からの移行について