PGIトップ › PGIサポートセンター › PGIリリースノート

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

PGI 2013 コンパイラ製品 リリースノート

support

 米国 PGI の PGIコンパイラ製品のバージョンPGI 2013 (PGI 13.x) をリリースしましたのでお知らせいたします。本リリースにおける製品の主な新機能、特徴に関してPDFファイルに記述しておりますので、詳細は、以下のPDFファイルをご覧下さい。なお、ソフトウェアは こちらのページにてダウンロード可能です。
 現在の最新バージョンは、PGI 2013(旧バージョン形式で言うと PGI 13.x) となります。年間サブスクリプション契約をご購入あるいはご継続中のお客様は、新リリースのソフトウェアをダウンロードの上、インストールをお願いいたします。「バージョンアップの方法」や最新の「日本語インストールの手引き」は、お客様専用のページへご案内いたしますので、そのページをお分かりにならない場合は、弊社 support@softek.co.jp までご連絡下さい。

Current Version

製品名 現バージョン
PGI (Accelerator) Workstation / Server for Linux
13.10
PGI (Accelerator) Workstation / Server for Windows 13.10
PGI (Accelerator) Workstation for OS X 13.10
PGI (Accelerator) Visual Fortran (Windows) 13.10
PGI CDK for Linux (ご契約ユーザ様専用ページにて) 13.10
PGI製品のお求めは、米国 PGI と 20 年以上に及ぶ強力なパートナーであるソフテックへ

▶ PGI 2013 (PGI 13.x) リリースノート(PDF)

PGI コンパイラ製品の最新バージョン(Release 2013) の日本語版リリースノートについては、PDFファイルをご覧下さい。
英語版のリリースノートは、こちらをご覧下さい

PDF

PGI 13.10(2013年10月)

■ PGI Accelerator (OpenACC)

-ta オプションにいくつかの変更があった。

  • -ta=nvidia:noL1 が追加された。これは、グローバル変数をキャッシュするためのハードウェア L1 データキャッシュの使用を抑止することを指示するものである
  • -ta=nvidia:keepbin は、-ta=nvidia:keep に置き換わった
  • -ta=nvidia:keepgpu は、-ta=nvidia:keep に置き換わった
  • -ta=nvidia:keepptx は、-ta=nvidia:keep に置き換わった
  • -ta=nvidia:mul24 は削除された
  • -ta=nvidia:[no]wait は削除された
  • -ta=nvidia:analysis は削除された

■ PGI CUDA Fortran

-Mcuda オプションに noL1 サブオプションが追加された。これは、グローバル変数をキャッシュするためのハードウェア L1 データキャッシュの使用を抑止することを指示するものである。

■ 26 個のバグフィックスを行った

PGI 13.9(2013年9月)

■ PGI Accelerator (OpenACC)

CUDA 5.5 toolkit を同梱し、サポート。CUDA 5.0 toolkitをデフォルトとして使用する。

■ PGI Fortran

CUDA 5.5 toolkit を同梱し、サポート。CUDA 5.0 toolkitをデフォルトとして使用する。compute capability 3.x の shuffle 機能(__shfl(), __shfl_up(), __shfl_down(), and __shfl_xor())をサポートした。これらの関数は、warp 内のスレッド間で変数へのアクセスを可能とするものである。CUDA Fortran 上での lane は、Fortran's 1 ベースのナンバリング方法を採用している。詳細については、、PGI 2013 Release Notes P21 をご参照ください。

■ 41 個のバグフィックスを行った

PGI 13.8(2013年8月)

■ ソフトウェアの著作件名を NVIDIA CORPORATIONに変更。内部的には PGI 13.7 と同じ。

PGI 13.7(2013年7月)

■ PGI Compilers

AVX を使用したベクトル化コードの性能の向上

■ CUDA Fortran

新しい Fortran atomic をサポート。以下の表の "new"は、PGI13.7 以降で新しくサポートしたもの。"prev"は以前からサポートしているもの。

Supported CUDA Fortran Atomic Functions

  integer*4 integer*8 real*4 real*8
atomicCAS prev new new new
atomicADD prev prev prev prev
atomicEXCH prev prev prev new
atomicSUB prev new new new
atomicMAX prev new new new
atomicMIN prev new new new

■ PGI C++

