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

PGI compiler TIPS
AMD64 と EM64T の内部最適化は異なる?
PGI性能情報 > AMD64 vs EM64T最適化

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

互換性はあるが最適化手法が異なる、AMD64 CPU と EM64T CPU

(2005年11月19日)

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

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


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


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


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

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

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

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

   pgf95 -fastsse -Minfo -tp p7-64 xx.f (-tp オプションで インテル EM64T 用に最適化コード生成)
  • AMD64 (Opteron)上で、-tp p7-64 を付加してコンパイルすると、EM64T 用に最適化されたコードが生成されます。逆に、 Pentium(R) 4/Xeon(R) EM64T 上で、-tp k8-64 を付加してコンパイルすると AMD64 用のコードができます。

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

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

 使用 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: 1306.499 time(s): 56.72000 【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: 1223.252 time(s): 60.58000

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: 1523.220 time(s): 48.65000 【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 4500 times Gosa : 2.3161024E-06 MFLOPS: 1343.692 time(s): 55.15000

以下のリストは、各CPU用に異なる最適化を行った際のアセンブラ出力の抜粋である。この比較によって、各CPUのメモリ・アーキテクチャも含めた特性に応じて、最適化がなされていることが分かります。

      【AMD64 生成コード】                 【EM64T 生成コード】
     
# lineno: 206                                              # lineno: 206

   prefetcht0      256(%rdi,%rcx)                   |         movups  516(%rsi,%rdx), %xmm2
   prefetcht0      2180356(%rdi,%rcx)               |         movups  -524(%rsi,%rdx), %xmm3
   prefetcht0      4360456(%rdi,%rcx)               |         movups  2180100(%rdi,%rdx), %xmm4
   prefetcht0      8720656(%rdi,%rcx)               |         movups  512(%rsi,%rdx), %xmm5
   prefetcht0      764(%rsi,%rcx)                   <
   prefetcht0      -268(%rsi,%rcx)                  <
   prefetcht0      10900756(%rdi,%rcx)              <
   prefetcht0      -32772(%rsi,%rcx)                <
   movlps  516(%rsi,%rcx), %xmm2                    <
   movlps  -524(%rsi,%rcx), %xmm3                   <
   movlps  2180100(%rdi,%rcx), %xmm4                <
   movlps  512(%rsi,%rcx), %xmm5                    <
   subl    $8, %eax                                           subl    $8, %eax
   movhps  524(%rsi,%rcx), %xmm2                    |         subps   -516(%rsi,%rdx), %xmm2
   movhps  -516(%rsi,%rcx), %xmm3                   <
   movhps  2180108(%rdi,%rcx), %xmm4                <
   movhps  520(%rsi,%rcx), %xmm5                    <
   subps   -516(%rsi,%rcx), %xmm2                   <
   mulps   %xmm4, %xmm5                                       mulps   %xmm4, %xmm5
   subps   508(%rsi,%rcx), %xmm2                    |         subps   508(%rsi,%rdx), %xmm2
   movlps  4360200(%rdi,%rcx), %xmm4                |         movups  4360200(%rdi,%rdx), %xmm4
   addps   %xmm2, %xmm3                                       addps   %xmm2, %xmm3
   movhps  4360208(%rdi,%rcx), %xmm4                |         movups  (%rsi,%rdx), %xmm2
   movlps  (%rsi,%rcx), %xmm2                       |         mulps   8720400(%rdi,%rdx), %xmm3
   mulps   8720400(%rdi,%rcx), %xmm3                |         mulps   (%rdi,%rdx), %xmm2

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





<< 戻る


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

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