PGI blue

PGI 2018 コンパイラ製品 リリースノート

 NVIDIA 社 PGI の PGIコンパイラ製品のバージョンPGI 2018 (PGI 18.x) をリリースしましたのでお知らせいたします。本リリースにおける製品の主な新機能、特徴に関してPDFファイルに記述しておりますので、詳細は、以下のPDFファイルをご覧下さい。なお、ソフトウェアは こちらのページにてダウンロード可能です。
 現在の最新バージョンは、PGI 2018(旧バージョン形式で言うと PGI 18.x) となります。年間サブスクリプション契約をご購入あるいはご継続中のお客様は、新リリースのソフトウェアをダウンロードの上、インストールをお願いいたします。「バージョンアップの方法」や最新の「日本語インストールの手引き」は、お客様専用のページへご案内いたしますので、そのページをお分かりにならない場合は、弊社 support@softek.co.jp までご連絡下さい。

Current Version

Product Name Version
PGI Professional Edition for Linux x86 18.10
PGI Professional Edition for Linux OpenPOWER 18.10
PGI Professional Edition for Windows 18.10
PGI Visual Fortran for Windows 18.7
PGI CDK for Linux (ご契約ユーザ様専用ページにて) 18.10
PGI Community Edition for Linux x86, Win64, OpenPOWER and macOS (2018/11/13版) 18.10

PGI製品のお求めは、米国 PGI と 25 年以上に及ぶ強力なパートナーであるソフテックへ

PGI 2018 (PGI 18.x) リリース

各リビジョンのサマリー

◎PGI 18.10 (released November 13, 2018)

すべてのコンパイラ

  • Windows の PGI コンパイラを MicrosoftのVisual Studio 2017 ツールチェーンを使用するように更新しました。 Windows上の PGI コンパイラには、インストールの前提条件として Microsoft Visual Studio 2017 が必要です。
  • Windows 上の PGI コンパイラパッケージを 1つのインストール実行ファイルにまとめました。 PGI Community Edition とPGI Professional 用の別個のインストールパッケージはなくなりました。
  • PGI Compiler Assisted Software Testing(PCAST)の自動コンパイル機能の出力形式と可読性が向上しました。
  • オートコンプリートのための patch-and-continue サポートを追加しました。 誤った値が検出されると、自動コンパイルは警告を出し、不良値を既知の正常な値に置き換えて実行を続行します。 詳細は、PCAST 概要を参照してください。
  • バグフィックス

C/C++

  • C コンパイラとC++ コンパイラでは、可視性(visibility)のための GCC 互換のサポートが追加されました。 このコンテキストでの可視性とは、シンボルを共有ライブラリからどのようにエクスポートするかを記述します。 デフォルトでは、関数はグローバルスコープを持ち、他のオブジェクトから呼び出すことができます。 非表示の可視性を持つ関数はローカルスコープを持ち、他のオブジェクトから呼び出すことはできません。
  • コンパイラは現在 -fvisibility と-fvisibility-inlines-hidden スイッチを実装しています。
    • -fvisibility = [default | internal | hidden | protected]
      このスイッチは、デフォルトのELFイメージシンボル可視性を設定する方法をコンパイラに指示します。 このスイッチまたは可視性属性で上書きされない限り、すべてのシンボルはグローバルな可視性でマークされます。
    • -fvisibility-inlines-hidden
      このスイッチは、コードが2つの関数のアドレスが異なるオブジェクトからのインライン関数へのポインタを比較しないことをコンパイラに伝えます。 このオプションは、インラインメソッドを __attribute __((visibility( "hidden")))でマークするのと同じ効果を持ちます。

Fortran

  • Fortran 2018 DO CONCURRENT のサポートが追加されました。なお、現時点では DO CONCURRENT ブロックの本体は serial で実行されます。
  • LLVMベースのコードジェネレータ でコンパイルするときに、Fortran の COMMON ブロックのデバッグメタデータを生成するようになりました。
  • 小さな行列の Fortran MATMUL 性能を改善しました。

OpenACCとCUDA Fortran

  • CUDA Toolkit バージョン10.0 のサポートが追加されました。 CUDA Toolkit バージョンのサポートの詳細については、CUDA Toolkit のバージョンを参照してください 。
  • Linux プラットフォーム上の共有オブジェクト内にリロケータブルデバイスコードを使用するためのサポートが追加されました。
  • -Mcuda でコンパイルするときに、C および C++コンパイラに _CUDA および __CUDA_API_VERSION の定義を追加しました。
  • Windowsの -ta=tesla と -Mcuda スイッチの nollvm サブオプションを無効にしました。 Windows コンパイラは nollvm を無視し、その旨の警告を出します。

OpenMP

  • OMP_MAX_ACTIVE_LEVELS のデフォルト値をいわゆる INT_MAX 値(整数の最大値)に変更しました 。

◎PGI 18.7 (released August 16, 2018)

Linux版のすべてのコンパイラ

  • Linux/86-64 およびLinux/OpenPOWER プラットフォーム用の LLVM ベースのコードジェネレータは、現在、LLVM 6.0 に基づいています。 オプション -Mllvm コンパイラフラグを使用して、Linux/x86-64ターゲット上でLLVMベースのコードジェネレータによって生成された実行ファイルのパフォーマンスは、いくつかの重要なベンチマークでデフォルトのPGI コードジェネレータよりも平均 15% 高速です。 LLVM ベースのコードジェネレータは、将来の PGIリリースですべての x86-64, OpenPOWER ターゲットにおいてデフォルトになります。
  • PGI コンパイラは、GCC 8.1 までのGNUバージョンとの相互運用が可能になりました。 これには、PGI C++ コンパイラと g++ 8.1 との相互運用性、すべてのPGIコンパイラが GCC 8.1 のツールチェーンコンポーネント、ヘッダファイル、ライブラリと相互運用できる機能が含まれます。

Fortran

  • Fortran 2008サブモジュールを実装しました。 サブモジュールは、モジュールまたは別のサブモジュールを拡張するプログラム単位です。
  • 割り当て可能変数への代入のデフォルトの動作は、ホストと GPU のデバイスコード生成の両方で Fortran 2003 のセマンティクスに一致するように変更されました。 この変更は、カーネルディレクティブ内で Fortran の割り当て可能な配列の割り当てが行われる場合に、パフォーマンスに影響する可能性があります。 詳細および推奨される回避策については、Fortran 2003 Allocatables のパフォーマンスへの影響を参照してください。 この変更は、コンパイルごとに-Mallocatable=95オプションを追加することによって 18.7 より前の Fortran 1995 のセマンティクスの動作に戻すことができます。
  • LLVMベースのコードジェネレータを使用すると、Fortran コンパイラはモジュール変数用の LLVM デバッグメタデータを生成し、デバッグメタデータの品質は一般的に向上します。
  • 自由形式のソース行は、最大で 1000 文字にすることができます。
  • すべての Fortran CHARACTER エンティティは、64ビット整数長で表されます。

OpenACC と CUDA Fortran

  • Fortran、C、および C++ での集約データ構造のための OpenACC 3.0 真のディープ・コピー・ディレクティブのドラフトの実装のサポートを追加しました。 真のディープ・コピー・ディレクティブを使用すると、プログラムの異なるポイントに異なるメンバー・セットをコピーできる名前付きポリシーのサポートを含め、集約データ宣言内でホストとデバイスのメモリー間を移動するメンバーのサブセットを指定できます。 詳細については、 ディープコピーの概要を参照してください。
  • OpenACC 自動コンパイルを含む PGI Compiler Assisted Software Testing(PCAST)機能のサポートが追加されました。 新しい -ta=tesla:autocompare コンパイラオプションを使用すると、OpenACC の計算領域が CPU と GPU の両方で重複して実行され、GPU の結果が CPU で計算された結果と比較されます。 PCAST​は新しいランタイム pgi_compare または acc_compare API 呼び出しの形式で使用することもできます。 どちらの場合でも、PCAST​は計算結果と既知の正しい値を比較し、データがユーザー指定の許容範囲内で一致しない場合はエラーを報告します。 両方の形式は、ホスト CPU と GPU 間の計算上の相違点を特定するのに役立ちます。また、異なるプロセッサアーキテクチャで実行するためにコンパイルされたプログラムの数値的な違いを調べるために、API 呼び出しをより一般的に使用できます。 新しい PCAST​機能の使用の詳細については、PCAST 概要を参照してください。
  • コンパイラは、コンパイルに使用するシステムにインストールされている CUDA ドライバと一致するように、デフォルトのCUDA バージョンを設定するようになりました。 CUDA 9.1 および CUDA 9.2 toolkit は、PGI 18.7 リリースにバンドルされています。 CUDA 8.0 や CUDA 9.0 を含む旧式の CUDA ツールチェーンは、サイズを最小限に抑えるために PGI インストールパッケージから削除されましたが、新しい共存機能を使用して引き続きサポートされています。 -ta=tesla または -McudaにcudaX.Y サブオプションを指定しない場合の扱いは、使用する CUDA Toolkit のバージョン制御をご覧ください。
  • デフォルトのNVIDIA GPU Compute Capability リストを変更しました。 コンパイラは現在、コンパイルするシステムにインストールされている GPU のものと一致するデフォルトの計算能力リストを作成します。 -ta=tesla または -Mcuda に Compute Capability のサブオプションを指定しない場合は、この変更が Compute Capability にどのように影響するかについてをご覧ください
  • PGI_ACC_POOL_ALLOC_MINSIZE のデフォルトサイズを 16B から 128B に変更しました。 この環境変数は、アクセラレータコンパイラの CUDA Unified Memory プールアロケータによって使用されます。 PGI_ACC_POOL_ALLOC_MINSIZE を16Bに設定すると、ユーザーは18.7より前の動作に戻ることができます。
  • OpenACCエラー処理コールバックルーチンを使用して、GPU で実行中にトリガされたエラーをインターセプトする方法の例を追加しました。説明とコードサンプルについては、 OpenACCエラー処理を参照してください。
  • すべてのプラットフォーム上のOpenACCアクセラレータ領域内でのアサーション関数呼び出しのサポートが追加されました

OpenMP

  • OpenMP 4.5 の collapse 節を含む「distributed parallel」ループ・コンストラクトのコード生成を向上させ、複数のアプリケーションとベンチマークでパフォーマンスが改善しました。
  • LLVM ベースのコードジェネレーターを使用すると、Fortran コンパイラーは OpenMP スレッド専用変数の DWARF デバッグ情報を生成するようになりました。