-Minfo メッセージは、アン・マングル名(実際のルーチン名)を使用して表示

■ PGDBG Debugger

Linux kernels 2.6.32以上のシステム上でハードウェア・ウォッチポイントをサポート

■ OpenACC/CUDA Fortran Profiling

OpenACC/CUDA Fortran のプロファイリング機能がマルチデバイス対応となり、プロファイル表示を全体的に刷新した。以下は、デバイス二つで実行した際のプロファイリングの表示例。

■ PGI Fortran I/O

PGI 13.7は、「Intel Fortran User's Guide Vol. 1, Building Applications, Variable-Length Records Greater than 2 Gigabytes」で記述されてる可変長記録のフォーマットを実装した。これを PGI Fortran のデフォルトとした。旧ファイル書式で書かれたファイルをアクセスするには、環境変数 FORTRANOPT に pgi_legacy_large_rec_fmt をセットすること。

■ 38 個のバグフィックスを行った

PGI 13.6(2013年6月)

■ Fortran 2008

Elemental procedure 中に「impure」属性をサポートしました。

■ ツール

PDGDBGデバッガや Allinea MAP MPI Application Profilerなどのサードパーティツールの機能向上のために「行情報」の強化を行いました。

■ 36 個のバグフィックスを行った

PGI 13.5(2013年5月)

■ PGDBG® デバッガと PGPROF® プロファイラ

PGI 13.5 for Linux の PGDBG と PGPROF は、SGI MPI を用いてビルドしたMPIプログラムのデバッギングとプロファイリングをサポートしました。SGI MPI プログラムのデバッグを行うためには、pgdbg の -sgimpi オプションを使用します。(これは今まで -mpi オプションとして使用している部分を代替するものです。)また、プロファイラを使用するために、コンパイルとリンク時に、オプションとして-Mprof=func,sgimpi、-Mprof=lines,sgimpi、-Mprof=time,sgimpiを指定しなければいけません。たとえ、mpif90 や mpicc 等のコマンドを使用したとしても、必ず、これらのオプションを明示的に使用してください。

■ 二つの Fortran 2008 機能を追加した

ファイルのオープン時にユニットの検索を行う機能、複素数の実部と虚部の派生型スタイルによるアクセス機能、これら二つの F2008 機能の追加を行いました。

■ 全ての言語コンパイラの最適化において、複素数演算の性能向上を行った

■ 50 個のバグフィックスを行った

PGI 13.4(2013年4月)

■ F2003 non-default 派生型 I/O 機能の追加

PGI 13.4 は、F2003 non-default 派生型 i/oをサポートしました。この機能を使うと、ユーザが定義する派生型や、ベンダーが提供する派生タイプ用に、書式付きあるいは書式無しの I/O ルーチンを作成することが出来る。コールされるサブルーチンへのインタフェースは、厳密に行う必要があるため、最新の PGI Fortran Reference マニュアルを参考にしてください。この機能を使用した一例を以下に示します。

[kato@photon29 tmp]$ cat derivedio.f90
module m1
  use iso_c_binding
  interface write(formatted)
    module procedure print_c_ptr
  end interface

  contains
  	! C型ポインタの場合の出力定義
    subroutine print_c_ptr(dtv,unit,iotype,v_list,iostat,iomsg)

    class(c_ptr), intent(in) :: dtv
    integer, intent(in) :: unit
    character(*), intent(in) :: iotype
    integer, intent(in) :: v_list(:)
    integer, intent(out) :: iostat
    character(*), intent(inout) :: iomsg
    integer(c_intptr_t) :: iptrval
    iptrval = transfer(dtv, iptrval)

    if (c_intptr_t.eq.4) then
      write(unit,fmt='("0x",z8.8)') iptrval
    else
      write(unit,fmt='("0x",z16.16)') iptrval
    endif
    end subroutine print_c_ptr
  end module m1

program p1
use m1
type(c_ptr) :: p
integer, target :: i, j
p = c_loc(i)             ! p は c型ポインタ変数
print *,p                ! 暗黙のプリントのため、pの型に従い出力される
end
-----
(実行)
64bit 用にコンパイル
[kato@photon29 tmp]$ pgf90 -m64 derivedio.f90
[kato@photon29 tmp]$ ./a.out
0x00007FFF755D70F0

