PGIトップ › PGI FAQ › アクセラレータ製品FAQ

ソフテックは、PGI 製品の公認正規代理店です

PGIアクセラレータ™ コンパイラ製品 FAQ

 本ページは、NVIDIA社の CUDA™ 環境を備えた GPU 対応のコンパイラ機能を有する PGIアクセラレータ™ コンパイラ製品に関する FAQ のページです。その他、ご購入前のご相談、あるいは技術的なご質問等がある場合は、お気軽にソフテックまでご連絡下さい。また、PGIアクセラレータ™ コンパイラの使用時における技術的な問題に関する FAQ は、別のページにてご案内しております。
© 株式会社ソフテック

PGI アクセラレータ™コンパイラ製品の一般的事項に関する FAQ

▶ 技術的な事項の FAQ は、こちらのページへ

  1. PGIアクセラレータコンパイラがサポートするプログラミング言語は何ですか?
  2. PGIアクセラレータコンパイラがサポートするOSプラットフォームは何ですか?
  3. PGIアクセラレータコンパイラがサポートするGPGPU(アクセラレータ)は何ですか?
  4. CUDAソフトウェアをインストールしておく必要がありますか?
  5. コンパイラは、IEEEスタンダード浮動小数点演算方式をサポートしますか?
  6. PGIアクセラレータコンパイラは倍精度をサポートしますか?
  7. 自分のPGIでコンパイルされたコードからCUDAカーネル関数を呼ぶことができますか?
  8. 同じアプリケーションで、CUDA C プログラミングと PGI アクセラレータプログラミングを混在できますか?
  9. コンパイラは、同じプログラムで複数のGPUの使用をサポートしますか?
  10. OpenMPのように、PGIのアクセラレータディレクティブを標準コミッティに公開しますか?
  11. GPUを有していないマシン上で、プログラムを実行出来ますか?
  12. 個々の異なる GPU モード用にプログラムを再ビルドしなければなりませんか?
  13. GPUコード内で、関数やサブプログラムの呼び出し(コール)ができますか?
  14. PGI 9.0 のテクノロジー・プレビューでは全てのディレクティブをサポートしていますか?
  15. PGI 9.0 の機能プレビューはいつまで使用できますか?
  16. PGIアクセラレータコンパイラの価格は?
  17. PGI 9.0 のテクノロジー・プレビューを使用するための方法を教えて下さい?
  18. アクセラレータ領域内に、総和等の「リダクション処理」がある場合、GPU上のデータパラレル処理を阻害します。今後のリリースでリダクションを可能とするサポートが予定されていますか?
  19. 過去に終息したライセンス製品(32ビット専用製品、PGF77専用製品、PGF77/PGCC製品等)をそのサブスクリプションを更新して使用している場合、PGIアクセラレータ製品を使用するために、どのような製品のアップグレード手続きを行えば良いでしょうか?
  20. NVIDIAの Fermi GPU(Geforce 400シリーズ、tesla C2000シリーズ)をサポートしていますか?
  21. 2011年11月に公開された OpenACC プログラミング標準規格とは、何ですか?
  22. OpenACC プログラミング規格は、なぜ必要とされたのでしょうか?
  23. PGIは、なぜ、PGI Accelerator modelを単独で開発する路線を選ばず、OpenACC をサポートするのでしょうか?
 

PGI CUDA Fortran に関する FAQ

PGIアクセラレータに関しての回答

Question  1. PGIアクセラレータコンパイラがサポートするプログラミング言語は何ですか?

Answer  現在、PGFORTRAN FortranコンパイラとPGCC® ANSI C99コンパイラの二つの言語でPGIアクセラレータ機能をサポートしています。なお、C++言語に対するサポートは行っておりません。C++言語サポートに関しては、現在のところその予定がありません。PGF95™ Fortranコンパイラは、F77/F90/F95/F2003 の全ての構文と、ファイル仕様をサポートしますので、本コンパイラでは、過去の FORTRAN77 構文も解釈し、入力ソースファイルも固定形式、自由形式もサポートします。また、PGI CUDA Fortan も同じ PGFORTRAN コンパイラ上でサポートします。pgfortran コマンド名は、pgf90 あるいは、pgf95 と言う名前でエイリアスされており、各コマンド名で使用できます。

