ソフテック・トップページへ
ホーム 製品 セキュリティ・サービス HPCサービス ダウンロード 企業情報

PGI compiler TIPS
PGI Unified BinaryTM とは
PGI TIPS情報 > AMD64/EM64T Unified Binary

 全てのコンパイル・オプション

AMD64 CPU と EM64T CPU 間の PGI Unified BinaryTM の性能

PGI Unified Binary とは、AMD64 とインテル64(EM64T) の両方のプロセッサに最適化されたコード・シーケンスを単一の実行可能ファイルにしたものです。PGI Unified Binary を利用すれば、独立系ソフトウェア・ベンダー(ISV)やカスタム・アプリケーション開発者は、Intel 社とAMD 社のいずれかの x64 プラットフォーム上で両社の最新マイクロプロセッサ・テクノロジーに対応することができます。(2006年1月11日 初稿)

インテル社のEM64T対応プロセッサは、AMD 社の AMD64 (Opteron, Turion64, Athlon64) プロセッサと、AMD64-ABI によってCPU インストラクションと言う観点では互換性がありますが、各プロセッサのマイクロ・アーキテクチャ上における違いにより、その最適化手法(特に、メモリアクセス周り)が異なり、そのCPU特性に即した最適化を行わなければ、性能が低下することがあります。PGI コンパイラは、AMD64並びにEM64Tプロセッサのそれぞれのマイクロアーキテクチャに応じた最適化が行える商用コンパイラです。商用コンパイラは、互換性だけではなくそのプロセッサに応じた性能も最適化することが必要ですが、他の多くのコンパイラは、その点を明確に謳っていません。プロセッサに応じた真の性能を享受するには、AMD64形式の実行バイナリと言うだけではなく、これが EM64T 用か、AMD64 用かを区別して使用することが必要です。しかし、これは、ISV ベンダーの開発者、それを利用するユーザにとって大きな負担となることは明らかです。この問題を解決するために、2006年1月にリリースした、PGI バージョン 6.1 より、AMD64 と EM64T 間の「Unified Bynary support」を業界で初めて実現しました。PGI Unified BinaryTM とは、どちらのプラットフォームに対しても性能ペナルティがない形で最適化を行い、「単一の実行モジュール」を生成する機能です。プログラム開発においては、プログラムの性能がどちらのプラットフォームにも透過的に維持できることで、最適化のために費やすコストが軽減されます。
ここでは、PGI 6.1 コンパイラを用いて、本質的にプロセッサ・マイクロアーキテクチャの異なる AMD64 用バイナリと EM64T バイナリの性能が異なることを実証し、どちらのプロセッサに対しても最適な性能を提供できる PGI Unified Binary の性能を示します。

PGI 6.0 以前のコンパイラでの AMD64/EM64T の性能に関する記事は、こちらへ


 ご参考 : Intel(R) デュアルPentium(R) Dプロセッサ・システムでもPGIコンパイラの高速性が実証される !!
       : AMD デュアル Athlon64 X2 プロセッサ・システムをPGI コンパイラで評価する!


PGI 6.1 のクロスコンパイル機能で検証


コンパイラの最適化は、デフォルトでは、コンパイルを行うシステムの CPU タイプに応じた最適化を行います。例えば、Opteron(AMD64) 上で、コンパイルされたモジュールは、 AMD64 CPU 用に最適化されています。このモジュールを AMD64 に互換性のあるインテル社の EM64T CPU(Pentium, Xeon) 上で実行した場合、性能に与える影響がどの程度あるかを見ることで、CPU に依存する最適化が行われているかどうかを理解できます。また、その逆のパターンも同様です。
以下に示す例は、このような場合の性能の違いと Unified Binary の性能を理解いただくためのものです。これによって、PGI コンパイラは各CPUに応じた最適化を行っていることが理解できるものと思います。まず、コンパイルの方法を以下に示します。

-tp オプションを付けないデフォルト時】 

  pgf95 -fastsse -Minfo xx.f(コンパイル時に使用する CPU がデフォルトの最適化ターゲットとなる)

【異なる CPU 用に最適化するクロスコンパイルの例】

   pgf95 -fastsse -Minfo -tp p7-64 xx.f (-tp オプションで インテル EM64T 用に最適化コード生成)

【PGI Unified Binaryモードの実行モジュールを作成する例】

   pgf95 -fastsse -Minfo -tp x64 xx.f (-tp x64 を明示的に指定する必要があります)
  • AMD64 (Opteron)上で、-tp p7-64 を付加してコンパイルすると、EM64T 用に最適化されたコードが生成されます。逆に、 Pentium(R) 4/Xeon(R) EM64T 上で、-tp k8-64 を付加してコンパイルすると AMD64 用のコードができます。
  • Unified Binary を作成するためには、「明示的に」 -tp x64 を付けてコンパイルしなければなりません。

