本ページは、NVIDIA社の CUDA™ 環境を備えた GPU 対応のコンパイラ機能を有する PGIアクセラレータ™ コンパイラ製品に関する FAQ のページです。その他、ご購入前のご相談、あるいは技術的なご質問等がある場合は、お気軽に。また、PGIアクセラレータ™ コンパイラの使用時における技術的な問題に関する FAQ は、別のページにてご案内しております。
© 株式会社ソフテック
PGIアクセラレータに関しての回答
1. PGIアクセラレータコンパイラがサポートするプログラミング言語は何ですか?
現在、PGFORTRAN FortranコンパイラとPGCC® ANSI C11/C++11コンパイラの言語でPGIアクセラレータ機能をサポートしています。PGF95™ Fortranコンパイラは、F77/F90/F95/F2003 の全ての構文と、ファイル仕様をサポートしますので、本コンパイラでは、過去の FORTRAN77 構文も解釈し、入力ソースファイルも固定形式、自由形式もサポートします。また、PGI CUDA Fortan も同じ PGFORTRAN コンパイラ上でサポートします。pgfortran コマンド名は、pgf90 あるいは、pgf95 と言う名前でエイリアスされており、各コマンド名で使用できます。
2. PGIアクセラレータコンパイラがサポートするOSプラットフォームは何ですか?
2009年11月の正式製品リリースから、Linux、Windows、OS X の32ビットあるいは64ビット環境のプラットフォームをサポートしました。但し、OS X は、NVIDIA社の 64ビット CUDA SDK 環境がリリースされた後に、サポートしました。PGI 2010リリース当初、OS X 32ビット環境のみをサポートしましたが、OS X の 64bit環境上の PGI Accelarator/CUDA Fortran は、PGI 11.3 以降においてサポートされました。
3. PGIアクセラレータコンパイラがサポートするGPGPU(アクセラレータ)は何ですか?
PGIアクセラレータコンパイラは、compute capability 1.1 以上の CUDA 環境を有するNVIDIA GPUアクセラレータをサポートしています。その他の(他社の)アクセラレータへの適用に関しても、そのソフトウェア環境整備が整えば、サポートを検討しています。
4. CUDAソフトウェアをインストールしておく必要がありますか?
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のインストール時に実装されます。
5. コンパイラは、IEEEスタンダード浮動小数点演算方式をサポートしますか?
現在発売されている GPU アクセラレータは、IEEE floating-point Standard 仕様のほとんどをサポートしています。しかしながら、全ての「丸めモード」をサポートしていないこと、また、いくつかの処理、とりわけ、スクエア・ルートや指数関数、対数関数、超越関数などは、フルな精度を有する結果を提供しない場合があります。これは、ハードウェア自体の制約であり、コンパイラによって対策を講じることができない問題です。GPU ハードウェアの進化により、こうした問題は解決されるものと思われます。
(2010年追記)NVIDIA Fermi 以降では、GPU が IEEE 754-2008 floating-point standard に準拠しましたので、サポートします。
6. PGIアクセラレータコンパイラは倍精度をサポートしますか?
コンパイラは倍精度をサポートします。しかし、Fermi 以前のGPUのアクセラレータ・ハードウェアは倍精度をサポートしていますが、その性能は単精度に比べて極端に悪いことを注意すべきです。これは、GPU のハードウェア自体に倍精度演算機構が十分に実装されていないための問題です。2010年春の Fermi GPUがリリースされた以降は、十分な倍精度対応演算器が実装されましたので、この問題は解決されています。
7. 自分のPGIでコンパイルされたコードからCUDAカーネル関数を呼ぶことができますか?
PGIは、現在、C あるいは Fortranプログラムから直接、CUDAや PTX や他の言語で記述したカーネル関数をコールできるように、その機能設計を行っております。この機能が利用できるようになった時点で、アナウンスする予定です。
8. 同じアプリケーションで、CUDA C プログラミングと PGI アクセラレータプログラミングを混在できますか?
これは、可能です。しかし、PGI 2010 リリースでは、CUDA C コードと PGIアクセラレータコード間の「デバイスデータ」を共用する方法を有していません。この機能は重要なものと認識していますので、今後のリリースにてその解決を図るように現在取り組んでいます。
9. コンパイラは、同じプログラムで複数のGPUの使用をサポートしますか?
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並列領域において、各スレッドがイテレーションの異なるサブセットを計算するようなループを持つアクセラレータ・リージョンを含むことができます。
10. OpenMPのように、PGIのアクセラレータディレクティブを標準コミッティに公開しますか?
PGI は、このアクセラレータ・プログラミング・モデルとそのディレクティブに関する経験を踏まえ、今後、標準コミッテへ開示してしております。OpenMP ARB は、現在、GPGPU等の「アクセラレータ」をサポートするための OpenMP API を拡張するためのサブコミッティを設けて、その策定活動をしています。PGI は、このサブコミッティの中で、主要な活動を行っております。さらに、2011年11月に、PGI は、NVIDIA社、Cray社、CAPS社と共に、OpenACC API 仕様を定義し公開しました。OpenACC は、最新のオープンな並列プログラミング規格として科学技術系の多数のプログラマーを対象とした新しい規格です。なお、この仕様は、PGI の PGI Accelerator programming Model がベースとなっております。2012年3月に、OpenMP ARB は、次期 OpenMP 4.0 バージョンに、アクセラレータ機能を追加することを正式に表明しました。この有力な候補として OpenACC が見込まれております。
11. GPUを有していないマシン上で、プログラムを実行出来ますか?
ホスト側のアクセラレータ(GPU)の有無に係わらず、実行可能なモジュールを生成することができます。これは、PGI Unified Binary™ 技術によるもので、一つの executable ファイルに、GPU用コードを含めた複数のCPUターゲット用の最適化コードを作成することができます。こうした実行モジュールは、実行時に、GPUの存在の有無を判断して、存在した場合、ホストとGPUの両方を使用したコードが実行され、もし、GPUが存在していない場合は、ホスト用のコードのみで実行されます。
12. 個々の異なる GPU モード用にプログラムを再ビルドしなければなりませんか?
生成される GPU コードは、従来のグラフィックスアプリケーションやゲームで使用されているものと同じ技術を使用しています。すなわち、プログラムは、動作マシンに搭載された特定の GPUモデル用に、GPUベンダーが提供したドライバーにて、実行時に動的に翻訳、再最適化される可搬性のある中間フォーマットを使用しています。従って、今後、GPUカードをアップグレードしたり、あるいは、GPUの異なるモデルを持ったマシン上で自分のプログラムを使用すると言った状況であっても、自身の作成したプログラムを引き続き動作させることができます。
13. GPUコード内で、関数やサブプログラムの呼び出し(コール)ができますか?
現在、GPUは、関数コールをサポートしていません。従って、一般的にはできません。関数をプログラム内でインライン展開する必要があります。
21. 2011年11月に公開された OpenACC プログラミング標準規格とは、何ですか?
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 は、こちらの正式サイトをご覧下さい。
22. OpenACC プログラミング規格は、なぜ必要とされたのでしょうか?
高いレベルでのプログラミング環境は、生産性を高めプログラムを作成する上で、最も重要なものとされています。CUDA や OpenCL 等の言語拡張は、2005年頃のメニーコアに対するプログラミング技術と比較したら、大きな変革をもたらした言語拡張ですが、しかし、これらは未だに低レベルの言語体系であることには変わりはありません。開発者にとって、GPU用のプログラミングを行うには敷居が高いものとなっています。こうした低レベルの開発言語のメリットは、GPU等のデバイスに細かな制御を行える点、あるいは、デバイスの性能を直接享受できるようにプログラミングが可能となる点です。しかし、ベスト・パフォーマンスを得るには、「特定」のデバイスに対するプログラムのアルゴリズム等の最適化が個々に必要となります。こうした CUDA 等の言語拡張で最小限の労力で現行のプログラムをポーティングしようすると、たとえ平凡なループでさえも、CUDA or OpenCL を使ってプログラムを書き換えなければなりません。一方、高いレベルでのプログラミングは、こうしたプログラマが直接行わなければならない部分・役割をコンパイラとランタイムが代替するものとなります。従って、現行のソースプログラムを容易にポーティングすることが可能です。
1997年以降、OpenMP 標準規格は、共有メモリ構成のマルチプロセッサ、マルチコアシステム向けのハイレベルのプログラミングモデルとして、サポートされてきております。この規格は、従来から使われていた POSIX threads 等による低レベルの言語 API の使用を完全に置き換えてはいませんが、ほとんどのプログラマは、OpenMP のようなハイレベルのアプローチ(手法)を好んで使用しています。すなわち、こうした「標準化」によって、プログラマと ISV ソフトウェアベンダーは、並列プログラムのポータビリティを享受することができました。
とりわけ、GPUプログラミングにとって、あるいは、一般的な「アクセラレータ」プログラミングにとって、ユーザ・コミュニティは確実に、ハイレベルでプログラミングできる標準手法を必要としています。その中には、ホストとGPU/アクセラレータとの間のデータ移動に関して最適に行うためのポータビリティのあるメカニズムの提供や、特定のGPU等のデバイスに対するコード最適化等の機能も含みます。OpenACC は、この役割を担います。PGI は、OpenACC 仕様の根幹となるアクセラレータプログラミングモデルの技術仕様を提供し、いち早い OpenACC の標準規格の策定に貢献しました。
23. PGIは、なぜ、PGI Accelerator modelを単独で開発する路線を選ばず、OpenACC をサポートするのでしょうか?
PGI Accelerator Programming モデルは、2009 年11月に初期リリースして以来、NVIDIA GPUを使用する多くのユーザによって支持され使用されてきております。PGI は、(アクセラレータ)デバイスのタイプを問わず、可搬性を有するプログラミングモデルを明示的かつ慎重に設計しました。こうした考えの上で、例えば、ディレクティブの接頭語に"PGI"と言う名前を置くと言ったようなことも避けました。こうした初期の段階から、このPGIのプログラミングモデルは、将来、「標準化」を行うための基準になるように考え、計画されました。
現在、多くのシステムベンダーは、GPU をアクセラレータとして使用する製品を提供しています。多くのユーザや ISV は、単一のベンダーによってサポートされるよりも、コンパイラベンダー間で標準化されたプログラミングモデルを適用したいと考えているのも事実です。OpenACC は、そのモデルとなります。多くのユーザがコンパイラベンダー間での競争を導き出し、そして、それが多くの利便性を高めていくことを期待しています。こうしたことから、PGI は、OpenACCの標準化を推進しております。
PGI CUDA Fortran に関しての回答
1. PGI CUDA Fortran とは何ですか?
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アクセラレータコンパイラ製品の中で使用できます。そのコンパイラ機能の構成の概略は以下の通りです。
2. PGIアクセラレータプログラミングとPGI CUDA Fortran プログラミングとの違いは何ですか?
「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 を用いて、明示的なコーディングに落とし込むことが可能となります。
3. PGI CUDA Fortran は、いつから使用できますか?
PGI CUDA Fortran は、2009年11月に PGI Accelerator™ 2010(PGI 10.0リリース)製品の中に同梱され、正式にリリースされました。
Copyright © 株式会社ソフテック