32bit 用にコンパイル
[kato@photon29 tmp]$ pgf90 -m32 derivedio.f90
[kato@photon29 tmp]$ ./a.out
0x080AA55C

■ CUDA Fortran デバイスコード内の F90 ポインタのサポート

PGI 13.4 において、CUDA Fortran デバイスコード内で F90 ポインタを使用出来るようにしました。まず最初にこのリリースの実装では、ポインタは、デバイスコードを含んでいる MODULE 内の範囲で使用される形がサポートされます。今後段階的に、その使用範囲(スコープ範囲)を広げる予定です。通常、ホストコードは MODULE を使用することができポインタを操作出来ます。ホストコードは、さらに、引数としてそのポインタを渡すこともできます。以下に、一例を示します。

[kato@photon29 tmp]$ cat devptr.f90
! Device pointer in module, and passed as argument
module devptr
! pointer declarations must be in the module in which they are used
  real, device, pointer, dimension(:) :: mod_dev_ptr
  real, device, pointer, dimension(:) :: arg_dev_ptr
  real, device, target, dimension(4) :: mod_dev_arr
  real, device, dimension(4) :: mod_res_arr
contains
  attributes(global) subroutine test(arg_ptr)
  real, device, pointer, dimension(:) :: arg_ptr
  if (associated(arg_ptr)) then
    mod_res_arr = arg_ptr
  else
    mod_res_arr = mod_dev_ptr
  end if
  end subroutine test
end module devptr

program test
use devptr
real, device, target, dimension(4) :: a_dev
real result(20)
a_dev = (/ 1.0, 2.0, 3.0, 4.0 /)

! Pointer assignment to device array declared on host,
! passed as argument
arg_dev_ptr => a_dev
call test<<<1,1>>>(arg_dev_ptr)
result(1:4) = mod_res_arr

!$cuf kernel do <<<*,*>>>
do i = 1, 4
  mod_dev_arr(i) = a_dev(i) + 4.0
  a_dev(i) = a_dev(i) + 8.0
end do

! Pointer assignment to module array, argument nullified
mod_dev_ptr => mod_dev_arr
arg_dev_ptr => null()
call test<<<1,1>>>(arg_dev_ptr)
result(5:8) = mod_res_arr

! Pointer assignment to updated device array, now asssociated
arg_dev_ptr => a_dev
call test<<<1,1>>>(arg_dev_ptr)
result(9:12) = mod_res_arr
!$cuf kernel do <<<*,*>>>
do i = 1, 4
  mod_dev_arr(i) = 25.0 - mod_dev_arr(i)
  a_dev(i) = 25.0 - a_dev(i)
end do

! Non-contiguous pointer assignment to updated device array
arg_dev_ptr => a_dev(4:1:-1)
call test<<<1,1>>>(arg_dev_ptr)
result(13:16) = mod_res_arr

! Non-contiguous pointer assignment to updated module array
nullify(arg_dev_ptr)
mod_dev_ptr => mod_dev_arr(4:1:-1)
call test<<<1,1>>>(arg_dev_ptr)
result(17:20) = mod_res_arr
print *,result
end

[kato@photon29 tmp]$ pgf90 -Mcuda devptr.f90
[kato@photon29 tmp]$ ./a.out
    1.000000        2.000000        3.000000        4.000000
    5.000000        6.000000        7.000000        8.000000
    9.000000        10.00000        11.00000        12.00000
    13.00000        14.00000        15.00000        16.00000
    17.00000        18.00000        19.00000        20.00000

■ OS X 上のデバッガ・プロファイラ使用時のシステム設定について

以前のバージョンにおいて、OS X 上では、デバッガ・プロファイラを使用する際に必要であったシステム設定を行う必要がなくなりました。デバッガやプロファイル情報コレクターは、"group procmod"権限を用いて実行させる必要がなくなりました。しかしながら、実行プロセスにアタッチするデバッグをする場合、当該ユーザは、"_developer"と言う Groupのメンバーであるようにしておく必要があり、その際にその認証を行う必要があります。詳細については、PGI 2013 Installation Guide の System Configuration to Enable Debugger ‘Attach’をご参照ください。

■ 13 個のバグフィックスを行った

PGI 13.3(2013年3月)

■ 15 個のバグフィックスを行った

PGI 13.1/13.2(2013年1月、2月)

