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

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

PGI 2018 New Features

As of Nov. 2018

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 2018 を使用すると、世界最高クラスのCPU性能と包括的なGPUサポートの両方を実現できます。
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 を使用してクラウド内で独自のアプリケーションを構築、テスト、ベンチマークして実行するユーザー、およびクラウドベースの並列プログラミング教育とトレーニングの開発と展開に適しています。
$ 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 ディープ・コピー・ディレクティブ

PGI 18.10 には、Fortran、C、および C++での OpenACC 3.0規格である真のディープ・コピー・ディレクティブのドラフトの実装が含まれています。 現代の HPC アプリケーションの多くは、深く入れ子になった集約データ構造(Fortran集約型、C ++クラス、C構造体)を幅広く使用しています。 真のディープ・コピー・ディレクティブを使用すると、プログラムの異なるポイントに異なるメンバー・セットをコピーできる名前付きポリシーのサポートを含め、集約宣言内でホストとデバイスのメモリー間を移動するメンバーのサブセットを指定できます。 ディープコピーパターンが定義されると、動的に割り当てられたメンバを含む、集約データ内の選択されたメンバをコピーするために、単一のデータ句(copy(a))を使用できます。
 % pgfortran -fast -Minfo -c daxpy.f90 -Mllvm
 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 2018 コンパイラには、オプションの LLVM ベースのコードジェネレータが含まれており、多くの HPC アプリケーションで最大 15% の性能向上を実現します。 OpenACC および CUDA Fortran は LLVM ベースのコードジェネレータで完全にサポートされており、最新のマルチコア x86-64 および OpenPOWER CPU で OpenMP 4.5 の機能をサポートします。 コンパイラのパス設定で利用するか、PGIインストールに含まれる環境モジュールコマンドを使用して、単純なコンパイラコマンドラインオプションを使用して呼び出すことができます。 LLVM ベースのコードジェネレータは、将来の PGI リリースで x86-64 ターゲットのデフォルトになります。 マルチコア CPU のパフォーマンスを向上させ、最新の OpenMP 機能を利用し、将来の PGI リリースへの移行を簡素化するために、今すぐ使用してください。
SPEC CPU 2017 FPスピード

最新の CPU をサポート

マルチコアCPUの性能は、PGIコンパイラの強みの1つとして、インテル Skylake、IBM POWER9、AMD Zen など最新のHPC CPUをサポートしています。 PGI Fortran 2003、C11 および C++14 コンパイラは、最先端のSIMDベクタライゼーションを提供し、Linux x86、Linux OpenPOWER、および macOS で新しく最適化された単精度および倍精度数値組み込み関数の恩恵を受けます。 さまざまなHPC業界標準のベンチマークに関する PGI 2018のパフォーマンス結果のベンチマークのセクションを参照してください
OpenACC 2.6

OpenACC 2.6機能 フルサポート

すべてのPGIコンパイラは、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 の記事を参照してください。
.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アプリケーションのパフォーマンスを向上させるのに役立ちます。
C++17

New C++17 Features

PGI C ++コンパイラのリリース2018では、 --c++17 または -std=c++17 でコンパイルするときのC++17標準に対する部分的なサポートが導入されています。 サポートされているC++17コア言語機能は、サポートされているすべての MacOS バージョンおよび GCC 5 以降のLinux システムで使用できます。 新しいC++言語機能には、コンパイル時条件文(constexpr if)、構造化バインディング、初期化子付き選択文、式の折り返し、インライン変数、constexpr lambdas、* by this の値によるラムダキャプチャが含まれます。
OpenMP

OpenMP 4.5 for Multicore CPUs

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

PGI Unified Binary for Tesla and Multicore

PGI Unified Binary Performance Chart

PGI Unified Binary Performance

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

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 プログラムで使用できるようになりました。

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 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 Code Generator

リリース2018には、OpenACC および CUDA Fortran のサポートを含む、PGI Fortran、C および C++ コンパイラと完全に統合された x86-64 用の LLVM コードジェネレータが含まれています。 この最初のリリースでは、マルチコア x86-64 CPU を対象とした OpenMP 4.5 機能のサポートが導入され、多くの C++ アプリケーションでパフォーマンスが向上しています。 PGI Linux インストールパッケージの一部として含まれる LLVM コンポーネントは、デフォルトの PGI コンパイラと一緒にインストールされ、簡単なコマンドラインオプションで呼び出すことができます。
PGI Profiler

強化されたプロファイリング機能

新しい CPU の詳細ビューには、各スレッドのCPUに費やされた時間の内訳が表示されます。 3つのコールツリーオプションを使用すると、caller、callee、ファイルと行番号に基づいてプロファイルを作成できます。 すべてのスレッドの時間を一緒にまたは個別に表示し、イベントを最小または最大時間などですばやくソートします。 その他の新機能には、プログラム・カウンタのサンプリング周波数を調整するオプションと、NVLink バージョンの NVLink トポロジを示す拡張表示があります。