以下の二つのマシン上で、マシンと異なる CPU タイプの実行モジュールを作成し、その実行時間を比較してみます。ここで、使用したプログラム題材は、メモリ帯域をフルに必要とする「姫野ベンチマーク」を使用して、その性能がどの程度異なるかを検証します。

 AMD64 マシン: Athlon64x2 (2.2GHz) + 低速 PC3200メモリ
◆EM64T マシン: Pentium D  (2.8GHz)  +  高速 DDR2-667(PC2-5300) メモリ

 PGI 6.1 を使用
 使用 OS は、共に SUSE10.0 (kernel 2.6.13)

AMD64 マシン上で検証する

  AMD64 マシン上で、それとは異なる EM64T 最適化コードを実行するとその性能は、多少劣化することが分かります。

AMD64専用コードを生成し、実行 】

amd64 $ pgf95 -fastsse -O3 -Mprefetch=distance:8,nta -Minfo himenoBMTxp_s.f
amd64 $ ./a.out
  mimax=          129  mjmax=           65  mkmax=           65
  imax=          128  jmax=           64  kmax=           64
Loop executed for 4500 times Gosa : 2.3161024E-06 MFLOPS: 1318.823 time(s): 56.19000 【 EM64T専用コードを生成、実行 】 amd64 $ pgf95 -fastsse -O3 -Mprefetch=distance:8,nta -Minfo -tp p7-64 himenoBMTxp_s.f amd64 $ ./a.out mimax= 129 mjmax= 65 mkmax= 65 imax= 128 jmax= 64 kmax= 64 Loop executed for 4500 times Gosa : 2.3161024E-06 MFLOPS: 1256.863 time(s): 58.96000

  PGI Unified Binary コードは、上記の AMD64 専用コードとほぼ同じ性能を提供する

Unified Binaryコードを生成、実行 】

amd64 $ pgf95 -fastsse -O3 -Mprefetch=distance:8,nta -Minfo -tp x64 himenoBMTxp_s.f
amd64 $ ./a.out
  mimax=          129  mjmax=           65  mkmax=           65
  imax=          128  jmax=           64  kmax=           64
  Loop executed for          3600  times
  Gosa :   8.8548159E-06
  MFLOPS:    1325.368       time(s):    44.73000

EM64T マシン上で検証する

  EM64T マシン上で、それとは異なる AMD64 最適化コードを実行するとその性能は、劣化することが分かります。

EM64T専用コードを生成、実行 】

em64t $ pgf95 -fastsse -O3 -Mprefetch=distance:8,nta -Minfo himenoBMTxp_s.f
em64t $ ./a.out
  mimax=          129  mjmax=           65  mkmax=           65
  imax=          128  jmax=           64  kmax=           64
Loop executed for 4500 times Gosa : 2.3161024E-06 MFLOPS: 1562.730 time(s): 47.42000 【 AMD64専用コードを生成、実行 】 em64t $ pgf95 -fastsse -O3 -Mprefetch=distance:8,nta -Minfo -tp k8-64 himenoBMTxp_s.f em64t $ ./a.out mimax= 129 mjmax= 65 mkmax= 65 imax= 128 jmax= 64 kmax= 64 Loop executed for 6000 times Gosa : 2.4838511E-07 MFLOPS: 1359.095 time(s): 72.70000

  PGI Unified Binary コードは、上記の EM64T 専用コードとほぼ同じ性能を提供する

Unified Binaryコードを生成、実行 】

amd64 $ pgf95 -fastsse -O3 -Mprefetch=distance:8,nta -Minfo -tp x64 himenoBMTxp_s.f
amd64 $ ./a.out
  mimax=          129  mjmax=           65  mkmax=           65
  imax=          128  jmax=           64  kmax=           64
  Loop executed for          4500  times
  Gosa :   2.3161024E-06
  MFLOPS:    1578.373       time(s):    46.95000

PGI コンパイラは、AMD64/EM64Tのプロセッサ特性に応じた最適化だけでなく、AMD 社の NUMA アーキテクチャにも「最適化」する機能を有し、インテル社の従来の UMA アーキテクチャにも最適化可能なコンパイラです。 関連リンク





<< 戻る


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

サイトマップ お問合せ
Copyright 2006 SofTek Systems Inc. All Rights Reserved.