Question  2. PGIアクセラレータコンパイラがサポートするOSプラットフォームは何ですか?

Answer  2009年11月の正式製品リリースから、Linux、Windows、Mac OS X の32ビットあるいは64ビット環境のプラットフォームをサポートしました。但し、Mac OS X は、NVIDIA社の 64ビット CUDA SDK 環境がリリースされた後に、サポートします。したがって、PGI 2010リリース当初、MAC OS X 32ビット環境のみをサポートします。なお、MAC OS X の 64bit環境上の CUDA は、PGI 2011 においても、まだ、提供されておりません。

Question  3. PGIアクセラレータコンパイラがサポートするGPGPU(アクセラレータ)は何ですか?

Answer  PGIアクセラレータコンパイラは、compute capability 1.1 以上の CUDA 環境を有するNVIDIA GPUアクセラレータをサポートしています。その他の(他社の)アクセラレータへの適用に関しても、そのソフトウェア環境整備が整えば、サポートを検討しています。

Question  4. CUDAソフトウェアをインストールしておく必要がありますか?

Answer  CUDAのソフトウェア環境は、予めシステムに導入して頂いておく必要があります(PGI 2010 以降は、最低限、CUDA ドライバのみご自身で実装しておいて下さい)。現在、CUDAソフトウェアは、NVIDIA社のサイトからダウンロードできます。CUDAドライバと SDK の環境を構築後、PGIコンパイラをインストールします。CUDAソフトウェアのインストールの方法は、PGI TIPSページにて説明しておりますので、ご参考にして下さい。インストール後、PGIコンパイラの CUDA 用の初期設定ファイル 'sitenvrc' (以下、参照)を $PGI/linux86-64/{version番号}/bin (Linux64ビットの場合)配下に作成します。以下の例は、CUDAソフトウェアの実装場所が /usr/local/cuda の場合の例です。

 set NVOPEN64DIR=/usr/local/cuda/open64/lib;
 set CUDADIR=/ousr/local/cuda/bin;
 set CUDALIB=/usr/local/cuda/lib;

 現在、CUDAソフトウェアの compute capability は 1.3 をデフォルトとしてコンパイルしますが、もし、これ以前の 1.0や 1.1 の GPU/CUDA を使用している場合は、コンパイルオプションで、"-ta=nvidia,cc10" あるいは、 "-ta=nvidia,cc11" を明示的に使用するか、あるいは、'sitenvrc' ファイルにset COMPUTECAP=10;" あるいは "set COMPUTECAP=11;"を記述します。

(2009/9/30追記) CUDA 2.3 以降では、CUDAの実装ライブラリ・パス名が、32bit用と64bit用に分けられましたので、Linux 64ビットOS の場合は、CUDALIB を以下のように設定する必要があります。

 set CUDALIB=/usr/local/cuda/lib64;

(2009/12/10追記)
PGI 2010 (PGI 10.0) の正式リリース後は、上記の'sitenvrc'ファイルを設定する必要がなくなりました。NIVIDIA社の許可により、必要となるCUDAのライブラリは、PGIのインストール時に実装されます。

Question  5. コンパイラは、IEEEスタンダード浮動小数点演算方式をサポートしますか?

Answer  現在発売されている GPU アクセラレータは、IEEE floating-point Standard 仕様のほとんどをサポートしています。しかしながら、全ての「丸めモード」をサポートしていないこと、また、いくつかの処理、とりわけ、スクエア・ルートや指数関数、対数関数、超越関数などは、フルな精度を有する結果を提供しない場合があります。これは、ハードウェア自体の制約であり、コンパイラによって対策を講じることができない問題です。GPU ハードウェアの進化により、こうした問題は解決されるものと思われます。
(2010年追記)NVIDIA Fermi 以降では、GPU が IEEE 754-2008 floating-point standard に準拠しましたので、サポートします。

Question  6. PGIアクセラレータコンパイラは倍精度をサポートしますか?

Answer  コンパイラは倍精度をサポートします。しかし、Fermi 以前のGPUのアクセラレータ・ハードウェアは倍精度をサポートしていますが、その性能は単精度に比べて極端に悪いことを注意すべきです。これは、GPU のハードウェア自体に倍精度演算機構が十分に実装されていないための問題です。2010年春の Fermi GPUがリリースされた以降は、十分な倍精度対応演算器が実装されましたので、この問題は解決されています。

