1

実行時間を取得するために、この式を使用しました。

Execution time = Cpu time + memory time

それから、

Execution time = (#instructions * average instruction execution time) +
                 (Misses Cache l1 * latency L2) +
                 (Misses Cache l2 * latency access memory).

この方程式をチェックするために簡単なプログラムを開発しました。次は擬似コードです。

  ini_time = get_cepu_time();
  Init_Papi_counters;

  //intesive computation code (matrix mult)

  End_Papi_counters();
  end_time = get_cepu_time();
  end_time = end_time - ini_time.

得られる値は次のとおりです。

Execution time: 194,111 sec
Cycles: 568949490685
Instructions: 676850501790
Misses L1: 30666388828
Misses L2: 1743525419

インテルのマニュアルで取得されるレイテンシーは次のとおりです。

Acces L2: 4,8 ns
Acces main memory: 110 ns

次に、方程式を適用すると、次のようになります。

Misses L1 * Latency l2 = 147 sec
Misses L2 * memory access time =   193 sec

ご覧のとおり、メモリ時間の構成要素の合計は、合計実行時間よりも長くなっています。

194 < 147 + 193 ERRORRRRR

実行時間を概算する方法を見つけるために私を助けてくれませんか。

4

1 に答える 1

1

これらの「方程式」はどのようにして思いついたのですか?これらは、最新の CPU ではほとんど完全に正しくないため、ガベージ結果が生成されます。

実行時間 = CPU時間 + メモリ時間

最新のすべての CPU は、計算の実行中にメモリにアクセスできます。したがって、これら 2 つの測定値にはかなりの重複があります。さらに、重要な環境では、ディスク アクセスまたはネットワーク アクセスでの停止、割り込みの処理など、測定可能な「実行時間」を要する他の多くのことが発生する可能性があります。

実行時間 = (#instructions * 平均命令実行時間) + (ミス キャッシュ l1 * レイテンシ L2) + (ミス キャッシュ l2 * レイテンシ アクセス メモリ)

キャッシュ ミスはさておき、最新の CPU はパイプライン化されており、スーパースカラーです。数十から数百の命令が同時に実行されておりinstructions * average execution time、状況の実際の複雑さを捉えるモデルは単純ではありません。 instructions / (average instructions retired per time unit)はより正確なモデルですが、実際のリタイア率は実行されるコードの詳細に大きく依存するため、ほとんどの用途には依然として不十分です。

Mystical がコメントで述べたように、プロセッサは複数のキャッシュ ミスを同時に処理できるため、単純に線形モデルで説明することもできません。最も単純な設計を除いて、最新の CPU は非常に複雑であり、この形式のモデルで正確に説明することはできません。正確なパフォーマンス データを取得する唯一の方法は、問題のパーツで実際に計算を実行するか、実行の各段階に関連するすべての依存関係とリソースを実際にモデル化するサイクル精度のシミュレーターを使用することです (最近の CPU はほとんどありません)。そのようなシミュレーターは、正しく実行するのが非常に複雑であるため、すぐに利用できます)。

于 2013-02-11T00:52:15.570 に答える