■ GNU 互換 PGI C++ コンパイラ(pgc++) の提供 (Linux 版のみ)

PGI 13.1 より、GNU 互換 PGI C++ コンパイラを提供しました。これは、GNU C++(g++) のシステムライブラリを直接リンクし、実行モジュールを生成します。 pgc++ コマンド、あるいは、pgcpp --gnu コマンドにより使用できます。このコンパイラは、PGI 以外の C++ ライブラリあるいは STL ライブラリを扱う際に生じる問題を避けるために、システムGNU C++ ライブラリを使用します。また、このコンパイラは、現在、業界で進められている新しい C++ ABI(Application Binary Interface) に準拠したコードを生成できます。C++ プログラマは、この新しいコンパイラによっていくつか重要な利点を享受できます。その中で最も重要なポイントは、STL や Boost を含め、Linux のシステム C++ ライブラリをリンク出来ることであり、すなわち、他のコンパイラと同様に PGI コンパイラを使って、STL or Boostベースのコードを動作させることができます。ただし、現在の実装では、long double size に関しては互換性がありません。もし、long double パラメータが存在する場合、そのルーチンを含むファイルは全て g++ 等の同じコンパイラでコンパイルすることが必要です。但し、pgc++ は、自身の math ライブラリを使用しますので、リンク操作は必ず、pgc++ コマンド(ドライバー)で行う必要があります。

なお、現在、サブスクリプション有効期間内のお客様で、新たな pgc++コンパイラ・コマンドを使用するためには、ライセンスキーファイルの更新が必要です。PGI のサイトにログイン後、「Create Permanent Keys」メニューから、当該所有 PIN の登録してある license key を read (呼び出す)と画面に新しいキーが再表示されます。これをコピーして、新しい license.dat としてシステムに設置してください。その後、ライセンスマネージャを再起動してください。

以下に、GNU 互換 PGI C++ コンパイラの特徴を記します。なお、従来の pgCC (pgcpp) コマンドも併せて使用できますので、状況に応じて使い分けてください。

 GNU 互換 PGI C++ (pgc++ コマンド)コンパイラの概要

  • GNU C++ システムライブラリをリンクし、バイナリを生成する
  • C++ の新しい ABI に準拠する
  • GNU GCC g++ 4.8 までの互換性を有する
  • 新しいAVX 命令・SSE命令によるベクトル化対応
  • マルチコア向けの OpenMP 並列並びに自動並列化
  • 異なるターゲットプロセッサ用に最適化したコード生成(PGI Unified Binary 対応)
  • 先進の内部手続き間最適化(IPA)
●従来からの PGI C++ コンパイラ (pgcpp)
[photon29 ~]$ pgcpp test.cpp -V
pgcpp 13.1-1 64-bit target on x86-64 Linux -tp nehalem

[photon29 ~]$ ldd a.out
Scientific Linux release 6.3 (Carbon)
        linux-vdso.so.1 =>  (0x00007fffb27f1000)
        libnuma.so => /usr/pgi/linux86-64/13.1/lib/libnuma.so (0x00007f33de493000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003288000000)
        libm.so.6 => /lib64/libm.so.6 (0x0000003288400000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003287800000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003287400000)
        
●新しい GNU 互換 PGI C++ コンパイラ (pgc++)      
[photon29 ~]$ pgc++ test.cpp -V
pgc++ 13.1-1 64-bit target on x86-64 Linux -tp nehalem

以下のように、GNU システムライブラリを dynamic loading することが分かる
[kato@photon29 ~]$ ldd a.out
Scientific Linux release 6.3 (Carbon)
        linux-vdso.so.1 =>  (0x00007fff9b3ff000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003293400000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003294000000)
        libnuma.so => /usr/pgi/linux86-64/13.1/lib/libnuma.so (0x00007ffbc11de000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003288000000)
        libm.so.6 => /lib64/libm.so.6 (0x0000003288400000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003287800000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003287400000)