ユーティリティー

  • pgaccelinfo ツールの出力を変更しました。 pgaccelinfo の出力の最後の行のラベルは "PGI Default Target"になりましたが、18.7 より前のリリースでは "PGI Compiler Option" というラベルが使用されていました
  • ツール pgcpuid の出力を変更しました。 pgcpuid の出力の最後の行のラベルは "default target" になりましたが、18.7より前のリリースでは "type" というラベルが使用されていました。

その他

機能廃止項目

  • Fermi GPU - PGI 18.7 では、NVIDIA Fermi GPU または Compute capability 2.0 のサポートが廃止されました。
  • Windows - PGI 18.7 は、バンドルされた Microsoft のツールチェーンコンポーネントを含む最後のリリースです。 将来のリリースでは、システムに Microsoft ツールチェーンコンポーネントが予めプリインストールされている必要があります。 重要:PGI Professional for Windowsライセンスを2018年8月31日までに購入したユーザーのみ、PGI 18.7以前の PGI Professional for Windows リリースにアクセスできます。これは絶対期限です。 次の Windowsリリースは 18.10 Community Edition(無償版) になる可能性が高いため、2018年9月1日から19.1のリリース時点まで、PGI Professional for Windows の「新規」ライセンス販売を一時休止します。 ただし、この間、既存のお客様のサブスクリプション(ソフトウェア情報パッケージ)の更新の販売については継続しますのでご用命下さい。詳しくは、こちらをご覧ください。

◎PGI 18.5 (released May 31, 2018)

  • CUDA 9.2をサポート。cuda9.2サブオプションを-ta= teslaまたは-Mcudaコンパイラオプションとともに使用して、統合されたCUDA 9.2ツールキットコンポーネントをコンパイルおよびリンクできます。
  • macOS 上の Xcode 9.3 のサポートが追加されました。
  • 最適化された(非デバッグ)モードのランタイムトレースバックにおける機能オフセット情報が改善されました。
  • バグフィックス

◎PGI 18.4 (released April 26, 2018)

  • PGI Community Edition の新バージョンをリリースしました。
  • CUDA_HOMEを使用してCUDA 9.2の有効なインストール場所にコンパイラに指示することにより、CUDA 9.2のサポートが追加されました。なお、この場合、CUDA 9.2 は自身でインストールする必要があります。CUDA 9.2 は、このリビジョンではPGIのインストールパッケージ二バンドルされておりません。
  • (Fortran) 内部プロシージャ、割り当てられたプロシージャポインタ、およびプロシージャ仮引数の実際の引数として渡される内部プロシージャのサポートが追加されました。
  • (Fortran) イニシャライザー内で、組み込み関数SCALE、MAXVAL、MINVAL、MAXLOCおよびMINLOCのサポートが追加されました。
  • バグフィックス

◎PGI 18.3 (released March 19, 2018)

  • C/C++ : __builtin_return_address関数と__builtin_frame_address関数を実装しました。 Linux/x86上で LLVM コードジェネレータコンパイラで利用可能です。
  • バグフィックス

◎PGI 18.1 (released February 16, 2018)

  • Intel Skylake、AMD Zen、および IBM POWER9 CPU のサポート
  • 最新の Intel Xeon プロセッサー上の AVX-512コード生成
  • OpenACC 2.6ディレクティブベースの並列プログラミング機能の提供
  • x86-64 および OpenPOWER マルチコアCPU用 OpenMP 4.5(GPU offload 機能を除く)
  • Tesla GPU用の統合されたCUDA 9.1ツールキットとライブラリ
  • 自動CUDA Fortranカーネルスケジュール
  • 部分的なC++17のサポート
  • GCC 7.2の相互運用性
  • AVX-512サポートを含む新しい PGI fastmath 組み込み関数ライブラリ
  • オプションを指定することにより LLVM ベースのコードジェネレータ(Linux x86-64用)を使用可能
  • 更新されたMPICH、MVAPICH および Open MPI ライブラリ(プリコンパイル済み)
  • 更新されたNetCDF、パラレルNetCDFおよびESMFライブラリ(プリコンパイル済み)
  • PGIプロファイラの強化されたCPUスレッドビュー
  • OpenMP パフォーマンスツール(OMPT)インタフェースのサポート
  • 最新のオペレーティングシステムのサポート
  • x86-64プラットフォームでのライセンス管理ソフトウェアの更新
  • ユーザーが要求した52の enhancements and fixes

x86 CPU用 PGI 2018 リリースノート

重要: PGI 2018リリースには、 セキュリティ脆弱性に対処するための最新のFlexNetライセンス管理ソフトウェアが含まれています 。 以前のPGIリリースのユーザは、PGI 18.1以降のリリースを有効にするためにFlexNetライセンスデーモンを更新する必要があります。 詳細については、下記の「サードパーティ製のソフトウェアセキュリティアップデート」および「FlexNetアップデートFAQ」を参照してください。

1. PGI 2018の新機能

2018年にリリースされた PGI 製品の新機能、変更された機能、廃止予定の機能、削除された機能をすべて網羅しています。

1.1 18.1の新機能

主な特徴

  • 最新のIntel Xeonプロセッサー上の AVX-512命令セットのサポートを含む、Intel Skylake および AMD Zen プロセッサーのサポートが追加されました。
  • OpenACC 2.6の完全なサポートを追加しました。
  • チューニングのヒントとしてのSIMD指示文を含む、マルチコアCPU用のOpenMP 4.5のサポートが強化されました。 OpenMP 4.5はLinux / x86上でLLVMコードジェネレータでサポートされています(下記参照)。
  • 最新の NVIDIA Volta V100 GPU を含むCUDA 9.1ツールキットのサポートが追加されました。

OpenACC and CUDA Fortran

  • コンパイラで使用されるデフォルトのCUDAツールキットをCUDA Toolkit 8.0に変更しました。
  • コンパイラによって選択されたデフォルトの Compute Capability を cc35、cc50、cc60 に変更しました 。
  • CUDA Toolkit 9.1 のサポートが追加されました。
  • OpenACC 2.6 仕様をフルサポートしました。
    • serial construct
    • if and if_present clauses on host_data construct
    • no_create clause on the compute and data constructs
    • attach clause on compute, data, and enter data directives
    • detach clause on exit data directives
    • Fortran optional arguments
    • acc_get_property, acc_attach, and acc_detach routines
    • profiler interface

CUDA Fortran の起動設定にアスタリスク('*')構文のサポートが追加されました。 最初の実行コンフィギュレーションパラメータとしてアスタリスクを指定すると、コンパイラは起動コンフィギュレーション内のスレッドブロックの数を自由に計算できます。

cudaOccupancyMaxActiveBlocksPerMultiprocessor と cudaOccupancyMaxActiveBlocksPerMultprocessorWithFlags の2つの新しい CUDA Fortran インターフェイスが追加されました。 これらは CUDAランタイムにフックを提供し、グリッド同期起動で使用できるスレッドブロックの最大数を手動で取得します(上記のアスタリスク構文で提供されているのと同じです)。

OpenMP

  • OMP_MAX_ACTIVE_LEVELS のデフォルトの初期値を1から16に変更しました。
  • taskloop 構造体の firstprivate および lastprivate 節のサポートが追加されました。
  • OpenMPパフォーマンスツール(OMPT)インターフェイスのサポートが追加されました。 Linux上のLLVMコードジェネレータコンパイラで利用できます。

C++

GCC 7.2によるGNUの相互運用性のサポートが追加されました。

エクスプレッションif、fold式、構造化バインディング、その他いくつかのC++17の機能を含む C++17 の部分サポートを追加しました。 サポートされている機能の一覧については、 C++17 を参照してください。

Fortran

PGIコンパイラランタイムがFortran配列記述子の初期化をどのように処理する方法を変更しました。 この変更は、Fortran 2003を使用するプログラムをPGI 18.1で再コンパイルする必要があることを意味します。

Libraries

Fortranの cuBLAS および cuSolver モジュールを再編成して、Fortranプログラム単位で2つのモジュールを一緒に使用できるようにしました。 この再編成の結果、cuBLAS または cuSolver モジュールを使用するコードは、このリリースと互換性があるように再コンパイルする必要があります。

新しいPGI数学ライブラリ libpgm を追加しました。 libpgc、libpgftnrtl、および libpgf90rtl から数学ルーチンを libpgm に移動しました。 この変更は、リンク行に libpgc、libpgftnrtl、または libpgf90rtl を明示的に追加していない限り透明です。

AVX2 および AVX512F プロセッサ用の単精度スカラー/ベクトルsin/cos/tan 用の新しいファストマートルーチンを追加しました。

C99スカラー複合組み込み関数のサポートが追加されました。

ベクトル複合組み込み関数のサポートが追加されました。

組み込み関数のランタイム動作を制御するための環境変数の追加:

MTH_I_ARCH={em64t,sse4,avx,avxfma4,avx2,avx512knl,avx512}
実行時に決定されたアーキテクチャ/プラットフォームをオーバーライドします。
MTH_I_STATS=1
基本機能の基本的なランタイム統計情報(呼び出し回数、要素数、合計に対する割合)を提供します。
MTH_I_STATS=2
要素サイズ(単精度/倍精度スカラー、単精度/倍精度のベクトルサイズ)による詳細なコールカウントを提供します。
MTH_I_FAST={relaxed,precise}
高速組み込み関数(デフォルト)のコンパイル時間の選択をオーバーライドし、リラックスしたバージョンまたは正確なバージョンに置き換えます。
MTH_I_RELAXED={fast,precise}
リラックスした組み込み関数のコンパイル時の選択(-Mfprelaxed= intrinsicのデフォルト)をオーバーライドし 、高速または正確なバージョンで置き換えます。
MTH_I_PRECISE={fast,relaxed}
正確な組み込み関数のコンパイル時の選択( -Kieeeのデフォルト)をオーバーライドし 、高速版またはリラックス版に置き換えます。

Profiler

スレッドごとに費やされた時間の内訳を含めるために、CPU Details Viewを改善しました。

PCのサンプリング周波数を選択させるオプションを追加しました。

NVLinkバージョンを組み込むようにNVLinkトポロジを拡張しました。

CSV形式でエクスポートする際の相関IDを含むようにプロファイリングデータを拡張しました。

Operating Systems and Processors

AMD Zen(EPYC、Ryzen)プロセッサアーキテクチャのサポートが追加されました。 AMD Zenを明示的に対象にするには、 -tp= zenコンパイラオプションを使用します。

Intel Skylakeプロセッサー・アーキテクチャーのサポートが追加されました。 Intel Skylakeを明示的にターゲットにするには、 -tp= skylakeコンパイラオプションを使用します。

