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

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

PGI 2019 New Features

As of Feb. 2019

Tesla V100 GPU搭載時の高速性

PGI OpenACCとCUDA Fortranは、Tesla Volta GPUで動作するCUDA 10.0 をサポートしました。 Tesla V100 は、より多くのメモリ帯域幅、より多くのストリーミングマルチプロセッサ、次世代のNVLink、新しいマイクロアーキテクチャの機能を提供し、パフォーマンスとプログラマビリティを向上させます。 OpenACC および CUDA Fortran プログラマ向けに、Tesla V100 は、x86-64 および OpenPOWER プロセッサベースのシステムで CUDA Unified Memory 機能のハードウェアサポートとパフォーマンスを向上させています。 PGI 2019 を使用すると、世界最高クラスのCPU性能と包括的なGPUサポートの両方を実現できます。
PGI Tensor Core Support

V100 Tensor Core Support

Linux/x86-64用の NVIDIA Tesla V100 Tensor Coresは、高速のFP16行列乗算とFP16またはFP32への積算を可能にし、同じパワーエンベロープで純粋なFP32またはFP64よりも8倍から16倍高速になります。Tensor Coresを使用すると、科学者やエンジニアは、混合精度を使用して適切な数学ライブラリルーチンやアプリケーションを劇的に高速化できます。PGI 2019 Fortranコンパイラーを使えば、CUDA Fortran科学アプリケーションでTensor Coresを利用することができます。
#pragma acc kernels copy(x[0:256])
  {
    for (int i = 0; i < 256; i++) {
      if (x[i] < small) {
        printf("x at loc %03d is small: %d\n",i,x[i]);
        x[i] = small;
      } else if (x[i] > large) {
        printf("x at loc %03d is large: %d\n",i,x[i]);
        x[i] = large;
      }
   }
	          

OpenACC printf() Support

PGI 2019 C および C++コンパイラは、OpenACC計算領域でprintf() 文を使用してフォーマットされた出力をサポートするようになりました。フラグ文字、幅、精度、サイズ、およびタイプの最も一般的なフォーマット指定子がサポートされています。OpenACC領域で printf() を使用すると、マルチコア CPU と GPU の両方で OpenACC アプリケーションを開発およびチューニングする際の基本的なデバッグおよびプログラマによるトレースに役立ちます。
PGI C++17

Full C++17 Language Support

PGI C++コンパイラのリリース 2019 では、-c++17 または -std=c++17 オプションでコンパイルするときに、C++17 言語機能が完全にサポートされています。サポートされている C++17コア言語機能は、サポートされているすべての Linux および macO Sバージョンで利用可能です。新しい C++ 言語機能には、コンパイル時条件付きステートメント(constexpr if)、構造化バインディング、初期化指定子付き選択ステートメント、折り畳み式、インライン変数、constexpr ラムダ、および値による * this のラムダキャプチャが含まれます。
$ pgcc -ta=tesla:autocompare -o a.o example.c

$ PGI_COMPARE=summary,abs=2,rel=2 ./a.o

Floats at: 22562 FAILED relative test: 0.000672976 and 0.000650764, rel diff=0.0341326, tolerance REL=0.01
Floats at: 23550 FAILED relative test: 0.000672976 and 0.000650764, rel diff=0.0341326, tolerance REL=0.01
Floats at: 11599 FAILED relative test: -0.000798482 and -0.000812978, rel diff=0.0178308, tolerance REL=0.01
Floats at: 16794 FAILED relative test: -0.000403227 and -0.00038901, rel diff=0.0365471, tolerance REL=0.01
Floats at: 29318 FAILED relative test: 0.000403227 and 0.00038901, rel diff=0.0365471, tolerance REL=0.01
compared 3 blocks, 68608 elements, 274432 bytes
5 errors found in 2 blocks
63772 errors tolerated in 2 blocks
 relative tolerance = 0.010000, rel=2
 absolute tolerance = 0.010000, abs=2
	          

PCASTディレクティブ

PCI(PGI Compiler Assisted Software Testing)は、CPU と GPU アクセラレーションのバージョンのコード間、段階的に最適化するプログラムのバージョン間、または2つの異なるプロセッサアーキテクチャで実行される同じプログラム間で結果が異なる場所と理由を検出するのに役立ちます。PCAST API を使用すると、プログラムの実行中に選択したデータをキャプチャして保存した後、それを読み込んで、プログラムの別の実行で生成されたデータと比較することができます。PGI リリース 2019 には、PCAST​AAPI 用の新しいディレクティブベースのインタフェースが含まれているため、他のコンパイラやプラットフォームへの移植性を犠牲にすることなくプログラムを計測することができます。PCAST​の詳細については、PGI Compiler Assisted Software Testingの概要ページを参照してください。
PGI in the Cloud

PGI in the Cloud

Linux/x86-64用の PGI Community Edition コンパイラは、 NVIDIA GPU クラウド(NGC)上のコンテナイメージとして、Amazon Web Services(AWS)Marketplace 上の Amazon Machine Image(AMI)として利用可能になりました。 これらのイメージは、最新のマルチコア CPU および Volta V100 ファミリを含む NVIDIA GPU をサポートする OpenACC 対応の Fortran、C およびC++ コンパイラを提供します。 NGC ユーザーは、Alibaba Cloud、AWS、Google Cloud Platform、Oracle Cloud Infrastructure、またはローカルワークステーションと HPC システム上の HPC アプリケーションを開発するために、PGI コンテナを引き出すことができます。AWS ユーザーは、さまざまな AWS 対応プラットフォームで PGI AMI を実行できます。 クラウド内の PGI は、最新の NVIDIA GPU を使用してクラウド内で独自のアプリケーションを構築、テスト、ベンチマークして実行するユーザー、およびクラウドベースの並列プログラミング教育とトレーニングの開発と展開に適しています。
Auto-compare OpenACC
$ pgcc -ta=tesla:autocompare -o a.o example.c

$ PGI_COMPARE=summary,abs=2,rel=2 ./a.o

Floats at: 22562 FAILED relative test: 0.000672976 and 0.000650764, rel diff=0.0341326, tolerance REL=0.01
Floats at: 23550 FAILED relative test: 0.000672976 and 0.000650764, rel diff=0.0341326, tolerance REL=0.01
Floats at: 11599 FAILED relative test: -0.000798482 and -0.000812978, rel diff=0.0178308, tolerance REL=0.01
Floats at: 16794 FAILED relative test: -0.000403227 and -0.00038901, rel diff=0.0365471, tolerance REL=0.01
Floats at: 29318 FAILED relative test: 0.000403227 and 0.00038901, rel diff=0.0365471, tolerance REL=0.01
compared 3 blocks, 68608 elements, 274432 bytes
5 errors found in 2 blocks
63772 errors tolerated in 2 blocks
 relative tolerance = 0.010000, rel=2
 absolute tolerance = 0.010000, abs=2

PGI Auto-compare for OpenACC

プログラミングエラー、数値組み込み関数の精度、またはコンパイラの最適化のばらつきのために、計算結果は、CPU上で実行されるプログラムとGPUを実行するプログラムとで異なる可能性があります。 PGI 18.7 以降の新しいコンパイラオプション(-ta=tesla:autocompare )は、OpenACC 計算領域を CPU と GPU の両方で重複して実行させます。 データが GPU からデータ領域の境界にある CPU に戻ってコピーされると、GPU の結果は CPU 上で計算された結果と比較されます。 自動比較は、構造化データ領域と非構造化データ領域の両方で動作し、環境変数によって制御される差異レポートも提供します。 OpenACC Auto-compare を使用すると、結果が分岐し始める場所をすばやく特定し、必要に応じてプログラムやコンパイラオプションを適応させることができます。 新しいPGI Auto-compare 機能の詳細については、 PGIコンパイラ支援ソフトウェアテストの概要ページ、あるいは、リリースノートを参照してください。
typedef struct points {
    float* x;  float* y;  float* z;
    int n;
    float coef, direction;   
    #pragma acc policy copy(x[0:n]) copyin(y[0:n])
} points;

void sub ( int n, float* y ) {
    points p;
       
        
        p.n = n;
        p.x = ( float*) malloc ( sizeof ( float )*n );
        p.y = ( float*) malloc ( sizeof ( float )*n );
        p.z = ( float*) malloc ( sizeof ( float )*n );
            
        #pragma acc data copy(p)
        {
            #pragma acc parallel loop
            for ( i =0; i <p.n; ++I ) p.x[i] += p.y[i];
            . . .    

OpenACC ディープ・コピー・ディレクティブ

現代の HPC アプリケーションは、深くネストされた集約データ構造体(Fortran派生型、C++ クラス、および C 構造体)を広範囲に使用します。PGI 2019 には、Fortran、C、および C++ での OpenACC 3.0トゥルーディープコピーディレクティブのドラフトの実装が含まれています。これを使用すると、集合体の宣言内でホストとデバイスのメモリ間を移動するメンバーのサブセットを指定できます。名前付きポリシーを使用すると、プログラム内のさまざまな時点で異なるメンバーセットをコピーできます。ディープコピーパターンが定義されたら、単一のデータ句(copy(a))を使用して、動的に割り当てられたメンバを含む、選択されたメンバのメンバをコピーできます。
 % pgfortran -fast -Minfo -c daxpy.f90
 daxpy:
     5, Generated vector simd code for the loop
        FMA (fused multiply-add) instruction(s) generated
LLVM Community Growth Diagram

LLVM/x86-64 性能

Linux/x86-64 プラットフォーム用の PGI 2019 コンパイラは、新しい LLVM ベースのコードジェネレータを使用して、多くの HPC アプリケーションで最大 15% のパフォーマンス向上を実現します。GPU 用の CUDA Fortran、GPU およびマルチコア CPU 用の OpenACC 2.6、およびマルチコア CPU 用の OpenMP 4.5 は、LLVM ベースのコードジェネレータで完全にサポートされています。従来の PGI コードジェネレータは、単純なコンパイラコマンドラインオプション、コンパイラパス設定、または PGIイ ンストールに含まれる環境モジュールコマンドと共に使用できます。
SPEC CPU 2017 FPスピード

最新の CPU をサポート

マルチコアCPUのパフォーマンスは、現在も Intel Skylake、IBM POWER9、AMD EPYC などの最新世代の HPC CPU をサポートする PGI コンパイラの主な強みの1つです。PGI Fortran 2003、C11 およびC++17 コンパイラは、最先端の SIMD ベクトル化を実現し、Linux x86-64、Linux OpenPOWER、および macOS 上で最適化された単精度および倍精度数値組み込み関数の恩恵を受けます。 さまざまなHPC業界標準ベンチマークのパフォーマンス結果については、ベンチマークのセクションを参照してください。
OpenACC 2.6

OpenACC 2.6機能 フルサポート

PGI 2019 コンパイラは、Tesla GPU とマルチコア CPU の両方で最新の OpenACC 機能をサポートします。 新しい OpenACC 2.6 の機能には、手動ディープコピーディレクティブ、serial compute construct、host_data 構文の if_present clause、no_create data clause、attach / detach clause、acc_get_property API ルーチン、Fortran オプション引数のサポートの強化などがあります。 追加または拡張されたその他の OpenACC 機能には、キャッシュディレクティブの改良や、Fortranモジュールでの名前付き定数配列のサポートが含まれます。

Dramatically Lower Development Effort

Dramatically Lower Development Effort

OpenACC for CUDA Unified Memory

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

OpenMP 4.5 for Multicore CPUs

PGI 2019は、これまで Linu/OpenPOWER 用の PGIコンパイラで利用可能だった OpenMP 4.5 の構文と機能が Linux/x86-64 上の PGI Fortran、C、C ++コンパイラでサポートサポートされました。 PGI を使用して、マルチコア CPU またはサーバーのすべてのコアで並列実行用の OpenMP 4.5プログラムをコンパイルできます。 TARGET 領域は、マルチコアホストをターゲットとしてデフォルトでサポートされ、PARALLEL および DISTRIBUTE ループはすべての OpenMP スレッドで並列化されて実装されます。
.LB1_444:
        vmovupd (%r11,%r9), %zmm17
        vmovupd 64(%r9,%r11), %zmm18
        subl    $16, %r10d
        vfmadd231pd     (%rbx,%r9), %zmm16, %zmm17
        vmovupd %zmm17, (%rbx,%r9)
        vfmadd231pd     64(%r9,%rbx), %zmm16, %zmm18
        vmovupd %zmm18, 64(%r9,%rbx)
        addq    $128, %r9
        testl   %r10d, %r10d
        jg      .LB1_444
	

AVX-512 Support

最新世代のSkylake CPUで使用可能な Intel AVX-512 CPU命令は、以前の世代の AVX2 SIMD 命令と比較して2倍の浮動小数点演算を可能にします。 512ビット幅で、AVX-512 はレジスタの幅とレジスタの総数を2倍にし、HPCアプリケーションのパフォーマンスを向上させるのに役立ちます。

Using the Default PGI Code Generator:

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<Execution_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 コンパイラでは、C++ プログラムの OpenACC 計算領域でラムダを使用できます。 OpenACC での lambda の 使用は、さまざまな理由で便利です。 一つの例は、異なるプログラミングモデルまたはプラットフォームにカスタマイズされたコード生成を駆動することです。C++14では、特に多態性ラムダに対して、より多くのラムダの使用例が開かれています。そして、これらすべての機能がOpenACCプログラムで使用できるようになりました。
PGI Profiler

CPUとGPUのプロファイリング機能

PGI プロファイラーは、CPU と GPU 上の OpenACC プログラムのパフォーマンス分析をサポートします。CPU 詳細ビューには、各スレッドの CPU に費やされた時間の内訳が表示されます。3つのコールツリーオプションを使用すると、発信者、着信者、またはファイルと行番号に基づいてプロファイルを作成できます。すべてのスレッドの時間をまとめてまたは個別に表示し、イベントを最小時間または最大時間などですばやくソートします。その他の新機能には、プログラムカウンタのサンプリング頻度を調整するオプション、および NVLink トポロジのバージョンを表示する拡張ディスプレイがあります。