■ GPU Computing

  • PGI 13.1 において、-ta=nvidia-Mcuda に新たなサブオプションが追加されました。
  • CUDA Fortran は、 Fortran module 内のデバイスルーチンだけでなく、単独のデバイスルーチンの分割コンパイルとリンクをサポートしました。このためには -Mcuda=rdc サブオプションを付加する必要があります。
  • 最新の NVIDIA Tesla K20 と K20X GPUs、CUDA 5.0 をサポートしました。
     以下は、Linux 版の結果
    Kepler K20c ボードの pgacceleinfo の 情報
    [kato@photon29 ~]$ pgaccelinfo
    CUDA Driver Version:           5000   <=== CUDA 5.0 ドライバーを使用していると言う意味
    NVRM version: NVIDIA UNIX x86_64 Kernel Module  304.54  Sat Sep 29 00:05:49 PDT 2012
    
    CUDA Device Number:            0
    Device Name:                   Tesla K20c  <=== Kepler
    Device Revision Number:        3.5
    Global Memory Size:            5368512512
    Number of Multiprocessors:     13
    Number of SP Cores:            2496
    Number of DP Cores:            832
    Concurrent Copy and Execution: Yes
    Total Constant Memory:         65536
    Total Shared Memory per Block: 49152
    Registers per Block:           65536
    Warp Size:                     32
    Maximum Threads per Block:     1024
    Maximum Block Dimensions:      1024, 1024, 64
    Maximum Grid Dimensions:       2147483647 x 65535 x 65535
    Maximum Memory Pitch:          2147483647B
    Texture Alignment:             512B
    Clock Rate:                    705 MHz
    Execution Timeout:             No
    Integrated Device:             No
    Can Map Host Memory:           Yes
    Compute Mode:                  default
    Concurrent Kernels:            Yes
    ECC Enabled:                   No
    Memory Clock Rate:             2600 MHz
    Memory Bus Width:              320 bits
    L2 Cache Size:                 1310720 bytes
    Max Threads Per SMP:           2048
    Async Engines:                 2
    Unified Addressing:            Yes
    Initialization time:           85784 microseconds
    Current free memory:           5287567360
    Upload time (4MB):              928 microseconds ( 724 ms pinned)
    Download time:                 1003 microseconds ( 642 ms pinned)
    Upload bandwidth:              4519 MB/sec (5793 MB/sec pinned)
    Download bandwidth:            4181 MB/sec (6533 MB/sec pinned)
    PGI Compiler Option:           -ta=nvidia,cc35   <== この target のコンパイルオプション
    
    PGI 13.1 以降では、デフォルトで使用する CUDA toolkit バージョンは 4.2 であるため
    cuda 5.0 のライブラリを使用して kepler(cc 3.5) のコードを生成するには
    以下の -ta=nvidia,cuda5.0,cc35 オプションを明示的に指定する。
    
    $ pgfortran -acc -ta=nvidia,cuda5.0,cc35 -Minfo -fast test.f90
    $ pgfortran -Mcuda=cuda5.0,kepler, -Minfo -fast -O2 test.cuf
    
  • PGI 12.x まで有効であった OpenACCならびにPGI アクセラレータプログラミングモデルのオプションである -ta=time の "time" sub-option は廃止されました。これは、実行終了時に簡易プロファイル情報を出力するオプションでした。今後は、こうした目的で、汎用的に使用できるように 環境変数 PGI_ACC_TIME を提供し、この変数に 1 をセットすることにより、アクセラレータ実行の簡易プロファイル情報を表示できます。なお、このためにはLD_LIBRARY_PATH環境変数に、PGIのライブラリパスを設定する必要があります。具体的には、64ビット環境では、$PGI/linux86-64/2013/libをセット、32ビット環境では、$PGI/linux86/2013/libをセットして、当該プログラムを実行します。
  • CUDA Fortranにおける texture 属性の使用
    本リリースでサポートとした texture 属性を使用するためには、次のことを行う必要があります。
  1. ホストコードならびにデバイスコードの両方で使用されるモジュール宣言セクションへ次のような形式で宣言文を追加します。
     real, texture, pointer :: t(:)
  2. ホストコード内に、texture memory に置きたいデバイスデータに対する target 属性を加えます。target 属性は、F90/F2003 標準構文の一つであり、配列もしくは他のデータ構造は、別の実在要素(entity)によって"pointed to"される可能性があることを指示するものです。
      Change:
       real, device :: a(n)
      To:
       real, target, device :: a(n)
  3. ホストプログラムとデバイスサブルーチンの両方において、(use 文によるモジュール・データの結合を行う方法で)グローバルなtexture宣言に対して、実際のデバイス配列にタイアップします。これを行うには、F90ポインタ割り付けオペレータを使います。例えば、次のような単純な演算オペレーションは、配下にある全てのCUDA texture operationsを実施します。
      t => a

    tを宣言しているモジュール内に含んでいる CUDA Fortran デバイスコードや tを宣言しているモジュールを use している場合は、他の宣言文なしで t にアクセスできます。例えば、次の例は、t へのアクセスは、a を targeting しており、このデータは texure cache を通して行われます。
      ! Vector add, s through device memory, t is through texture memory
      i = threadIdx%x + (blockIdx%x-1)*blockDim%x
      s(i) = s(i) + t(i)