Question  7. 自分のPGIでコンパイルされたコードからCUDAカーネル関数を呼ぶことができますか?

Answer  PGIは、現在、C あるいは Fortranプログラムから直接、CUDAや PTX や他の言語で記述したカーネル関数をコールできるように、その機能設計を行っております。この機能が利用できるようになった時点で、アナウンスする予定です。

Question  8. 同じアプリケーションで、CUDA C プログラミングと PGI アクセラレータプログラミングを混在できますか?

Answer  これは、可能です。しかし、PGI 2010 リリースでは、CUDA C コードと PGIアクセラレータコード間の「デバイスデータ」を共用する方法を有していません。この機能は重要なものと認識していますので、今後のリリースにてその解決を図るように現在取り組んでいます。

Question  9. コンパイラは、同じプログラムで複数のGPUの使用をサポートしますか?

Answer  CUDA自体の環境では、複数のスレッドを使用することによって、2つ以上の GPU を使用することができます。この場合、各スレッドは、異なる GPUにアタッチされ、その「カーネル」をGPU上で動作するようにします。PGIの現在のリリースでは、「同じアクセラレータ領域」から2つ以上の GPU を自動的に制御する機能は含まれておりません。これは、今後のサポート機能の候補の一つとされております。
 なお、並列の MPI あるいは、OpenMP プログラムを書くことにより、複数枚のNVIDIA GPUを使用することができます。 (参考TIPS) PGI アクセラレータにおけるマルチ GPU の使用
MPI
同じノード上で並列に各MPIランクが実行出来るMPIプログラムにおいては、acc_device_num手続きを使用して異なるGPUを選択するためにMPIランクの値を使用できます。
OpenMP
OpenMPスレッド並列プログラムにおいては、omp_num_thread_num関数を使用して、各スレッド用に異なるGPUを選択することができます。 OpenMP並列領域において、各スレッドがイテレーションの異なるサブセットを計算するようなループを持つアクセラレータ・リージョンを含むことができます。

Question  10. OpenMPのように、PGIのアクセラレータディレクティブを標準コミッティに公開しますか?

Answer  PGI社は、このアクセラレータ・プログラミング・モデルとそのディレクティブに関する経験を踏まえ、今後、標準コミッテへ開示してしております。OpenMP ARB は、現在、GPGPU等の「アクセラレータ」をサポートするための OpenMP API を拡張するためのサブコミッティを設けて、その策定活動をしています。PGI社は、このサブコミッティの中で、主要な活動を行っております。さらに、2011年11月に、PGI社は、NVIDIA社、Cray社、CAPS社と共に、OpenACC API 仕様を定義し公開しました。OpenACC は、最新のオープンな並列プログラミング規格として科学技術系の多数のプログラマーを対象とした新しい規格です。なお、この仕様は、PGI社の PGI Accelerator programming Model がベースとなっております。

Question  11. GPUを有していないマシン上で、プログラムを実行出来ますか?

Answer ホスト側のアクセラレータ(GPU)の有無に係わらず、実行可能なモジュールを生成することができます。これは、PGI Unified Binary™ 技術によるもので、一つの executable ファイルに、GPU用コードを含めた複数のCPUターゲット用の最適化コードを作成することができます。こうした実行モジュールは、実行時に、GPUの存在の有無を判断して、存在した場合、ホストとGPUの両方を使用したコードが実行され、もし、GPUが存在していない場合は、ホスト用のコードのみで実行されます。

Question  12. 個々の異なる GPU モード用にプログラムを再ビルドしなければなりませんか?

Answer  生成される GPU コードは、従来のグラフィックスアプリケーションやゲームで使用されているものと同じ技術を使用しています。すなわち、プログラムは、動作マシンに搭載された特定の GPUモデル用に、GPUベンダーが提供したドライバーにて、実行時に動的に翻訳、再最適化される可搬性のある中間フォーマットを使用しています。従って、今後、GPUカードをアップグレードしたり、あるいは、GPUの異なるモデルを持ったマシン上で自分のプログラムを使用すると言った状況であっても、自身の作成したプログラムを引き続き動作させることができます。

Question  13. GPUコード内で、関数やサブプログラムの呼び出し(コール)ができますか?

