PGIトップ › PGI 2017 コンパイラ製品 リリースノート › PGI 17.7 New Features

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

PGI 17.10 New Features

Tesla V100 GPU のサポート

PGI OpenACC と CUDA Fortran は Tesla V100 をサポートするようになりました。 Tesla V100 は、新しい NVIDIA Volta GV100 GPU に基づいて、より多くのメモリ帯域幅、より多くのストリーミングマルチプロセッサ、次世代NVLink、新しいマイクロアーキテクチャの機能を提供し、パフォーマンスとプログラマビリティを向上させます。 OpenACC および CUDA Fortran プログラマ向けに、Tesla V100 は、x86-64 および OpenPOWER プロセッサベースのシステム上で、CUDA Unified Memory 機能のハードウェアサポートとパフォーマンスを向上させます。
Developer View of CUDA Unified Memory Diagram

OpenACC における CUDA Unified Memory の利用

PGI 17.7コンパイラは、Pascal および Volta GPU ハードウェア機能、NVLink および CUDA Unified Memory を活用して、GPUアクセラレーションされた x86-64 および OpenPOWER プロセッサベースのサーバでの OpenACC プログラミングを簡素化します。 OpenACC において allocatable データが CUDA Unified Memory に配置されている場合、明示的なデータ移動やデータ指示は必要ありません。 これにより、割り当て可能なデータを大量に使用するアプリケーションの GPU アクセラレーションが簡素化され、アルゴリズムの並列化とスケーラビリティに集中できます。 詳細については、 OpenACC と CUDA Unified Memory PGInsider の記事を参照してください。
Deep Copy Example

Fortran派生型の自動ディープ・コピー

Fortran の派生型の自動ディープコピーにより、最近深くネストされたデータ構造を持つアプリケーションをOpenACCを使用して Tesla GPUに移植することができます。 PGI 17.7 コンパイラでは、OpenACC の COPY、COPYIN、COPYOUT、UPDATE ディレクティブに集合型 Fortranデータオブジェクトをリストして、集合データオブジェクト内のポインタベースのオブジェクトのトラバーサルと管理を含め、ホストとデバイスのメモリ間でそれらを移動できます。

LCALSベンチマーク性能

LCALS Performance Comparision

C++ の強化

PGI 17.7 C++コンパイラにはインクリメンタルな C++17 の機能が含まれており、Linux/x86-64 および Linux/OpenPOWER の両方のプラットフォームで CUDA 9.0 NVCC ホストコンパイラとしてサポートされています。 これは抽象化に伴うペナルティなしで LCALS ループのベンチマークで平均 20% のパフォーマンス向上をもたらし、OpenACC GPUアクセラレート計算領域でのキャプチャを伴うラムダをサポートし、現在は GNU 6.3 と相互運用可能です。
template <typename Execution_Policy, typename BODY>
double bench_forall ( int s, int e, BODY body ) { 
	  StartTimer ();
	  if ( is_same<Execution_Policy, Serial> :: value ) { 
	    for ( int i = s; i < e; ++i )
	      body ( i );
	  } elseif ( is_same<Executon_Policy, OpenACC> :: value ) { 
	  #pragma acc parallel loop
	  for ( int i = s; i < e; ++i )
	    body ( i );
	  } return EndTimer ( );
	}

using T = double;
void do_bench_saxpy ( int N, T*a, T*b, Tx) { 
  auto saxpy = [=]( int i ) /* Capture-by-Value */ 
	    { b[i] += a[i] * x; };

double stime = bench_forall<Serial>(0, N, saxpy);
double time = bench_forall<OpenACC>(0, N, saxpy);
printf ( "OpenACC Speedup %f \n", stime / time );
	}
	

OpenACC 領域で C++14 ラムダのキャプチャ機能を使用する

C++ラムダ式は、呼び出された場所または引数として渡された場所で、匿名関数オブジェクトを定義する便利な方法を提供します。 自動型指定子は、ラムダパラメータに適用して多型ラムダ式を作成することができます。 PGI 17.7 リリースから、C++プログラムの OpenACC 計算領域で lambda を使用できるようになりました。 OpenACC での lambda の使用は、さまざまな理由で便利です。 1つの例は、異なるプログラミングモデルまたはプラットフォームにカスタマイズされたコード生成を駆動することです。 C++14 は、特に多形ラムダのために、より多くのラムダユースケースのための扉を開いており、これらの機能はすべて OpenACC プログラムで使用可能になっています。

cusolverDN Speedup Over CPU

cuSOLVER Performance Comparison