■ その他

  • PGI 13.1 は、ACMLライブラリ 5.3.0 (64bit Linux and Windows) をバンドルしています。なお、32bit システムに対しては、従来通り ACML 4.4.0 をバンドルしています。
  • PGI 13.1 C++コンパイラのフロントエンドは、EDG version 4.5 を採用しました。この更新により、いくつかの C++11 言語機能を利用できるようになりました。これを使用するにはコンパイル、リンク時に --c++11 オプションを付加します。
  • -Mstack_arrays コンパイルオプションを追加しました。これは、自動配列(Automatic Array)をスタック上に配置するように指示するためのものです。デフォルトは、-Mnostack_arrays で、従来通りヒープ上に配置されます。一般に自動配列とは、サブルーチン内の配列のサイズが引数(仮引数)で渡されて定義される配列です。
  • -Mfprelaxed オプションに、新しいサブオプションが追加されました。-Mfprelaxed=intrinsic が追加され、緩い精度の内部組み込み関数の使用を行うように指示します。
  • -tpに新しいターゲットプロセッサ引数が追加されました。-piledriver は、AMD Piledriver プロセッサベースのコード生成を行う。-piledriver-32 は、Piledriverプロセッサベース 32bitコード生成を行う。piledriver-64は、Piledriverプロセッサベース 64bitコード生成を行う。
  • -Oオプションの最適化レベルの変更
    最適化レベルを指定する-O、-O1、-O2、-O3、-O4の内容が変更されました。これは、PGI 13.1から適用されています。以下にその概要を記します。下線部分が従来のものとの変更点です。
  • -O0は、レベル0であり、最適化を行わない。個々の言語文に対して基本ブロックが生成される。
  • -O1は、レベル1であり、局所最適化を行う。基本ブロックのスケジューリングが行われる。またレジスタ割り当て最適化も実施される。
  • -Oは、レベルが指定されない場合、以下のレベル2グローバル最適化を行う。これには、従来のスカラ最適化、導入変数の削除や問題のないループの移動等の最適化を含む。ただし、SIMDベクトル化は行わない。
  • -O2は、レベル2であり、グローバル最適化を行う。このレベルは、全てのレベル1局所最適化、上記-Oオプションで説明したレベル2グローバル最適化が実施される。これに加え、SIMDコード生成やキャッシュ整列、部分的な冗長性排除等の高度な最適化も実施する。(従来の-fastsse機能を加えた意味合いとなる)
  • -O3は、レベル3であり、アグレッシブなグローバル最適化を行います。全てのレベル 1, 2 の最適化だけでなく、効果のあるなしに関わらず、スカラの置き換え、より積極的な最適化を行います。
  • -O4 レベル4であり、全てのレベル 1, 2, 3 の最適化だけでなく、浮動小数点演算式の中で不変変数に対する巻上げ最適化を行う。

PGI 2013 Features and Performance (予定を含む)

■ PGI Compilers Language Support

  • Linux 版において、新しい GNU 互換 C++ コンパイラをリリースしました。新しいコマンド名は、pgc++ です。これは、PGIの全ての先進最適化技術を取り込んだ GNU 互換 C++ コンパイラです。これは、GNU C++(g++) のシステムライブラリを直接リンクする形態となります。このコンパイラの詳細は、「The New PGC++ Compiler for Linux 」をご覧ください。従来からの PGI C++ (pgcpp or pgCC) ANSI C++ コンパイラも使用できます。
  • PGI 2013 のリリース中において、 PGI C++ 並びに GNU 互換 C++ コンパイラは、CUDA-x86, OpenACC をサポートします。
  • PGI C++ 並びに GNU 互換 C++ コンパイラ(pgcpp と pgc++) コンパイラのフロントエンドに新しい EDG 4.5を搭載しました。これにより、多くの C++11 言語機能をサポートします。
  • 新しい Fortran 2003 機能として、パラメタライズ派生型、無指定型パラメタ、無指定型文字長さ仕様を含みます。
  • Windows 版の PGI Workstation ならびに PGI Visual Fortran パッケージに、MS-MPI ライブラリがバンドルされました。インストール時に選択した上で、システムに実装可能となりました。