Answer  現在、GPUは、関数コールをサポートしていません。従って、一般的にはできません。関数をプログラム内でインライン展開する必要があります。

Question  14. PGI 2010 では全てのディレクティブをサポートしていますか?

Answer  PGI 2010では、PGI Fortran & C Accelerator Programming Model white paper の仕様に記述された、全てのディレクティブ機能と関数を実装していません。この時点で、まだ実装していないディレクティブは以下の通りです。
 ・ループ・スケジューリング・ディレクティブの中の以下の”節”
   unroll、cache
 ・acc_shutdownとacc_on_device 関数

Question  15. PGI 9.0 の機能プレビューはいつまで使用できますか?

Answer  PGI アクセラレータ™ コンパイラは、標準的な PGI Workstation、Server、CDK のライセンスキーの他に、別のライセンスキーが必要となります。PGI 9.0 のリリースにおいては、「PGI アクセラレータ™ コンパイラ」は、正式なライセンス製品の前の段階の「無償のテクノロジー・プレビューという扱い」とし、PGI 9.0 リリースを利用する権利を有する(サブスクリプション有効の)お客様は、2009年12月31日まで本機能を無償で使用することができます(PGI 9.0用のライセンスキーの中に、テクニカル・プレビュー用の使用ライセンスが組み込まれております)。現在、PGI コンパイラ・ライセンスのサブスクリプションの有効期間が過ぎてしまっている場合は、サブスクリプションの有効化を行うか、あるいは、新規のライセンスのご購入が必要となります。  なお、アクセラレータ・コンパイラの機能は、現有のライセンスでは、2009年12月31日を過ぎますと一切、使用できなくなりますので、予めご了承下さい。また、プレビュー版で作成していた「アクセラレータ機能を含む実行モジュール」も実行出来なくなりますので、ご了承下さい。  また、2009年11月に発売の PGI アクセラレータ™ コンパイラは、現在の製品群の上位製品として、別製品として発売しましたので、引き続きアクセラレータ機能を使用したいお客様は、製品のアップグレード(新製品への買い換え措置)、もしくは、新アクセラレータ・コンパイラ製品をご購入いただく必要があります。
(ご注意) 現在のお持ちの PGI Workstation/Server/CDK 製品のライセンスは、自動的には新 PGIアクセラレータ™ コンパイラ製品にはアップグレードしないことをご承知おき下さい。もし、PGIアクセラレータ™ コンパイラを使用したい場合は、商用ライセンス、アカデミック用ライセンスを問わず、製品のアップグレード(有償)を行っていただく必要がございます。

Question  16. PGIアクセラレータコンパイラの価格は?

Answer  価格表は、こちらのページの「アクセラレータ機能付き(x64+GPU)」コンパイラをご覧下さい。なお、PGIアクセラレータコンパイラは、従来の x64 専用のライセンス製品とは別製品となりますので、x64 専用の従来製品のライセンスでは利用できません。x64 用製品ライセンスをお持ちで、サブスクリプション有効なお客様は、ご希望により有償にて製品のアップグレードを承ります。

Question  17. PGI 9.0 のテクノロジー・プレビューを使用するための方法を教えて下さい?

Answer  2010年1月1日以降、PGI 9.0 に入っていたアクセラレータのプレビュー機能、CUDA Fortran プレビューは、使用できなくなっております。PGI 2010 リリースにて、正式なアクセラレータコンパイラ製品が発売されましたので、新リリースをご試用ください。
 もし、PGIアクセラレータ機能を試用したい場合は、15日間有効の使用ライセンスをご利用下さい。

Question  18. アクセラレータ領域内に、総和等の「リダクション処理」がある場合、GPU上のデータパラレル処理を阻害します。今後のリリースでリダクションを可能とするサポートが予定されていますか?

Answer  2009年11月の正式版のリリースにおいて、アクセラレータ領域内でリダクション処理が可能とする機能をサポートします。
 (2009年11月更新)PGI 2010 のリリースにおいては、総和 sum タイプでプログラムされているリダクション処理を認識し並列化できるようになりました。この他、リダクション型の処理を並列化できるように順次開発更新していきます。

Question  19. 過去に終息したライセンス製品(32ビット専用製品、PGF77専用製品、PGF77/PGCC製品等)をそのサブスクリプションを更新して使用している場合、PGIアクセラレータ製品を使用するために、どのような製品のアップグレード手続きを行えば良いでしょうか?