Intel Knights Landingプロセッサー・アーキテクチャーのサポートが追加されました。 Intel Knights Landingを明示的にターゲットにするには、 -tp= knlコンパイラオプションを使用します。

LLVM Code Generator

LLVM コードジェネレータと OpenMP ランタイムを備えたPGI Linux/x86-64コンパイラのプロダクション版をリリースしました。 これらのコンパイラは、linux86-64のデフォルトの PGI x86-64 コンパイラとともにインストールされた PGIインストールディレクトリ linux86-64-llvm にあります。 詳細は、「 LLVMコードジェネレータ 」を参照してください。

License Management

FlexNet Publisher のライセンス管理ソフトウェアが v11.14.1.3 に更新されました。

  • Windows上のセキュリティ脆弱性 詳細については、下記の「サードパーティ製ソフトウェアセキュリティアップデート」およびFlexNet Update FAQを参照してください。
  • オフライン使用のためにライセンスを借用する場合のネットワークフローティングライセンスサーバーのシートカウントの安定性の向上 借りた座席を早期に返却するには、lmborrowの新しい "-bv"オプションを呼び出す必要があります。 詳細については、license borrowing FAQ

重要: PGI 2017(17.x)以前のユーザーは、ライセンスデーモンを更新して18.1以降をサポートする必要があります。 新しいライセンスデーモンは古いPGIリリースと下位互換性があります。

Deprecations and Eliminations

次のLinuxバージョンのサポートを終了しました。

  • CentOS 5 through 6.3
  • Fedora 6 through 13
  • openSUSE 11 through 13.1 and openSUSE Leap through 42.2
  • RHEL through 6.3
  • SLES 11
  • Ubuntu 12.04

2.12より古いバージョンのglibcのサポートを終了しました。

MacOSバージョン10.9(Mavericks)のサポートを終了しました。

CUDA Toolkitバージョン7.5のコンポーネントをPGIパッケージに含めることを終了しました。 CUDA_HOMEを使用してCUDA 7.5の有効なインストール場所にコンパイラを誘導すると、CUDA 7.5を引き続きターゲットにすることができます。

廃止された従来のPGIアクセラレータ・ディレクティブ。 コンパイラが廃止予定の旧来のPGIアクセラレータ指directive (OpenACC の前に使用されていたもの)を検出すると、警告が出力されます。 この警告には、非推奨ディレクティブが存在する場合はそれに対応するOpenACCディレクティブが含まれます。 廃止されたディレクティブに関する警告は、新しいレガシーサブオプションを-accコンパイラオプションに使用することで抑制できます。 以下のライブラリルーチンは廃止予定です:acc_set_device、acc_get_device、およびacc_async_wait; これらは、acc_set_device_type、acc_get_device_type、およびacc_waitに置き換えられています。 推奨されない環境変数は、ACC_NOTIFY および ACC_DEVICE です。 それらはそれぞれ PGI_ACC_NOTIFY と PGI_ACC_DEVICE_TYPE に置き換えられました。 従来のPGIアクセラレータディレクティブのサポートは、将来のリリースで削除される可能性があります。

CUDA x86のサポートを中止しました。 -Mcudax86コンパイラオプションはサポートされなくなりました。

CUDA Fortranエミュレーションモードのサポートが中止されました。 -Mcuda= emuコンパイラー・オプションはサポートされなくなりました。

サードパーティ製ソフトウェアセキュリティアップデート

Table 1. PGI 18.1 のサードパーティ製ソフトウェアセキュリティアップデート
CVE ID Description
CVE-2016-10395 Windowsの脆弱性に対処するため、FlexNet Publisherをv11.14.1.3にアップデートしました。 すべてのユーザーがライセンスデーモンを更新することをお勧めします。 see the FlexNet Update FAQ. For more information, see the Flexera website.

1.2. OpenACC

以下のセクションでは、OpenACCのPGIコンパイラサポートの更新について詳しく説明します。

1.2.1. OpenACCエラー処理

OpenACC仕様には、GPU上で実行中にトリガされたエラーを傍受し、プログラムが終了する前に特定のルーチンを応答するためのメカニズムが用意されています。 たとえば、GPUでメモリを割り当てている間にMPIプロセスが失敗した場合、アプリケーションは、プログラムが終了する前に、他のすべてのプロセスをシャットダウンするようにMPI_Abortを呼び出すことがあります。 このセクションでは、この機能を利用する方法について説明します。

エラーを傍受するには、アプリケーションはOpenACCランタイムにコールバックルーチンを与えなければなりません。 コールバックを提供するために、アプリケーションはacc_set_error_routineをコールバックルーチンへのポインタで呼び出します。

インタフェースは次のとおりです。ここで、 err_msg にはエラーの説明が含まれています。

注:この機能はエラー回復と同じではありません。 コールバックルーチンがアプリケーションに戻ると、その振る舞いは明らかに未定義です。

typedef void (*exitroutinetype)(char *err_msg);
extern void acc_set_error_routine(exitroutinetype callback_routine);

OpenACCランタイムがランタイムエラーを検出すると、callback_routineが呼び出されます 。

例を使って、この機能をより深く見てみましょう。MPI プログラムを以下の 2 つのプロセスで実行します。 プロセス 0 は、GPU 上に大きな配列を割り当てようとした後、第2のプロセスにメッセージを送り、操作の成功を確認します。 プロセス 1 は肯定応答を受信し、肯定応答を受信すると終了します。

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

#define N 2147483648