■ マルチコア x64 最適化、ベンチマーク性能

  • マルチコア x64 性能として、最新の AVX 機構を有するインテル並びに AMD プロセッサを利用して行った新しい SPEC のバージョン OMP2012 benchmarks において、業界トップクラスの OpenMP 性能を記録しました。
  • x64 上の浮動小数点性能が PGI 2012の初期リビジョンに比較して 10% 以上向上しました。

■ GPU Computing

  • OpenACC 1.0 仕様並びに PGI 拡張として multiple devices をサポートする機能を含め、OpenACC の拡張を行いました。この詳細については、PGI 2013リリースノート(PDF)11ページをご覧ください
  • CUDA Fortranにおいて、テクスチャをサポートすると共に、CUDA 5.0 の機能であるダイナミック並列と分割コンパイルをサポートしました。
  • 全ての PGI Accelerator™ x64+accelerators コンパイラは、最新の NVIDIA Tesla K20 と K20X GPUs、CUDA 5.0 をサポートしました。
  • 2013 年後半のリリースにおいて、Intel Xeon Phi coprocessors と AMD APUs、さらに個別の GPUs を「ターゲット」デバイスとする OpenACC 2.0 機能を提供する予定です。この機能の中には、ネスト並列、手続き呼び出し(call)やその他の追加機能を含む予定です。

(ニュース・トピックス)

■ PGI Tools

  • PGDBG parallel MPI/OpenMP グラフィカル・デバッグ・ツールは、新しくユーザが構成可能なディスアセンブリ表示を含むソースコードの表示インタフェースの向上が図られます。
  • PGI Visual Fortran は、Visual Studio 2012 並びに Visual Studio 2012 shell への統合開発環境上で利用可能です。

■ 検証済み使用可能プラットフォームの追加

Red Hat Enterprise Linux 6.3、Fedora 17、Ubuntu 12.10、SLES 11 SP2、OpenSuSE 12.2、Windows 8 Windows Server 2012、MacOS Mountain Lion 等
PGI 2013サポート OS の詳細へ

■ PGI 2013 より提供した C++11機能