Answer  過去に終息したライセンス製品である「32ビット専用製品」、あるいは、64ビット製品の中の「PGF77専用製品、PGF77/PGCC製品」に関しては、そのライセンスの新規販売を終了しております。しかしながら、このライセンスのサブスクリプションを更新して頂いているお客様は、そのコンパイラをそのままお使い頂いております。新しい、PGIアクセラレータ製品は、従来の製品「64ビット/32ビットPGI製品(x64製品)」をベースとしているため、一旦、「32ビット専用製品」から「従来の64ビット/32ビット製品」へのアップグレード処理を行い、さらに、もう一段、「64ビット/32ビットPGIアクセラレータ製品(x64+GPU製品)」へのアップグレード処理が必要となります(事務的には、この2段のアップグレードを纏めて行うお見積を行います)。また、64ビット製品の中の「PGF77専用製品、PGF77/PGCC製品」は、アクセラレータ機能が PGF95 コンパイラにのみ実装されているため、PGF77を含む専用製品はこの系列の上位製品が現在存在しません。従って、PGIアクセラレータ製品へ直接、アップグレードする権利がありません。これをアップグレードするには、一旦、PGF77 専用製品から PGI Fortran (F77/F95) 製品へアップグレードしていただき、もう一段、Fortranを含んだ「PGIアクセラレータ製品」へのアップグレード処理が必要となります。これに関しても、事務的には、この2段のアップグレードを纏めて行うお見積を行います。なお、「アップグレード特典」は、サブスクリプションが有効な方のみを対象としております。

Question  20. NVIDIAの Fermi GPU(Geforce 400シリーズ、tesla C2000シリーズ)をサポートしていますか?

Answer  PGI Accelerator コンパイラ製品(PGI CUDA Fortranを含む)の PGI 10.4 (2010年4月リリース)のリビジョンより、Fermi GPUをサポートする CUDA 3.0 Toolkit and compute capability 2.0に対応しました。これにより、Fermi GPU対応の プログラムバイナリが生成できます。なお、PGI 10.4 を使用できないライセンスの場合は、「サブスクリプション」の更新が必要です。ご自身のライセンス情報を確認する方法は、こちらに説明があります
 ・PGIアクセラレータ・コンパイル用のオプション
 ・PGIPGI CUDA Fortran用のオプション

Question  21. 2011年11月に公開された OpenACC プログラミング標準規格とは、何ですか?

Answer  2011年11月に、PGI社は、NVIDIA社、Cray社、CAPS社と共に、OpenACC API 仕様書を定義し公開しました。OpenACC 標準規格は、最新のオープンな並列プログラミング規格として科学技術系の多数のプログラマを対象とした新しい規格です。これは、OpenMP のようなディレクティブ・ベース(ソース上に指示行を挿入する形態)のプログラミング手法を採用しており、基本ソース・コードを修正する場合と比べてCPUとGPUを使用したアプリケーションのアクセラレーションが容易に可能となります。並列化を行いたいプログラマは OpenACC を使用し、単純な指針(=「ディレクティブ」)をコンパイラに指示し、基本ソース・コード自体を修正する必要なしに、コード内のアクセラレーション対象領域を特定することができます。プログラマが並列化対象部分をコンパイラに明らかにすることで、そのディレクティブに従って、コンパイラは並列演算をアクセラレータ上の演算器にマッピングすると言った詳細な作業を行うことができます。OpenACC ディレクティブは、マルチプラットフォーム、マルチベンダー互換のための共通基盤となるため、アクセラレーション・コンピューティングへの容易な移行が可能となります。
 今回、発表した OpenACC 仕様のほとんどは、既に、実装レベルで実績のある PGI社の PGI Accelerator programming Model がベースとなっております。今後、上記 OpenACC 仕様策定者 4 社は、OpenMP コミッティの中で、アクセラレータに関する OpenMP Working Group のメンバーとなっております。これらのメンバーは、OpenACC 仕様を OpenMP の将来のリリースに取り込み、アクセラレータをサポートするための OpenMP の拡張としての共通仕様とするべく、活動を行います。
 なお、OpenACC に関する FAQ は、こちらの正式サイトをご覧下さい