int main(int argc, char **argv)
{
  int rank, size;

  MPI_Init(&argc, &argv);

  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);

  int ack;
  if(rank == 0) {
    float *a = (float*) malloc(sizeof(float) * N);

#pragma acc enter data create(a[0:N])
#pragma acc parallel loop independent
    for(int i = 0; i < N; i++) {
      a[i] = i *0.5;
    }
#pragma acc exit data copyout(a[0:N])
    printf("I am process %d, I have initialized a vector of size %ld bytes on the GPU. Sending acknowledgment to process 1.", rank, N);
    ack = 1;
    MPI_Send(&ack, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
  } else if(rank == 1) {
    MPI_Recv(&ack, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("I am process %d, I have received the acknowledgment from process 0 that data in the GPU has been initialized.\n", rank, N);
    fflush(stdout);
  }

  // do some more work

  MPI_Finalize();

  return 0;
}

以下のようにプログラムをコンパイルします。

$ mpicc -ta=tesla -o error_handling_mpi error_handling_mpi.c

2つのMPIプロセスでこのプログラムを実行すると、出力は次のようになります。

$ mpirun -n 2 ./error_handling_mpi
Out of memory allocating -8589934592 bytes of device memory
total/free CUDA memory: 11995578368/11919294464
Present table dump for device[1]:
NVIDIA Tesla GPU 0, compute capability 3.7, threadid=1
...empty...
call to cuMemAlloc returned error 2: Out of memory

-------------------------------------------------------
Primary job terminated normally, but 1 process returned
a non-zero exit code.. Per user-direction, the job has been aborted.
-------------------------------------------------------
--------------------------------------------------------------------------
mpirun detected that one or more processes exited with non-zero status,
thus causing the job to be terminated.

GPUでメモリを割り当てる際にプロセス0が失敗し、エラーで予期せず終了しました。 この場合、 mpirunはプロセスの1つが失敗したことを特定できたので、残りのプロセスを停止し、アプリケーションを終了しました。 このような単純な2プロセスプログラムは、デバッグするのは簡単です。 実際のアプリケーションでは、何百から何千ものプロセスで、プロセスの終了が早すぎると、アプリケーションが無期限にハングアップする可能性があります。 したがって、プロセスの失敗をキャッチし、他のプロセスの終了を制御し、有用なエラーメッセージを提供することが理想的です。

OpenACCのエラー処理機能を使用して、以前のプログラムを改善し、MPIプロセスが失敗した場合にアプリケーションを正しく終了させることができます。

次のサンプルコードでは、GPUで実行中にプロセスでエラーが発生した場合、他のプロセスをシャットダウンするエラー処理コールバックルーチンを追加しました。 プロセス0は大きな配列をGPUに割り当てようとし、操作が成功するとプロセス0はプロセス1に肯定応答を送信します。プロセス0はOpenACC関数acc_set_error_routineを呼び出して関数handle_gpu_errorsをエラー処理コールバックルーチンとして設定します。 このルーチンはメッセージを出力し、 MPI_Abortを呼び出してすべてのMPIプロセスをシャットダウンします。 プロセス0がGPU上でアレイを正常に割り当てると、プロセス1は肯定応答を受信します。 それ以外の場合、プロセス0が失敗すると、プロセス自体が終了し、 handle_gpu_errorsへの呼び出しがトリガーされます 。 プロセス1は、コールバックルーチンで実行されるコードによって終了されます。

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

#define N 2147483648


typedef void (*exitroutinetype)(char *err_msg);
extern void acc_set_error_routine(exitroutinetype callback_routine);

void handle_gpu_errors(char *err_msg) {
  printf("GPU Error: %s", err_msg);
  printf("Exiting...\n\n");
  MPI_Abort(MPI_COMM_WORLD, 1);
  exit(-1);
}


int main(int argc, char **argv)
{
  int rank, size;

  MPI_Init(&argc, &argv);

  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);

  int ack;
  if(rank == 0) {
    float *a = (float*) malloc(sizeof(float) * N);

    
    acc_set_error_routine(&handle_gpu_errors);
    

#pragma acc enter data create(a[0:N])
#pragma acc parallel loop independent
    for(int i = 0; i < N; i++) {
      a[i] = i *0.5;
    }
#pragma acc exit data copyout(a[0:N])
    printf("I am process %d, I have initialized a vector of size %ld bytes on the GPU. Sending acknowledgment to process 1.", rank, N);
    fflush(stdout);
    ack = 1;
    MPI_Send(&ack, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
  } else if(rank == 1) {
    MPI_Recv(&ack, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("I am process %d, I have received the acknowledgment from process 0 that data in the GPU has been initialized.\n", rank, N);
    fflush(stdout);
  }

  // more work

  MPI_Finalize();

  return 0;
}

再度、プログラムをコンパイルします。

$ mpicc -ta=tesla -o error_handling_mpi error_handling_mpi.cc

2つのMPIプロセスでこのプログラムを実行すると、出力は次のようになります。

$ mpirun -n 2 ./error_handling_mpi
Out of memory allocating -8589934592 bytes of device memory
total/free CUDA memory: 11995578368/11919294464
Present table dump for device[1]:
NVIDIA Tesla GPU 0, compute capability 3.7, threadid=1
...empty...
GPU Error: call to cuMemAlloc returned error 2: Out of memory
Exiting...

--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 1.

今回は、エラー処理コールバックルーチンでGPUを管理していたアプリケーションによって、GPUのエラーが傍受されました。 この場合、ルーチンは問題に関するいくつかの情報を表示し、 MPI_Abortを呼び出して残りのプロセスを終了し、アプリケーションからの予期しない動作を回避します。

1.2.2. Fortran 2003 Allocatablesのパフォーマンスへの影響

PGI 18.7リリースでは、allocatables への代入に対する Fortran 2003 のセマンティクスをデフォルト動作としました。 この変更は、ホストコードとデバイスコードに同様に適用されます。 以前は、Fortran 1995 のセマンティクスがデフォルトとして使用していました。 Fortran 2003 のセマンティクスへの変更は、 OpenACC kernels ディレクティブが使用されている場合にパフォーマンスに影響を与える可能性があります。以前の F95 セマンティックスを明示的に使用したい場合は、コンパイルオプション -Mallocatable=95 を指定して下さい。
次の Fortran 割り当て可能配列の割り当てが Fortran 2003 仕様を使用してコンパイルされると、コンパイラは配列割り当ての並列コードを生成できません。 この場合の並列性の欠如は、パフォーマンスに悪影響を与える可能性があります。

real, allocatable, dimension(:) :: a, b
  allocate(a(100), b(100))
  a = 3.14

  !$acc kernels
  a = b
  !$acc end kernels

代わりに配列セクションの割り当てを使用するようにサンプルコードを変更することができます。 コンパイラは配列セクションの割り当てを並列化して、失われたパフォーマンスを取り戻すことができます。

a(:) = b(:)

1.3. OpenMP

OpenMP 3.1

PGI Fortran、C、およびC++コンパイラは、すべてのプラットフォームでOpenMP 3.1をサポートしています。

OpenMP 4.5

PGI Fortran、C、およびC++コンパイラは、マルチコアCPUまたはサーバのすべてのコアで並列実行のためにほとんどのOpenMP 4.5プログラムをコンパイルすることができます。 ターゲットリージョンはマルチコアホストをターゲットとしてデフォルトでサポートされ、 parallelおよびdistributeループはすべてのOpenMPスレッドに渡り並列化されて実装されます。 この機能は、LLVM コードジェネレータのみの Linux/x86 ならびに Linux/OpenPOWER プラットフォームでサポートされています。

現在の制限事項は次のとおりです。

  • simd construct は、チューニングのヒントを提供するために使用できます。 simd 構造の private, lastprivate, reduction および collapse 節が処理され、サポートされます。
  • declare simd construct は無視されます。
  • 順序付けられた構文simdは無視されます。
  • task construct'のdependとprioritはサポートされていません。
  • loop constructのlinear, schedule, ordered(n) 節はサポートされていません。 are not supported.
  • declare reduction directive はサポートされていません。

1.4. PCAST 概要

PGI Compiler Assisted Software Testing(PCAST)は、プログラムの正確性をテストし、発散する場所を特定するための機能セットです。 PCAST を呼び出す方法は3つあります。 pgi_compare または acc_compare 実行時呼び出し、または autocompare コンパイラ・フラグを使用します。
簡単な例でPCASTを利用できるさまざまな方法を見てみましょう。 次の C プログラムは、ヒープ上にサイズの 2つの配列を割り当て、GPU にデータをコピーし、内部ループを実行するためのワーカーのギャングを作成します。 次のいくつかの段落では、PCASTを使用してプログラムの正確性をテストするさまざまな方法を示します。

int main() {
  int size = 1000;
  int i, t;
  float *a1;
  float *a2;

  a1 = (float*)malloc(sizeof(float)*size);
  a2 = (float*)malloc(sizeof(float)*size);

  for (i = 0; i < size; i++) {
    a1[i] = 1.0f;
    a2[i] = 2.0f;
  }

#pragma acc data copy(a1[0:size], a2[0:size])
  {
    for (t = 0; t < 5; t++) {
      #pragma acc parallel
      for(i = 0; i < size; i++) {
        a2[i] += a1[i];
      }
    }
  }

  return 0;
}

PCAST を呼び出すための最初の、そして最も簡単な方法は、自動コンパイルコンパイラフラグの使用です。 コンパイラー・オプションでの-ta=tesla:autocompareの設定は、 自動コンパイル機能を呼び出すために必要な唯一の変更です。 このオプションを使用してコンパイルすると、OpenACC計算領域のコードが CPU および GPU 上で重複して実行されます。 計算されたデータが GPU からホストメモリにコピーされるたびに、CPU 上で計算された値と比較されます。 したがって、 copy, copyout, update host ディレクティブのデータはすべて比較されます。 -ta=tesla:autocompare は -ta= tesla:redundantが暗黙に指定されることに注意してください。
次のようにコンパイルします。

$ pgcc -Minfo=accel -ta=tesla:autocompare -o a.out example.c

プログラムを実行する前に、PCAST​​の動作を制御するために設定できる環境変数が2つあります。 最初はPGI_COMPAREです。 この環境変数には、比較のさまざまなパラメータを制御するオプションのカンマ区切りリストが含まれています。 たとえば、相対的または絶対的な許容値のしきい値を設定したり、最初に見つかった差異で停止したりすることができます。 使用可能なオプションの完全なリストについては、「ユーザーズ・ガイド」を参照してください。
2番目のオプションは、自動コンパイルに固有のPGI_ACC_DEBUGです。 ホストが何をどこで比較しているかについて、より詳細なデバッグを有効にします。

$ PGI_COMPARE=summary,rel=1 PGI_ACC_DEBUG=0x10000 ./a.out

comparing a1 in example.c, function main line 26

comparing a2 in example.c, function main line 26
compared 2 blocks, 2000 elements, 8000 bytes
no errors found
 relative tolerance = 0.100000, rel=1

自動コンパイルは、適切なデータ指令の実行時にすべてのデータの違いを自動的に検出します。
データをacc_compare 関数と明示的に比較できます。 呼び出されると、GPU メモリ内のデータと CPU メモリ内の対応するデータを比較します。なお、OpenACC 計算領域ではなく、CPU コードから呼び出さなければなりません。 したがって、 -ta=tesla:redundant でコンパイルする必要があります。
参考までに、 acc_compare のシグネチャは次のとおりです。

acc_compare(x, n)

ここで、x は比較するデータ、 n は比較する要素の数です。比較する要素の数はバイト単位ではないことに注意してください。 この例では、 size が整数であっても size 要素を比較したいと考えています 。 タイプを int から double に変更したとしても、呼び出しは同じになります。

#pragma acc data copy(a1[0:size], a2[0:size])
  {
    for (t = 0; t < 5; t++) {
      #pragma acc parallel
      for(i = 0; i < size; i++) {
        a2[i] += a1[i];
      }
      acc_compare(a2, size);
    }
  }

redundantフラグに注意して、次のコマンドでコンパイルします。

 $ pgcc -Minfo = accel -ta = tesla:redundant -o a.out example.c
$ PGI_COMPARE=summary,rel=1 PGI_ACC_DEBUG=0x10000 ./a.out
compared 5 blocks, 5000 elements, 20000 bytes
no errors found
 relative tolerance = 0.100000, rel=1

我々は acc_compare を size 1000 の配列に対して 5 回呼び出すことに注意してください。各要素のサイズは 4バイトで、合計 20,000バイトです。 自動コンパイルでは、データは外部ループの終わりではなくデータ指示の終わりで比較されました。
acc_compareはメモリ内のデータの内容を比較しますが、 pgi_compare は比較するデータをファイルに書き込みます。 その後 pgi_compare を呼び出すと、ファイルとホストメモリ内のデータとの間のデータが比較されます。このアプローチの利点の1つは、「ゴールデン」コピーがすでにファイルに入っているため、連続した比較がより迅速に実行できることです。しかし、このアプローチの欠点は、プログラムが利用しているデータの量に応じてデータファイルが非常に大きくなることです。 一般に、データサイズが比較的小さいプログラムでは、 pgi_compare を使用することをお勧めします。
そのシグネチャは次のとおりです。ここで、a は比較する変数、"type" は変数の文字列、n は比較する要素の数、最後の 2 つの引数はそれぞれ関数名と行番号を指定します。

pgi_compare(a, "type", n, "str", int)
#pragma acc data copy(a1[0:size], a2[0:size])
  {
    for (t = 0; t < 5; t++) {
      #pragma acc parallel
      #pragma acc update host(a2[0:size])
      for(i = 0; i < size; i++) {
        a2[i] += a1[i];
      }
      
      pgi_compare(a2, "float", size, "main", 23);
      
    }
  }

pgi_compareを使用するために、redundant または autocompare オプションを使用してコンパイルする必要はありません。 コードを実行すると、次の結果が得られます。

$ PGI_COMPARE=summary,rel=1 ./a.out
datafile pgi_compare.dat created with 5 blocks, 5000 elements, 20000 bytes
$ PGI_COMPARE=summary,rel=1 ./a.out
datafile pgi_compare.dat compared with 5 blocks, 5000 elements, 20000 bytes
no errors found
 relative tolerance = 0.100000, rel=1

最初にプログラムを実行すると、データファイル "pgi_compare.dat"が作成されます。 後続の実行は、計算されたデータをファイルと比較します。 PGI_COMPARE 環境変数を使用してファイルの名前を設定するか、 PGI_COMPARE=create を使用してプログラムに新しいファイルを作成させることができます 。

追加情報については、 PCAST​ページを参照してください。

1.5. OpenACC Deep Copy 概要

使用法

真のディープ・コピー・ディレクティブを使用すると、プログラムの異なるポイントに異なるメンバー・セットをコピーできる名前付きポリシーを含め、集約データ構造の宣言内でホストとデバイスのメモリー間を移動するメンバーのサブセットを指定できます。
Deep Copyのディレクティブは、 shape と policy の 2つです。 shapeディレクティブは、動的データオブジェクトのサイズを定義するために使用されます。 これは、C / C ++の構造体、クラス、および共用体の定義で特に役に立ちます。この場合、 my_type *ptr のような宣言では、ポインタを介してアクセス可能なデータオブジェクトのサイズに関する情報は含まれません。 対照的に、Fortran は、動的メンバーが境界情報を宣言するように指示します。

C/C++ signature:

#pragma acc shape[](shape-var-list)[clause-list]

Fortran signature:

!$acc shape(shape-var-list)[clause-list]

shape 名は C/C++ ではオプションですが、集約タイプごとに無名シェイプディレクティブを1つまで使用できます。 shape-var-list リストは、データ移動の集約タイプの変数の境界を指定します。 リスト内の各変数は、対応するタイプで定義された動的メンバーでなければなりません。
shape ディレクティブには、 init_needed(var-list)と type(aggregate-type-name)の 2つの節があります。 copy またはcopyin 節を介してデバイスにコピーする必要がある変数は、 init_needed(var-list)内で指定する必要があります。 そのような変数は、メモリが割り当てられた後にデバイスにコピーされます。
type(aggregate-type-name)は、シェイプ・ポリシーが適用する集約タイプを指定するために使用されます。 ディレクティブが集約タイプの定義外に現れる場合にのみ関係します。
policy ディレクティブは、デバイスとホスト間のデータの動きを定義します。 すべての policyディレクティブに名前を付ける必要があります。 各ディレクティブは、shape 名で独自のシェイプ情報を指定することもできます。 shape 名が指定されていない場合は、デフォルトシェイプ情報が使用されます。

C/C++ signature:

#pragma acc policy[clause-list]

Fortran signature:

!$acc policy[clause-list]

データモーション(create,copy,copyin,copyout,update)を記述する節は、集約型で定義された変数のリストを引数として取ります。 通常、create dataディレクティブと exit data ディレクティブのコピーアウトには、create および copyin 節を使用する必要があります。 update 指示文の場合、update句のみが許可されます。
ディープ・コピーを使用可能にするには、プログラムをコンパイルするために使用されるコンパイラ・オプションに -ta=tesla:deepcopy を追加します。
これらの概念のいくつかを示す例を以下に示します。 次のクラス定義を考えてみましょう。

class aggr {
private:
    float* a;
    float* b;
    float* c;
    size_t len;
#pragma acc shape(a[0:len], b[0:len], c[0:len]) init_needed(len)
#pragma acc policy create(a, b, c)
#pragma acc policy copyout(a, b, c)

public:
...
}

shapeディレクティブとpolicyディレクティブに注意してください。 コードは、ポインター a、b、c を長さ len のヒープ割り当て配列を指すように初期化します。 集計データ型の形状を3つのポインタで構成します。 init_needed 節の len メンバーは、struct 変数が create句で発生しても、 len をホストから初期化する必要があることを指定します。
また、 create_all と out_all の 2つの名前付きポリシーを作成して、デバイスとホスト間でデータを移動する方法を指定します。 クラス内の既存のシェイプディレクティブを使用するので、シェイプ情報はポリシーで宣言されません。
クラスのコンストラクタは次のとおりです。

aggr(size_t n) {
    len = n;
    a = new float[len];
    b = new float[len];
    c = new float[len];
}

クラスのインスタンスを作成し、そのメンバ関数のいくつかを呼び出します。

aggr ag(1000);

ag.init();
ag.add();
ag.finish();
void init() {
#pragma acc enter data create(this)

#pragma acc parallel loop present(a, b)
  for(size_t i = 0; i < len; ++i) {
      a[i] = sin(i) * sin(i);
      b[i] = cos(i) * cos(i);
  }
}

init 関数は、 create_all ポリシーを使用してデバイス上にデータを作成します。 その後の並列ループは 、a と b を初期化します。 重要なのは、このポリシーを使用して、デバイス上にデータを作成するよう指定することです。 たとえば、ポリシーから c を省略し、create の代わりに copy に変更すると、 a と b はホストからデバイスにコピーされ、 c はデバイスで作成されます。

#pragma acc policy copy(a, b)
...
#pragma acc enter data create(this)

残りのコードは、sin**2 + cos**2の結果を c に代入し 、 out_all ポリシーに従ってデータをホストにコピーします。

void add() {
#pragma acc parallel loop present(a, b, c)
  for(size_t i = 0; i < len; ++i) {
      c[i] = a[i] + b[i];
  }
}

void finish() {
#pragma acc exit data copyout(this<out_all>)
}
~aggr() {
  delete a;
  delete b;
  delete c;
}

制限事項

deep copy には議論する価値があるいくつかの制限があります。 ディレクティブ内のポインタおよび配列境界の定義は、32または64ビットの整数値でなければなりません。
境界または長さと評価される式は、次のいずれかの形式でなければなりません。

  • A + B
  • A - B
  • A * B
  • A / B
  • A * B + C
  • A * B - C
  • A / B + C
  • A / B - C

ここで、 A 、 B 、およびCは、定数または整数メンバーのいずれかでなければなりません。 これらの式ではカッコは使用できません。 ランタイムの問題は、同じ集約タイプのポインターが重複するメモリ位置を指す場合、ポインターのサイズが異なる場合にのみ発生します。 例えば、あるサイズS 1のポインタAが、サイズS 2のポインタBと重複するメモリを指し、S 1 < S 2であり、 A が B よりも早く定義されている場合、ランタイムエラーが発生する可能性があります。 単純な解決策は宣言の順番を入れ替えることで、 A の前に B が定義されます。
何らかの種類の循環構造(親構造または祖先構造を指す子孫ポインタ)を持つデータ構造は、このディープコピーのこの実装では現在サポートされていません。 このような場合、アプリケーション固有のニーズごとにデータの移動を手動で管理する必要があります。
-Mipa、-Minline、-ta=tesla:managed は、この実装で-ta= tesla:deepcopy と競合する可能性があります。 これは将来のリリースで解決される予定です。

1.6. C++ Compiler

1.6.1. C++17

PGI 18.1 C++コンパイラはC++17言語標準を部分的にサポートしています。 このサポートを利用するには、、--c++17 17または-std=c++17 を付けてコンパイルします。

サポートされているC++17のコア言語機能は、Linux(GCC 5以降が必要)およびOS Xで利用できます。

このPGIコンパイラリリースでは、次の C++17言語機能がサポートされています。

  • Structured bindings(構造化バインディング)
  • Selection statements with initializers(イニシャライザによる選択文)
  • Compile-time conditional statements(コンパイル時の条件文), 別名 constexpr if
  • Fold expressions(折り畳み式)
  • Inline variables(インライン変数)
  • Constexpr lambdas(コンステックスラムダ)
  • Lambda capture of *this by value(値の* thisのラムダキャプチャ)

このリリースでは、次のC++17言語機能はサポートされていません

  • Class template deduction(クラステンプレートの控除)
  • Auto non-type template parameters(オートノンタイプのテンプレートパラメータ)
  • Guaranteed copy elision(保証されたコピーエリシジョン)

PGI製品にはC++標準ライブラリが含まれていないため、標準ライブラリへのC++17追加のサポートは、システム上で提供されるC++ライブラリに依存します。 Linuxでは、GCC 7 は、C++17をより多くサポートした最初のGCCリリースです。 OS X では、1つの例外を除いてC++17ライブラリの変更はサポートされていません。 std :: string_view は OS X High Sierra で利用できます。

GCC 7とのビルドでは、以下のC++ライブラリの変更がサポートされています:

  • std::string_view
  • std::optional
  • std::variant
  • std::any
  • Variable templates for metafunctions

このPGIリリースでサポートされているシステムでは、次のC++ライブラリ+の変更は利用できません。

  • 並列アルゴリズム
  • ファイルシステムのサポート
  • Polymorphic allocators and メモリリソース

1.6.2. C++ and OpenACC

OpenACCデータ構造と計算領域に現れるれるデータには制限があります。

  • OpenACCデータ句では、可変長配列はサポートされていません。 VLA はC++標準の一部ではありません。
  • コンストラクタとデストラクタを必要とするクラス型の変数は、data句に現れたときに正しく動作しません。
  • 例外は計算領域では処理されません。
  • メンバー変数は、host_data構文のuse_device節では完全にサポートされていません。 このアロケーションにより、実行時にエラーが発生する可能性があります。

C++言語機能サポートを有効にするために必要なGCCのバージョン(GCC 5以上、CCC++14、GCC 7以上、C++17以上)と-ta=teslaのサブオプションであるnollvm 使用の間で競合が発生する可能性があります。 nollvmサブオプションは、システムにインストールされたGCCのバージョンとの互換性をチェックするCUDAツールキットのコンポーネントを使用し、指定された最大値より新しいバージョンでは動作しません。

CUDA Toolkit Version Maximum GNU Version Supported
CUDA 7.5 GCC 4.9
CUDA 8.0 GCC 5.x
CUDA 9.0 GCC 6.x
CUDA 9.1 GCC 6.x
CUDA 9.2 GCC 7.x
CUDA 10.0 GCC 7.x

1.6.3. C++ Compatibility

すべてのPGI製品に含まれているMPIパッケージなど、C++インターフェイスを提供するオプションのパッケージでは、コンパイルとリンクにpgc++コンパイラドライバを使用する必要があります。

These optional packages include:

  • ESMF
  • MPICH
  • MVAPICH
  • NetCDF
  • Open MPI
  • Parallel NetCDF
  • ScaLAPACK

1.7. Runtime Library Routines

PGI 2018は、PGI Acceleratorコンパイラに関連付けられたランタイムライブラリルーチンをサポートしています。 詳細については、「PGIコンパイラユーザーズガイド」の「Acceleratorの使用 」を参照してください。

1.8. Library Interfaces

PGI製品には、Fortranモジュールを使用してCインターフェイスをエクスポートする多数のライブラリが含まれています。 これらのライブラリと関数については、「PGIコンパイラユーザーズガイド」を参照してください。

1.9. Environment Modules

Linuxでは、環境モジュールパッケージ(モジュールロードコマンドなど)を使用する場合、PGI 2018には適切なモジュールファイルを設定するためのスクリプトが含まれています。

1.10. LLVM Code Generator

PGI 2018には、LLVMコードジェネレータとOpenMPランタイムを備えたPGI Linux/x86-64 or Linux/OpenPOWER コンパイラのプロダクション版が含まれています。 これには、PGIデバッガとプロファイラだけでなく、デフォルトのPGIコンパイラに含まれるほとんどの機能、言語、およびプログラミングモデルのサポートが含まれています。

対して LLVMコードジェネレータでPGIコンパイラを使用するには、次のようないくつかのオプションがあります。(PGI 18.1の場合の例)

Compiler Option: -Mllvm
デフォルトのコンパイラlinux86-64/18.1/binの場所を含むようにパスを設定した場合、コンパイルオプション -Mllvm は linux86-64-llvm/18.1/bin に配置されているLLVMバックエンドコンパイラを呼び出します。
 module load pgi/18.1 
Environment Modules: pgi-llvm
環境がPGIの環境モジュールファイルを使用するように設定されている場合、次のコマンドはPGIコンパイラをデフォルトのコードジェネレータでロードします。
module load pgi-llvm
module load pgi/18.1
環境をクリアするには、以下を使用できます。
module purge
環境変数: PATH
linux86-64-llvm/18.1/binを含むようにパスを設定してください。

コンパイルされたオブジェクトファイルと、デフォルトのPGIコンパイラとLLVMバックエンドを利用するPGIコンパイラとを混在させないように注意してください。 生成されたコードは互換性がありますが、OpenMPランタイムライブラリは互換性がありません。

LLVMコードジェネレータを使用するPGI Linux/x86-64コンパイラで利用できる機能:

  • 最適化されたOpenMPアトミック
  • OpenMP 4.5の機能(GPUオフロードを除く)
  • 一部のアプリケーションのパフォーマンスが、デフォルトのPGI x86-64コードジェネレータと比較して改善されました。

LLVMコードジェネレータを使用したPGI Linux/x86-64コンパイラの制限事項:

  • Linuxでのみ利用可能です。 macOSやWindowsでは利用できません。
  • Fortranのデバッグは、ブレークポイント、コールスタック、および基本タイプに対してのみ使用できます。
  • PGI Unified Binaryは利用できません。
  • -Mipaオプションを使用したプロシージャ間最適化は使用できません。
  • 一部のソースコードのディレクティブ、例えば DEC$ は効果を持たないかもしれません。

2. リリースの概要

この章では、64ビットx86互換プロセッサベースのワークステーション、サーバ、およびクラスタ用の開発ツールである PGI 2018 リリースの PGI Accelerator C11、C++14およびFortran 2003コンパイラの概要を説明します。Linux、Apple macOS、および Microsoft Windows オペレーティングシステム上で利用できます。

2.1. Licensing

すべてのPGI製品には、まったく同じPGIコンパイラおよびツールソフトウェアが含まれています。ライセンスキーによってどの機能が有効になっているかの違いとなります。

PGIリリース2018バージョン18.1以降には、アップデートされたv11.14.1.3 FlexNet Publisherライセンス管理ソフトウェア が含まれています。

このFlexNetアップデートは、Windowsのセキュリティ上の脆弱性ライセンス借用( 'lmborrow')などの改善点について説明しています。

重要: PGI 2017(17.x)以前のユーザーは、ライセンスデーモンを更新して18.1以降をサポートする必要があります。 新しいライセンスデーモンは古いPGIリリースと下位互換性があります。 詳細については、 FlexNetアップデートFAQ を参照してください 。

2.1.1. ライセンス用語

PGIコンパイラとツールはライセンス管理されています。 ライセンスについて説明する前に、共通の用語について説明します。

  • License エンドユーザ使用許諾契約書(EULA)で定義されているPGIコンパイラおよびツールを使用する権利で、これはNVIDIAとPGIのエンドユーザ間の法的な合意文章となります。 PGI Professional(有料、永続)ライセンスは、製品識別番号(PIN - 下記参照)で識別されます。 EULAのコピーは、 PGIのWebサイトおよび各PGIソフトウェアのインストールの$PGI///docディレクトリにあります。
  • License keys APGIソフトウェアの使用を可能にするASCIIテキスト文字列で、ライセンス条項を強制するものです。 PGI Professionalの場合、ライセンスキーはPGI Webサイト上の各PGIエンドユーザによって一意のホストIDを使用して生成され、通常はPGIソフトウェアのライセンスを取得したシステムからアクセス可能なlicense.datファイルに保存されます。
  • PIN 製品識別番号.PGIプロフェッショナルライセンスに関連する固有の6桁の番号です。 PINは、VENDOR_STRING= の後のライセンスキーファイルでも確認できます。
  • PIN CODE ライセンスに関連付けられた固有の16桁の数字で、他の人がそのライセンスをPGIユーザーアカウントに管理目的で「結び付ける」ことを可能にします。 PGIプロフェッショナルライセンシーは、PINタイコードを使用して、ライセンス管理機能を他の人と共有することができます。

2.1.2. バンドルされたライセンスキー

PGIインストールディレクトリに license.dat ファイルが存在しない場合は、license.dat という名前の一時ライセンスキーファイルがインストールされます。

別のライセンスサーバー(たとえば、LM_LICENSE_FILE=port@server.domain.com )を使用する場合でもサポートしていますので、この場合は、インストールディレクトリ上の license.dat を削除または名前を変更することをお勧めします。

2.1.3. ノードロックライセンスとネットワークフローティングライセンス

  • ノードロックされたシングルユーザーライセンスでは、一度に1人のユーザーが、PGI compilers and tools ならびに PGIライセンスサーバーの両方がインストールされているシステムでのみコンパイルできます。
  • ネットワークフローティングライセンスにより、1人または複数のユーザーが、ライセンスサーバー、つまりPGIネットワークフローティングライセンスキーがインストールされているシステムにネットワーク接続されている互換性のあるクライアントシステムで、PGI compilers and tools を同時に使用することができます。 ライセンスサーバーに接続された複数のクライアントシステム上にPGIコンパイラとツールをインストールすることができます。 クライアントシステムは、ライセンスサーバーに対してライセンスされている最大シート(ユーザ数)まで同時にライセンスを使用することができます。

2.2. リリースコンポーネント

リリース2018には、次のコンポーネントが含まれています。

  • PGFORTRAN native OpenMP and OpenACC Fortran 2003 compiler
  • PGCCR native OpenMP and OpenACC ANSI C11 and K&R C compiler
  • PGC++R native OpenMP and OpenACC ANSI C++14 compiler
  • PGI ProfilerR OpenACC, CUDA, OpenMP, and multi-thread graphical profiler
  • PGI DebuggerR MPI, OpenMP, and multi-thread graphical debugger
  • Open MPI version 2.1.2 for 64-bit Linux including support for NVIDIA GPUDirect. 64ビットのlinux86-64 MPIメッセージはそれぞれ 2 GBのサイズに制限されています。 NVIDIA GPUDirectはInfiniBandのサポートに依存しているため、Open MPIはInfiniBandハードウェアがシステム上で使用可能な場合に使用するように構成されています。 InfiniBandのサポートには、OFED 3.18以降が必要です。
  • MPICH libraries, version 3.2, for 64-bit macOS
  • Open MPI、MPICH または MVAPICH で使用する分散メモリシステム用の ScaLAPACK 2.0.2 線形代数演算ライブラリ(Intel 64またはAMD64 CPUベースの 64ビットLinux、macOS用)
  • Microsoft HPC Pack 2012 64ビット開発環境用MS-MPI再頒布可能パッケージ(バージョン4.1)(Windowsのみ)
  • カスタマイズされたOpenBLASプロジェクトソースに基づくBLASとLAPACKライブラリ
  • A UNIX-like shell environment for 64-bit Windows platforms
  • FlexNet license utilities
  • マニュアルページ形式とオンライン 、pgicompilers.com/docsの HTMLとPDF形式のマニュアル

2.2.1. その他のコンポーネント

PPGIフローティングライセンス所有者は、PGIウェブサイトからLinux用の追加コンポーネントをダウンロードすることができます。

  • MPICH MPI libraries
  • MVAPICH2 MPI libraries

2.2.2. MPIのサポート

PGI製品を使用して、MPIアプリケーションを開発およびデバッグすることができます。 PGIノードロックライセンスは、最大16のローカルMPIプロセスのデバッグをサポートします。 PGIネットワークフローティングライセンスは、最大256のローカルまたはリモートのMPIプロセスをデバッグする機能を提供します。

2.3. 用語と定義

このドキュメントには、多くの用語と定義が含まれています。 これらの注記に慣れていない用語がある場合は、 PGIオンライン用語集を参照してください。

この2つの用語は、ドキュメント全体でプロセッサのグループを反映するために使用されています。

Intel 64
AMD64プロセッサとバイナリ互換に設計された拡張メモリ64ビットテクノロジ拡張機能を備えた64ビットIntelアーキテクチャプロセッサ。 これには、第1世代(Nehalem)プロセッサーと第2世代(Sandy Bridge)プロセッサーの両方のIntel Pentium 4、Intel Xeon、Intel Core 2、Intel Core 2 Duo(Penryn)、Intel Core(i3、i5、i7) Bridge、Haswell、Broadwell、および Skylake プロセッサが含まれます。
AMD64
AMDの64ビット・プロセッサーで、追加のレジスタや64ビット・アドレッシングなどの機能を搭載しており、パフォーマンスの向上とメモリの大幅な増加を実現します。 この用語には、AMD Athlon64、AMD Opteron、AMD Turion、AMD Barcelona、AMD Shanghai、AMD Bulldozer、AMD Piledriver、および AMD Zen プロセッサーが含まれます。

2.4. サポートプラットフォーム

x86-64プロセッサベースのシステム用のPGIコンパイラとツールでサポートされるプラットフォームは3つあります。

  • 64-bit Linux - 64ビットx86互換プロセッサで動作する64ビットLinuxオペレーティングシステムでサポートされています。
  • 64-bit macOS - 64ビットIntelベースのMacintoshコンピュータ上で動作する64ビットApple MacOSオペレーティングシステムでサポートされています。
  • 64-bit Windows - 64ビットx86互換プロセッサで動作する64ビットMicrosoft Windowsオペレーティングシステムでサポートされます。

2.5. サポートされているオペレーティングシステムのアップデート

This section describes updates and changes to PGI 2018 that are specific to Linux, macOS, and Windows.

2.5.1. Linux

  • CentOS 6.4 ~ 7.4
  • Fedora 14 ~ 27
  • openSUSE 13.2 ~ openSUSE Leap 42.3
  • RHEL 6.4 ~ 7.4
  • SLES 12 ~ SLES 12 SP 3
  • Ubuntu 14.04, 16.04, 17.04, 17.10

2.5.2. Apple macOS

macOS用のPGI 2018は、Linux環境向けのバージョンのほとんどの機能をサポートしています。 これらのリリースノートやユーザーマニュアルに記載されている場合を除いて、macOS上のPGIコンパイラとツールはLinux対応のものと同じように機能します。

  • コンパイラ、デバッガ、およびプロファイラは、macOSバージョン10.10.5(Yosemite)から10.13(High Sierra)までサポートされています。

2.5.3. Microsoft Windows

Windows用のPGI製品は、Linux環境用のPGI製品のほとんどの機能をサポートしています。 すべてのWindowsシステム上のPGI製品にはMicrosoft Open Toolsが含まれていますが、コンパイラーをインストールする前にMicrosoft Windowsソフトウェア開発キット(SDK)をインストールする必要があります。
注意: PGI 18.7 は、バンドルされた Microsoft ツールチェーンコンポーネントを含む、Windows 用の最終リリースです。 将来のリリースでは、システムに Microsoft ツールチェーンコンポーネントがプリインストールされている必要があります。

注意: PGI 2018では、Windows 7,8,9.1でもWindows 10 SDKが必要です。

これらのWindowsオペレーティングシステムは、PGI 2018でサポートされています。

  • Windows Server 2008 R2
  • Windows 7
  • Windows 8
  • Windows 8.1
  • Windows 10
  • Windows Server 2012
  • Windows Server 2016

2.6. CUDA Toolkit Versions

PGIコンパイラは、NVIDIA GPUで実行するプログラムを構築する際に、NVIDIAのCUDAツールキットを使用します。 すべてのPGIインストールパッケージは、必要なCUDA Toolkitコンポーネントを2018/cudaというPGIインストールディレクトリに置かれます。

NVIDIA CUDAドライバは、そのシステムでGPU用にコンパイルされたプログラムを実行する前に、GPUを搭載したシステムにインストールする必要があります。 PGI製品にはCUDAドライバが含まれていません。 NVIDIAから適切なCUDAドライバをダウンロードしてインストールする必要があります。 CUDAドライバのバージョンは、少なくともコードをコンパイルしたCUDA Toolkitのバージョンと同じかあるいは新しいものでなければなりません。

PGIツール pgaccelinfo は、最初の出力行としてドライバのバージョンを表示します。 ご使用のシステムにどのバージョンのCUDAドライバがインストールされているかわからない場合に使用してください。

PGI 18.10 には、次のバージョンのCUDAツールキットが含まれています。

  • CUDA 9.1
  • CUDA 9.2
  • CUDA 10.0

コンパイラに、使用するバージョンのCUDAツールキットを選択させるか、特定のバージョンを使用するように指示することができます。 このセクションの残りの部分では、すべてのオプションについて説明します。
CUDAツールキットのバージョンを指定しない場合、コンパイラは、コンパイルするシステムにインストールされている CUDA ドライバのバージョンを使用して、使用するCUDAツールキットを決定します。 この自動検出機能は、PGI 18.7 の新機能です。 自動検出は、同じシステムでアプリケーションをコンパイルして実行する場合に特に便利です。 これはどのように動作するのですか? 他の情報がない場合、コンパイラは、システムにインストールされている CUDA ドライバのバージョンと一致する PGI 2018/cuda ディレクトリ内の CUDA Toolkit バージョンを探します。 一致するものが見つからない場合、コンパイラは CUDA ドライバのバージョンより新しいものではない最新のCUDAツールキットのバージョンを検索します。 CUDAドライバがインストールされていない場合、PGI 18.7 コンパイラはデフォルトの CUDA 9.1 に戻ります。 いくつかの例を見てみましょう。
インストールした唯一のPGIコンパイラがPGI 18.7ならば、

  • CUDA Driverが10.0の場合、コンパイラはCUDA Toolkit 10.0を使用します。
  • CUDA Driverが9.2の場合、コンパイラはCUDA Toolkit 9.2を使用します。
  • CUDA Driverが9.1の場合、コンパイラはCUDA Toolkit 9.1を使用します。
  • CUDA Driverが9.0の場合、コンパイラはCUDA Toolkit 9.0が見つからなかったというエラーを出します。 CUDA Toolkit 9.0はPGI 18.10にバンドルされていません。
  • コンパイルシステムにCUDAドライバがインストールされていない場合、コンパイラはCUDA Toolkitバージョン9.1を使用します。
  • CUDA DriverがCUDA 9.2より新しい場合、コンパイラは引き続きCUDAツールキット9.2を使用します。 コンパイラは、CUDAドライバより新しいものではないと判明した、その最新のCUDAツールキットを選択します。

次のいずれかの方法を使用して、CUDA Toolkitバージョンのコンパイラのデフォルト選択を変更することができます。

  • コンパイラオプションを使用します。 cudaX.Y サブオプションを -Mcuda または-ta=tesla に設定します。XY は CUDA バージョンを表します。 たとえば、Cファイルを CUDA 9.2 Toolkitでコンパイルするには、次のようにします。
    pgcc -ta=tesla:cuda9.2
    コンパイラオプションを使用すると、コンパイラを1回呼び出すたびにCUDAツールキットのバージョンが変更されます。
  • rfile 変数を使用します。 DEFCUDAVERSION を定義する行を、インストールした際の PGI の bin/ディレクトリの siterc ファイル、またはホームディレクトリの .mypgirc という名前のファイルに追加します。 たとえば、CUDA 9.2 Toolkitをデフォルトとして指定するには、次のいずれかの行に次の行を追加します。
    set DEFCUDAVERSION=9.2;
    rcfile変数を使用すると、rcfile を読み取るコンパイラのすべての呼び出しに対して CUDA Toolkit のバージョンが変更されます。

CUDA Toolkitバージョンを指定すると、現在のPGIコンパイラにバンドルされているデフォルトとは異なるCUDA Toolkitインストールを使用するようにコンパイラに指示することもできます。 ほとんどのユーザーは、PGIで提供されているもの以外のCUDA Toolkitインストールを使用する必要はありませんが、この機能が必要な状況が発生します。 プレリリースCUDAソフトウェアを使用している開発者は、PGIリリースに含まれていないCUDAツールキットのバージョンでテストする必要があることがあります。 逆に、PGIリリースでインストールされた最も古いCUDAツールキットよりも古いCUDAツールキットでコンパイルする必要がある開発者もいます。 これらのユーザのために、PGIコンパイラは、PGIインストールディレクトリの外にインストールされたCUDAツールキットのコンポーネントと相互運用できます。

PGIは、一緒にインストールされたバージョンのCUDAツールキットを使用して広範にテストし、その使用を完全にサポートします。 PGIインストールに含まれていないCUDA Toolkitコンポーネントの使用は、機能の違いが存在する可能性があることを理解して行われます。
PGIコンパイラでインストールされたバージョン以外のCUDAツールキットでコンパイルする機能は、すべてのプラットフォームでサポートされています。 Windowsプラットフォームでは、この機能はCUDA Toolkitバージョン9.2以降でサポートされています。

PGI 18.10 の CUDA 8.0など、PGIリリースとともにインストールされていない CUDA ツールキットを使用するには、3つのオプションがあります。

  • 基本デフォルトを上書きするには、rcfile 変数 DEFAULT_CUDA_HOME を使用します。
    set DEFAULT_CUDA_HOME=/opt/cuda-8.0;
  • 環境変数 CUDA_HOME を設定する
    export CUDA_HOME=/opt/cuda-8.0
  • コンパイラのコンパイル行の割り当てを使用するCUDA_HOME=
    pgfortran CUDA_HOME=/opt/cuda-7.5
  • コンパイラのコンパイル行の割り当てを使用するCUDA_HOME =
    pgfortran CUDA_HOME=/opt/cuda-8.0

PGIコンパイラは、使用する CUDAツールキットのバージョンを決定する際に、次の優先順位を使用します。

  1. コンパイラに使用するCUDAツールキットのバージョンを知らせない場合、コンパイラは、システムにインストールされているCUDAドライバのバージョンと一致するPGIインストールディレクトリ2018 / cudaからCUDAツールキットを選択します。 PGIインストールディレクトリに直接一致が含まれていない場合は、CUDAドライババージョンより新しいバージョンではないディレクトリ内の最新バージョンが使用されます。 システムにCUDAドライバがインストールされていない場合、コンパイラは内部デフォルトに戻ります。 PGI 18.10では、このデフォルトはCUDA 9.1です。
  2. rcfile 変数 DEFAULT_CUDA_HOME は、デフォルトのデフォルトを上書きします。
  3. 環境変数 CUDA_HOMEは上記のすべてのデフォルトを上書きします。
  4. 環境変数PGI_CUDA_HOMEは上記のすべてを上書きします。 すでに定義されているCUDA_HOMEをオーバーライドする必要がある場合に備えて、上級ユーザーが利用できます。
  5. -Mcudaと-ta=tesla のユーザ指定の cudaX.Y サブオプションは、上記のデフォルトをすべて上書きし、PGIインストールディレクトリ2018/cudaにあるCUDAツールキットが使用されます。
  6. コンパイラのコンパイル行の割り当て CUDA_HOME= は、上記のすべてのデフォルト(cudaX.Yサブオプションを含む)を上書きします。

2.7. Compute Capability

コンパイラは、NVIDIA GPU compute capability 3.0〜7.0 用のコードを生成できます。 コンパイラは、コンパイル時のシステムで検出された GPU のコンピューティング機能と一致する compute capability をデフォルトリストとして作成します。GPU が検出されない場合、コンパイラは cc35、 cc50、 cc60、および cc70を選択します。
コマンドラインオプションまたは rcfile を使用して、1つまたは複数のコンピューティング機能を指定することによって、デフォルトを上書きすることができます。
コマンドラインオプションを使用してデフォルトを変更するには、OpenACC の場合は -ta=tesla: に、CUDA Fortran の場合は -Mcuda= にcompute capabilityのカンマ区切りリストを入力します。
rcfileを使用してデフォルトを変更するには、インストールの bin ディレクトリにある siterc ファイルの DEFCOMPUTECAP 値を空白で区切ったcompute capability のリストに設定します。

set DEFCOMPUTECAP=60 70;

また、siterc ファイルを変更する権限がない場合は、ホームディレクトリの別の.mypgircファイル(Windows では mypgi_rc)に DEFCOMPUTECAP 定義を追加できます。
デバイスコードの生成には時間がかかることがあるため、コンピューティング機能の数が増えるとコンパイル時間が長くなることがあります。

2.8. コンパイル済みのオープンソースパッケージ

多くのオープンソースソフトウェアパッケージは、Linux x86-64上のPGIコンパイラで使用するために移植されています。

次のPGIコンパイル済みオープンソースソフトウェアパッケージは、PGI Linux x86-64 ダウンロードパッケージに含まれています。

  • OpenBLAS 0.2.19 - OpenBLASプロジェクトのソースに基づくカスタマイズされたBLASおよびLAPACKライブラリ。
  • Open MPI 2.1.2 - open-source MPI implementation.
  • ScaLAPACK 2.0.2 - 並列分散メモリ・マシン用の高性能線形代数ルーチンのライブラリ。 ScaLAPACKはOpen MPI 2.1.2を使用します。

以下のオープンソースソフトウェアパッケージの一覧は、PGIコンパイラを使用してLinux x86-64ターゲットで実行するためにプリコンパイルされており、PGIのWebサイトからダウンロードできます。

  • MPICH 3.2 - open-source MPI implementation.
  • MVAPICH2 2.2 - open-source MPI implementation.
  • ESMF 7.0.2 for Open MPI 2.1.2 - 気候、数値気象予測、データ同化、その他地球科学ソフトウェアアプリケーションを構築するための地球システムモデリングフレームワーク。
  • ESMF 7.0.2 for MPICH 3.2.
  • ESMF 7.0.2 for MVAPICH2 2.2.
  • NetCDF 4.5.0 for C++11 Cで書かれた配列指向の科学データの作成、アクセス、共有をサポートする一連のソフトウェアライブラリと自己記述的な機械に依存しないデータフォーマット。このパッケージは次のコンポーネントです。
    • NetCDF-C++ 4.3.0 - C++ interfaces to NetCDF libraries.
    • NetCDF-Fortran 4.4.4 - Fortran interfaces to NetCDF libraries.
    • HDF5 1.10.1 - data model, library, and file format for storing and managing data.
    • CURL 7.46.0 - tool and a library (usable from many languages) for client-side URL transfers.
    • SZIP 2.1.1 - extended-Rice lossless compression algorithm.
    • ZLIB 1.2.11 - file compression library.
  • NetCDF 4.4.1.1 for C++98 - 上記のC++11のNetCDFに記載されているすべてのコンポーネントを含みます。
  • Parallel NetCDF 1.9.0 for MPICH 3.2
  • Parallel NetCDF 1.9.0 for MVAPICH2 2.2
  • Parallel NetCDF 1.9.0 for Open MPI 2.1.2

さらに、これらのソフトウェアパッケージは、Linux x86-64上のPGIにも移植されていますが、ライセンスの制限により、PGIからバイナリ形式で直接入手することはできません。 PGIのWebサイトの「Porting&Tuning Guides」セクションを参照に、生成してください。

  • FFTW 2.1.5 - 高速フーリエ変換ライブラリのバージョン2には、Open MPI 2.1.2で構築されたMPIバインディングが含まれています。
  • FFTW 3.3.7 - 高速フーリエ変換ライブラリのバージョン3には、Open MPI 2.1.2で構築されたMPIバインディングが含まれています。

これらのパッケージやその他のパッケージのビルドの詳細については、PGIのWebサイトの「Porting&Tuning Guides」を参照してください。

2.9. Getting Started

デフォルトでは、PGI 2018コンパイラは、コンパイルが実行されるプロセッサ(CPU)のタイプ、コンパイルホストに最適化されたコードを生成します。 PGIコンパイラとツールに精通していない場合、デフォルトで使用する良いオプションは集約オプション-fastです。

集約オプションには、 SSE機能をサポートするターゲットに対して一般的に最適なフラグセットが組み込まれています。 これらのオプションには、 ベクトルストリーミング SIMD命令の使用を可能にする最適化オプションが組み込まれています 。 それらは、SSE命令、キャッシュアラインメント、およびフラッシュでベクトル化を可能にします。

注: -fastオプションの内容はホスト依存です。

次の表は、典型的な-fastオプションを示しています。

Table 2. Typical -fast Options
-O2 コード最適化レベルを2に指定します
-Munroll=c:1 ループをアンロールし、各繰り返し中に元のループの複数のインスタンスを実行します。
-Mnoframe スタックフレームを設定するコードを生成しないことを示します。 このオプションを使用すると、スタックトレースが機能しません。
-Mlre ループによって運ばれる冗長性の除去を示します。
-Mpre 部分的な冗長性の除去を示します。

-fastには、通常、次の表に示すオプションも含まれます。

Table 3. Additional -fast Options
-Mvect=simd パックされたSSEおよびAVX命令を生成します。
-Mcache_align 長いオブジェクトをキャッシュラインの境界に整列させます。
-Mflushz ゼロにフラッシングモードを設定します。

注意: SSEおよびAVX命令をサポートするプロセッサで最高のパフォーマンスを得るには、たとえ FORTRAN77コードであっても、PGFORTRANコンパイラを使用してください。

-fastに加えて、プロシージャ間解析と最適化の-Mipa= fastオプションはパフォーマンスを向上させることができます。-Mvect 、-Munroll、 -Minline 、-Mconcur 、-MpfiなどのPGIコンパイラ・リファレンス・マニュアルに記載されている個々の-Mpgflagオプションを試すことで、さらに性能を向上させることもできます、-Mpfoなどがあります。 しかし、これらのオプションを使用する速度の増加は、通常、アプリケーションおよびシステムに依存します。 これらのオプションを使用するときは、パフォーマンスの低下が起こらないようにアプリケーションを慎重に実行することが重要です。

3. 配布と展開

アプリケーションのビルド、デバッグ、チューニングが完了したら、さまざまなシステムで実行する必要のあるユーザーに配布することができます。 このセクションでは、PGIコンパイラとツールを使用して構築されたアプリケーションを効果的に配布する方法について説明します。

3.1. アプリケーションの展開と再配布可能ファイル

PGIコンパイラで構築されたプログラムは、ランタイムライブラリファイルに依存することがあります。 これらのライブラリファイルは、PGIコンパイラがインストールされていないシステムで実行できるように、プログラムと共に配布する必要があります。 LinuxおよびWindows用のPGI再配布可能ファイルがあります。 Windowsでは、PGIはMicrosoftの再頒布可能ファイルも提供します。

3.1.1. PGIの再配布可能ファイル

PGI 2018リリースには、次のディレクトリが含まれています。(PGI 18.1 の場合)

  • $PGI/linux86-64/18.1/REDIST
  • $PGI/win64/18.1/REDIST

これらのディレクトリには、すべてのPGI Linuxランタイムライブラリ共有オブジェクトファイルまたは PGI 2018ライセンシーがPGIエンドユーザ使用許諾契約書(EULA)の条件で再配布できるWindowsダイナミックリンクライブラリが含まれています。 参考のために、PGI EULAのテキスト形式のコピーが18.1の docディレクトリに含まれています。

3.1.2. Linuxの再配布可能ファイル

Linux REDISTディレクトリには 、サポートされているすべてのターゲットのPGIランタイムライブラリ共有オブジェクトが含まれています。 これにより、PGIコンパイラのユーザは、次の要件のもとで、ほぼすべてのPGI対応ターゲットシステムで正常に実行される実行可能ファイルとPGIランタイムライブラリのパッケージを作成することができます。

  • 実行可能ファイルのエンドユーザーは、環境を適切に初期化してください。
  • ユーザーは関連するバージョンのPGI共有オブジェクトを使用するようにLD_LIBRARY_PATHを設定します。

3.1.3. Microsoft の再配布可能ファイル

Windows上のPGI製品には、Microsoft Open Toolsが含まれています。 Microsoft Open Toolsディレクトリにはredistという名前のサブディレクトリがあります。 PGI 2018ライセンシーは、PGIエンドユーザ使用許諾契約の条項に従って、このディレクトリに含まれるファイルを再配布することができます。

マイクロソフトは、これらのランタイムファイルを含むインストールパッケージvcredist_x86.exeとvcredist_x64.exeを提供しています。 これらのファイルはredistディレクトリにあります。

4.トラブルシューティングのヒントと既知の制限事項

このセクションには、既知の制限、マニュアルのエラー、および修正に関する情報が含まれています。 可能な限り、回避策が提供されます。

現在のリリースの最新情報については、PGIのよくある質問(FAQ) の Webページを参照してください。

4.1. プラットフォーム固有の問題

4.1.1. Linux

Linuxでの既知の問題は次のとおりです。

  • -mcmodel= mediumを使用してコンパイルされたオブジェクトファイルを組み込んだプログラムは、静的にリンクすることはできません。 これはlinux86-64環境の制限であり、PGIコンパイラとツールの制限ではありません。

4.1.2. Apple macOS

Apple macOSに関する既知の問題は次のとおりです。

  • PGI 2018コンパイラは、バイナリの静的リンクをサポートしていません。 将来のアップルアップデートとの互換性のために、コンパイラはバイナリのダイナミックリンクのみをサポートしています。

4.1.3. Microsoft Windows

Windowsでの既知の問題は次のとおりです。

  • Cygwinのemacsエディタが正しく機能するためには、 emacsを実行するシェルを起動する前に環境変数CYGWINを値 "tty"に設定する必要があります。 ただし、この設定はPGBDGコマンドラインインターフェイス( -text )と互換性がないため、この設定を使用してシェルでpgdbg -textを使用することはできません。
  • Windowsでは、SHELL変数が期待できないものに定義されている場合、Cygwinに含まれているviのバージョンに問題が生じる可能性があります。 この場合、viが呼び出されると、次のメッセージが表示されます。

    E79: Cannot expand wildcards Hit ENTER or type command to continue

    この問題を回避するには、SHELLを Cygwin bin ディレクトリのシェルを参照するように設定します(例: /bin/bash)。

  • Windowsでは、デバッグ用に構築されたランタイムライブラリ( msvcrtdやlibcmtdなど)はPGI製品には含まれていません。 プログラムが -g でリンクされている場合 、デバッグのために、PGIランタイムライブラリと Microsoft ランタイムライブラリの標準以外のデバッグバージョンが常に使用されます。 この制限は、アプリケーションコードのデバッグには影響しません。

4.2. デバッグに関する問題

PGIデバッガの既知の問題は次のとおりです。

  • PGIユニファイドバイナリのデバッグ、つまり複数の-tpオプションで構築されたプログラムは、完全にはサポートされていません。 一部のサブプログラムの名前はコンパイル時に変更され、デバッガはこれらの名前をアプリケーションのソースコードで使用されている名前に変換しません。
  • Windowsプラットフォームでデバッグする場合、Windowsオペレーティングシステムは、ブロックされたシステムコールを1回ステップオーバーするとstepi/nexti操作をタイムアウトします。

4.3. プロファイラ関連の問題

PGIプロファイラに関するいくつかの特定の問題:

  • プロファイラは 'dlsym'を直接呼び出すことができます。 このシステムコールがプロファイリングされるプログラムまたは他のライブラリによってインターセプトされると、プロファイラは起動時にハングする可能性があります。MPIの実装によっては、この問題が発生しました。--cpu-profiling off オプションを使用して、'dlsym' システムコールを傍受している機能やCPUプロファイリングを無効にする機能を無効にすることをお勧めします。
    • IBMのスペクトルMPIを使用するときに 'dlsym'インターセプトを無効にするには、 -gpu オプションを省略し、 -x PAMI_DISABLE_CUDA_HOOK=1 および -disbale_gpu_hooks オプションを追加します。

4.4. OpenACCの問題

このセクションには、OpenACC指令に対するPGIのサポートの既知の制限事項が含まれています。 PGIは、将来のリリースでこれらの機能をサポートする予定です。

ACC routineディレクティブの制限

Clause Support制限

  • device_type句の後にすべての句がサポートされるわけではありません。

過去のバージョンのリリースノート