PGI 13.1以降、PGIのC++コンパイラのフロントエンドとして、EDG バージョン 4.5 を採用しました。この更新により、C++11言語機能の一部が使用できるようになりました。この機能を使用するには、コンパイルオプションに –-c++11を付加しなければなりません。

  • "right shift token" (>>)が、エラーにはならず二つのアングルブラケットとして扱われます。
    template struct S {};
    S<S<int>> s; // Okay.
    // No whitespace needed between closing angle brackets.
  • 静的アサーションをサポートします。
    template struct S {
    static_assert(sizeof(T) > 1, "Type T too small");
    };
    S s1; // Okay.
    S s2; // Instantiation error due to failing static_assert
  • friend class 構文が拡張されました。これは、typedefを通して定義されるクラス型あるいはelaborated型名がない場合やクラスがない型のようなものに対応するためです。
    typedef struct S ST;
    class C {
    friend S; // Okay (requires S to be in scope).
    friend ST; // Okay (same as "friend S;").
    friend int; // Okay (no effect).
    friend S const; // Error: cv-qualifiers cannot appear directly.
    };
  • ローカルや名前のない型はテンプレート引数用に使用できます。
  • 混在文字列のリテラル結合が許されました。
    wchar_t *str = "a" L"b"; // Okay, same as L"ab"
  • C11プリプロセッサ拡張が実行されます。
  • C11タイプのプラグマ(_Pragma)が認識されます。
  • 関数の本体において、予約識別子__func__は、関数名を表す文字列を含む、定義済み配列を参照します。
  • Enumeration型の定義において、語末のコンマ(,)が暗黙に許されました。
    enum E { e, };
  • LONG_LONG_ALLOWED がTRUEとしている場合、Long long型が許されました。
  • 明示的なインスタンス化ディレクティブは、特定の要素のインスタンス生成を抑止するために外部キーワードを有した形で前に置くことができます。
  • Exportテンプレートが抑止されます。
  • Quarified-IDの後に記されるキーワードtypenameは、テンプレート宣言の外部で表すことが出来ます。
    struct S { struct N {}; };
    typename S::N *p;  // Silently accepted in C++11 mode.
  • キーワードautoは、変数の宣言あるいは参照への型指定として使用できます。
    auto x = 3.0; // Same as "double x = 3.0;"
    auto p = new auto(x);  // Same as "double *p = new double(x);"
    struct S {
    static auto const m = 3;  // Same as "static int const m = 3;"
    };
  • Trailing return typesは、最上位の関数宣言で許されます。
  • キーワードdecltypeがサポートされました。型を演算項に記述することができます。
    template struct S {
    decltype(f(T())) *p;   // A pointer to the return type of f.
    };
  • Changes in the constraints on the code points implied by universal character names (UCNs)
  • キーワードシーケンスenumクラスを持つ定義されたスコープenumeration型と整数型を有する明示的なenumeration型がサポートされました。
    enum class Primary { red, green, blue };
    enum class Danger { green, yellow, red }; // No conflict on "red".
    enum Code: unsigned char { yes, no, maybe };
    void f() {
    Primary p = Primary::red; // Enum-qualifier is required to access
    // scoped enumerator constants.
    Code c = Code::maybe; // Enum qualifier is allowed (but not required)<
    } // for unscoped enumeration types.
  • ラムダ式がサポートされました。ラムダ式を使用すると、インライン無名メソッドを簡単に定義できます。
    template int z(F f) { return f(0); }
    int g() {
    int v = 7;
    return z([v](int x)->int { return x+v; }); }
  • Rvalue参照がサポートされました。
    int f(int);
    int &&rr = f(3);
  • 削除済み関数(プロトタイプに =delete; が含まれている関数です)が導入されました。
    int f(int) = delete;
    short f(short);
    int x = f(3); // Error: selected function is deleted.
    int y = f((short)3); // Okay.
  • 特殊メンバ関数が明示的にデフォルト化することができます。
    struct S { S(S const&) = default; };
    struct T { T(T const&); };
    T::T(T const&) = default;
  • 移動コンストラクタと移動割り当てオペレータは、C++11標準で指定された方法で生成されます。
  • 従来の関数は、これらの関数が明示的に「従来型」として考慮されるべきものとしてマーキングすることが出来ます。If文の制御に使用されるようなブーリアン値を必要とするあるコンテキストにおいては有効です。
  • sizeof, typeid, あるいはdecltypeのオペランドは直接、メンバーアクセス式を使っていないクラスの非静的データメンバ参照出来ます。
  • キーワードnullptrはナルポインター定数やナルポインター・メンバ・コンストラクト定数として使用できます。
  • ダブルスクェアー括弧([[ ... ]])は、宣言文内で使用可能です。標準属性noreturn とcarries_dependencyがサポートされました。
  • コンテキスト・センシティブ・キーワードfinalは、クラス型上、あるいは仮想メンバ関数上で使用できます。
  • コンテキスト・センシティブ・キーワードoverride は、仮想メンバ関数上で、それらが、対応するベースクラス・メンバを重複しないものとして指定するために使用します。
  • エイリアス・テンプレート宣言がサポートされました。
  • 可変個引数テンプレート(Variadic:取り得るパラメータの個数が可変のクラス テンプレートまたは関数テンプレート)がサポートされました。
  • char16_t and char32_tとUリテラルキーワードがサポートされました。
  • 関数テンプレートにおいてテンプレート化パラメータの代入(置き換え)時に生じる演算式上の多くのエラーが、指定されたエラーという扱いではなく、演繹(deductions)の失敗として扱われます。
  • ベースクラスとして使われている名前のチェックは、そのクラスが定義される時点においてなされます。
  • インライン・ネームスペースがサポートされました。
  • 初期化リストがサポートされました。
  • Noexcept指定子とそのオペレータがサポートされました。
  • Forループに範囲ベースが導入されました。開始位置と終了位置を計算せずに、リストや配列の要素を順に処理する for ループを作成できます。

▶ 過去のバージョンのリリースノート