Question  22. OpenACC プログラミング規格は、なぜ必要とされたのでしょうか?

Answer  高いレベルでのプログラミング環境は、生産性を高めプログラムを作成する上で、最も重要なものとされています。CUDA や OpenCL 等の言語拡張は、2005年頃のメニーコアに対するプログラミング技術と比較したら、大きな変革をもたらした言語拡張ですが、しかし、これらは未だに低レベルの言語体系であることには変わりはありません。開発者にとって、GPU用のプログラミングを行うには敷居が高いものとなっています。こうした低レベルの開発言語のメリットは、GPU等のデバイスに細かな制御を行える点、あるいは、デバイスの性能を直接享受できるようにプログラミングが可能となる点です。しかし、ベスト・パフォーマンスを得るには、「特定」のデバイスに対するプログラムのアルゴリズム等の最適化が個々に必要となります。こうした CUDA 等の言語拡張で最小限の労力で現行のプログラムをポーティングしようすると、たとえ平凡なループでさえも、CUDA or OpenCL を使ってプログラムを書き換えなければなりません。一方、高いレベルでのプログラミングは、こうしたプログラマが直接行わなければならない部分・役割をコンパイラとランタイムが代替するものとなります。従って、現行のソースプログラムを容易にポーティングすることが可能です。

 1997年以降、OpenMP 標準規格は、共有メモリ構成のマルチプロセッサ、マルチコアシステム向けのハイレベルのプログラミングモデルとして、サポートされてきております。この規格は、従来から使われていた POSIX threads 等による低レベルの言語 API の使用を完全に置き換えてはいませんが、ほとんどのプログラマは、OpenMP のようなハイレベルのアプローチ(手法)を好んで使用しています。すなわち、こうした「標準化」によって、プログラマと ISV ソフトウェアベンダーは、並列プログラムのポータビリティを享受することができました。

 とりわけ、GPUプログラミングにとって、あるいは、一般的な「アクセラレータ」プログラミングにとって、ユーザ・コミュニティは確実に、ハイレベルでプログラミングできる標準手法を必要としています。その中には、ホストとGPU/アクセラレータとの間のデータ移動に関して最適に行うためのポータビリティのあるメカニズムの提供や、特定のGPU等のデバイスに対するコード最適化等の機能も含みます。OpenACC は、この役割を担います。PGI社は、OpenACC 仕様の根幹となるアクセラレータプログラミングモデルの技術仕様を提供し、いち早い OpenACC の標準規格の策定に貢献しました

Question  23. PGIは、なぜ、PGI Accelerator modelを単独で開発する路線を選ばず、OpenACC をサポートするのでしょうか?

Answer  PGI Accelerator Programming モデルは、2009 年11月に初期リリースして以来、NVIDIA GPUを使用する多くのユーザによって支持され使用されてきております。PGI社は、(アクセラレータ)デバイスのタイプを問わず、可搬性を有するプログラミングモデルを明示的かつ慎重に設計しました。こうした考えの上で、例えば、ディレクティブの接頭語に"PGI"と言う名前を置くと言ったようなことも避けました。こうした初期の段階から、このPGIのプログラミングモデルは、将来、「標準化」を行うための基準になるように考え、計画されました。
 現在、多くのシステムベンダーは、GPU をアクセラレータとして使用する製品を提供しています。多くのユーザや ISV は、単一のベンダーによってサポートされるよりも、コンパイラベンダー間で標準化されたプログラミングモデルを適用したいと考えているのも事実です。OpenACC は、そのモデルとなります。多くのユーザがコンパイラベンダー間での競争を導き出し、そして、それが多くの利便性を高めていくことを期待しています。こうしたことから、PGI は、OpenACCの標準化を推進しております。

PGI CUDA Fortran に関しての回答

Question  1. PGI CUDA Fortran とは何ですか?