PGI コンパイラは cuSOLVER ライブラリと相互運用可能

PGI が提供するインターフェイスモジュールと、PGI 17.7 にバンドルされている cuSOLVER ライブラリの PGI コンパイル済みバージョンを使用して、CUDA Fortran および OpenACC Fortran から最適化されたcuSolverDNルーチンを呼び出すことができるようになりました。この同じ cuSolver ライブラリは、PGI コンパイラを使用して構築されており、また、PGI OpenMP ランタイムと互換性があるため、PGI OpenACC C/C++ からも呼び出すことができます CUDA Fortran から cuSOLVER ライブラリを使用する方法の詳細をお読みください。
OpenMP

OpenMP 4.5 for Multicore CPUs

Linux/OpenPOWER および Linux/x86-64* 上の PGI Fortran、C および C++ コンパイラの OpenMP 4.5 構文および機能の初期サポートにより、マルチコア CPU またはサーバのすべてのコアで並列実行用のほとんどの OpenMP 4.5 プログラムをコンパイルできます。 TARGET領域は、マルチコアホストをターゲットとしてデフォルトでサポートされ、PARALLEL および DISTRIBUTE ループは、すべての OpenMP スレッドで並列化されます。

* PGI Linux/x86-64、LLVMベータ版パッケージは別途ダウンロードすることができます(Linux製品のサブスクリプションが有効なユーザのみ)。

PGI Unified Binary 性能

PGI Unified Binary Performance Chart

PGI Unified Binary with Tesla and MultiCore CPU

OpenACC を使用して、マルチコアサーバのすべてのコアで GPU アクセラレーションと並列実行の両方のアプリケーションを構築します。 GPU 対応システムでアプリケーションを実行すると、OpenACC 領域が GPU でオフロードされ、実行されます。 GPU がインストールされていないシステムで同じアプリケーション実行ファイルが実行されると、OpenACC 領域はシステム内のすべての CPU コアで並列に実行されます。 商用アプリケーションやプロダクションアプリケーションを開発する場合は、OpenACC を使用してコードを高速化し、GPU の有無に関わらず、任意のシステムで使用できる単一のバイナリをデプロイできます。

Using the Default PGI Code Generator:

% pgfortran -fast -Minfo -c daxpy.f90
daxpy:
  5, Generated an alternate version of the loop
     Generated vector simd code for the loop
     Generated 2 prefetch instructions for the loop
     Generated vector simd code for the loop
     Generated 2 prefetch instructions for the loop
     FMA (fused multiply-add) instruction(s) generated
	

Using the Beta LLVM Code Generator:

 % pgfortran -fast -Minfo -c daxpy.f90 -Mllvm
 daxpy:
  5, Generated vector simd code for the loop
     FMA (fused multiply-add) instruction(s) generated
	

LLVM/x86-64 コードジェネレータ

OpenACC および CUDA Fortran のサポートを含む、PGI Fortran、C および C++ コンパイラと完全に統合された LLVM/x86-64 コードジェネレータの最初のベータ版を試してみてください。 本製品の PGI コンパイラにはいくつかの制限がありますが、このベータ版では、マルチコア CPU を対象とした OpenMP 4.5 の機能が導入され、多くの C++ アプリケーションで大幅なパフォーマンス改善が図られています。 この個別にダウンロード可能なベータパッケージには、必要なすべての LLVM 4.0 コンポーネントが含まれ、デフォルトの PGI 17.7 コンパイラと一緒にインストールすることができ、簡単なコマンドラインオプションで呼び出せます。
OpenACC Construct View in the PGI Profiler

OpenACC および CUDA Unified Memory の新しいプロファイル機能

PGI Profiler には、GPU が接続されているかどうかにかかわらず、マルチコア CPU をサポートしているか、各 OpenACC 構成に費やされている時間を示す新しい要約ビューなど、OpenACC プロファイリング機能が新たに追加されました。 新しい CUDA Unified Memory の機能には、関連するデータが割り当てられたソースコード行、CUDA Unified Memory のページスラッシング、スロットルおよびリモートマップイベントのサポート、NVLINK サポートなどの CPU ページフォルトとの相関が含まれます。 新しい CUDA Unified Memory プロファイリング機能については、「CUDA 9の機能概要」を参照してください 。
PGI Documentation Cover Graphic

オンラインドキュメント

従来のPDFフォーマットに加えて、PGI Compilers&Toolsのすべてのドキュメントは、オンラインの HTML フォーマットで pgicompilers.com から入手できるようになりました。これにより、インターネットに接続されたシステムやデバイスから簡単に検索して参照できます。