3

プログラムの CPE を決定するにはどうすればよいですか? たとえば、ループ用の次のアセンブリ コードがあります。

# inner4: data_t = float
# udata in %rbx, vdata in %rax, limit in %rcx,
# i in %rdx, sum in %xmm1
1 .L87:                                   # loop:
2   movss  (%rbx,%rdx,4), %xmm0           #  Get udata[i]
3   mulss  (%rax,%rdx,4), %xmm0           #  Multiply by vdata[i]
4   addss  %xmm0, %xmm1                   #  Add to sum
5   addq  $1, %rdx                        #  Increment i
6   cmpq  %rcx, %rdx                      #  Compare i:limit
7   jl .L87                               #  If <, goto loop

float データ型を使用して、クリティカル パスによって決定される CPE の下限を見つける必要があります。クリティカル パスは可能な限り遅いパスを参照するため、プログラムが mulss 命令を実行する必要があるパスになると思います。これは、最も長い数のクロック サイクルを使用するためです。

ただし、CPE を決定する明確な方法はないようです。ある命令が 2 クロック サイクルかかり、別の命令が 1 クロック サイクルかかる場合、後者は前者の最初のクロック サイクルの後に開始できますか? どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

4

必要な時間を知りたい場合は、測定する必要があります。ループを約 10^10 回実行し、必要な時間を取り、クロック周波数を掛けます。サイクルの合計数を取得し、10^10 で除算して、ループ反復ごとのクロック サイクル数を取得します。

実行時間の理論的予測は、速度を決定する多数の影響があるため、ほとんど正確ではありません (そして、ほとんどの時間は低くなります)。

  • パイプライン処理 (パイプラインには簡単に約 20 ステージがあります)
  • スーパースカラー実行 (並列で最大 5 つの命令、cmp融合jl可能)
  • µOps へのデコードと並べ替え
  • キャッシュまたはメモリのレイテンシ
  • 命令のスループット (実行ポートに十分な空きがあるか)
  • 命令のレイテンシ
  • 銀行の競合、エイリアシングの問題、およびより難解なもの

CPU にもよりますが、メモリ アクセスがすべて L1 キャッシュにヒットする場合、最長の依存関係チェーンは 3 要素の長さであるため、ループには反復ごとに少なくとも 3 クロック サイクルが必要であると考えられます。mulss低速またはaddss命令を使用する古い CPU では、必要な時間が長くなります。

理論的な観察だけでなく、実際にコードの高速化に関心がある場合は、ベクトル化する必要があります。次のようなものを使用して、パフォーマンスを4〜8倍向上させることができます

.L87:                               # loop:
vmovdqa (%rbx,%rdx,4), %ymm0        #  Get udata[i]..udata[i+7]
vmulps  (%rax,%rdx,4), %ymm0, %ymm0 #  Multiply by vdata[i]..vdata[i+7]
vaddps  %ymm0, %ymm1, %ymm1         #  Add to sum
addq    $8, %rdx                    #  Increment i
cmpq    %rcx, %rdx                  #  Compare i:limit
jl .L87                             #  If <, goto loop

その後、8 つの要素すべてを水平方向に追加する必要があります。もちろん、アライメントが 32 で、ループ カウンターが 8 で割り切れることを確認してください。

于 2012-05-02T23:36:29.437 に答える
0

Intel CPU を実行している場合は、さまざまな CPU の命令レイテンシとスループットに関する優れたドキュメントを見つけることができます。リンクは次のとおりです。

インテル® 64 および IA-32 アーキテクチャー最適化リファレンス・マニュアル

于 2012-05-02T22:44:28.387 に答える