Answer  CUDA™ は NVIDIA 社の GPU のアーキテクチャですが、NVIDIA 社からのCUDA開発環境は、CUDA C として知られている拡張 C コンパイラとツール群のみが提供されております。CUDA C は、高級言語上から GPU のために CUDA API を使用して明示的にプログラミングすることができるものです。PGI社とNVIDIA社は共同で CUDA Fortran の開発を行い、CUDA C と同等な機能をPGI Fortran 95/Fortran 2003 コンパイラに実装します。すなわち、Fortran 上の CUDA 関数呼び出しと言語拡張を行うことにより、GPU への汎用数値演算処理カーネルをマッピングすることや、x64 プロセッサと GPU 間のデータの移動と配置を明示的に制御できます。PGI CUDA Fortran コンパイラは、ネイティブ Fortran 環境でCUDA C と同等レベルの制御と最適化を実現し、PGI Fortran とCUDA C の相互運用を可能にします。PGI CUDA Fortranは、PGIアクセラレータコンパイラ製品の中で使用できます。そのコンパイラ機能の構成の概略は以下の通りです。

PGIのパッケージ

Question  2. PGIアクセラレータプログラミングとPGI CUDA Fortran プログラミングとの違いは何ですか?

Answer  「PGIアクセラレータプログラミングモデル」は、x64ホスト+GPU を実装したシステムに対して、コンパイラ指示行によるGPU データパラレルのプログラミングが可能な方法で、高レベルで開発できる環境を提供するものです。いわゆる、マルチコアCPUに対してスレッド並列を指示する OpenMP のようなコンパイラ指示行(ディレクティブ、プラグマ)をプログラム上に指定(挿入)し、コンパイラが 非明示的(implicit)に x64ホスト+GPU のデータ並列コードを生成するものです。「PGIアクセラレータモデル」は、以下のことが可能です。(プログラムの一例)

●単純なコンパイラ・ディレクティブの指定により、非常に時間の掛かるループ部分やコード領域の処理をホス トCPU 側からGPU アクセラレータ側へオフロードすることができる。
●Fortran ディレクティブや C プラグマは、一般にはコメント行として扱うことができるため、プログラムは言語標準準拠したものとして可搬性がある。
●GPU 用のプログラミングとその最適化は段階的に行うことができるため、並列の専門家でなくとも、一般のアプリケーションコードを作成するユーザにもGPU データ並列化作業が可能である。
●このプログラミングモデルは、PGF95 Fortran と PGCC C99 コンパイラで使用することができる。

 一方、CUDA Fortran は、NVIDIA社の CUDA C と同等な機能を PGI Fortran 95/Fortran 2003 コンパイラに実装したものです。CUDA C と CUDA Fortran は、多くの種類のランタイム・ライブラリ・コンポーネント(CUDA API)を使用して、低レベルの次元で明示的なプログラミングを行うことにより、GPUプログラミングに必要な全ての観点について直接に制御できるものです。これは、こう言ったGPU 並列のプログラミングに長けたエキスパート向きのプログラミングモデルと言えます。(プログラムの一例) 例えば、このモデルの場合、以下のようなプログラミングが必要となります。

●CUDA 実装された NVIDIA GPU の初期化を行う。
●GPU 計算を行いたい関数やサブルーチン内で、ホスト側コード部分とGPU計算カーネル・コード部分をソース上で分離する。
●ページ・ロックされたホスト側のメモリや GPU デバイスメモリ、GPU コンスタントメモリ、GPU 共有メモリのアロケーションを行う。
●ホスト側のメモリから、GPU 側のデバイスメモリへ様々な型のデータの移動を行う。
●(マルチ次元)の thread/block のグリッドの定義を行い、CUDA GPU 上の実行のために、その計算「カーネル」を起動する。
●CUDA のスレッド・グループ内でのスレッドの同期を行う。
●GPU 計算カーネルを非同期に起動させることや、ホスト側 CPU 実行の同期をとること等の処理。

 こうした処理を CUDA Fortran / CUDA C で提供する API を用いてプログラミングすることとなります。
 CUDA Fortran とPGIアクセラレータコンパイラを共に使用することにより、PGIのユーザは、高レベルのディレクティブ・ベースのプログラミングを使用してアプリケーションをポーティングできるだけでなく、より、詳細にGPUプログラミングを行いたいプログラム・ブロックでは、CUDA Fortran を用いて、明示的なコーディングに落とし込むことが可能となります。

Question  3. PGI CUDA Fortran は、いつから使用できますか?

Answer  PGI CUDA Fortran は、2009年11月に PGI Accelerator™ 2010(PGI 10.0リリース)製品の中に同梱され、正式にリリースされました。

Copyright © 株式会社ソフテック

PGI製品問合せはソフテックへ
PGI製品問合せはソフテックへ