問題タブ [cpu-cycles]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - CPU サイクル数 c++
重複の可能性:
RDTSC を使用して CPU サイクルを取得する - RDTSC の値が常に増加するのはなぜですか?
CPU サイクル数を取得しますか?
並べ替えアルゴリズムを分析する C++ コードを書きたいのですが、配列を並べ替えるのに必要なプロセッサ サイクル数を知る必要があります。
それを行う方法に関する提案はありますか?
私はこのコードを見つけました:
私はそれがインラインアセンブリであることを理解しています.誰かがそれがどのように機能し、どのように使用するかを説明できますか?
Linux を実行しています。私のコンピューターはデュアルコアですが、違いはありますか?
cpu - データ フローのクリティカル パスを決定する
本Computer Systems: A Programmer's Perspectiveの演習 5.5 は、多項式の値を計算するためのコードを示しています。
この演習では、倍精度浮動小数点の加算と乗算に必要なクロック サイクルがそれぞれ 3 と 5 であると想定しています。読者は、測定された CPE (Cycles Per Element) 値が 5 である理由を説明するよう求められます。
演習の答えによると、反復ごとに変数xpwr
とを更新するresult
必要があり、必要な操作は浮動小数点加算 ( の場合result
) と浮動小数点乗算 ( の場合xpwr
) であるため、後者がレイテンシを支配し、最終的な CPE は 5 です。
しかし、データフローは次のようにする必要があると思います。
したがって、最長パスは の前の値xpwr
から の新しい値までであり、実行ユニットおよびresult
を通過します。したがって、最長時間は 8 サイクルです。[mul]
[add]
聞きたい
- クリティカル パスの正確な意味は何ですか? そして、それをどのように決定するのですか?
- どちらの答え(私のものと本)がより合理的ですか?
CPU、アーキテクチャ、実行ユニット、パイプライン、浮動小数点ユニットに関する説明をいただければ幸いです。
assembly - ISA分解の読み方は?また、GPUパイプラインと待機状態
OpenCLコンパイラが最適化するために生成するマシンコードを理解しようとしています。したがって、ツールm2s-opencl-kc(multi2simから)を使用して* .clファイルをオフラインコンパイルし、中間ファイル(スイッチ:-a)を*.isaファイルとして保持しました。この*.isaには、私が探しているもののように見える「分解」セクションが含まれています...
注:私のアセンブリの知識は少し「古い」ものです。Pentium386/486CPUなどの古いCPU用のアセンブリを作成しました。ですから、私は実際にベクトル命令を読むのに問題がありますが、それらについての理論的な知識はあります。
私が疑問に思っているのは、コマンドの前にある数字と文字の意味です。私が理解したように、コンパイラはいくつかの「複雑な」命令を次のように生成しました。
(質問:それはいわゆる「VeryLong InstructionWord」ですか?)
そして、この「複雑な」命令は、次のような複数の「単純な」命令で構成されています。
これらの「単純な」命令は、各ベクトル単位の命令のようです。4つのベクトル単位は、x、y、z、およびwによって参照されます。しかし、「t」とは何ですか?それは別のベクトル単位ですか?「サイプレス」GPU用にコンパイルしました...
さて、数字について...これらは「行番号」のようなものですか?先行ゼロ:複素数命令のシリアル番号...?先行ゼロなし:単純命令のシリアル番号...?
メモリアクセスの待機状態がないと仮定すると、同じシリアルを持つすべての「単純な」命令を1サイクルで「論理的に」実行できると思います。たとえば、(上記の複雑な命令の)次の命令はサイクル0で「実行」されます。
「実行された」とは、ある種の(たとえば4サイクルの)パイプライン処理があることを意味します。これは、上記の命令がサイクル0で実行を開始し、サイクル3の後に終了する必要があることを意味します。
パイプラインに関する質問
次の命令(「1」など)がレジスタR2.xを読み取るとどうなりますか?それはR2.xの古い値(命令「0」の前)を読み取るのでしょうか、それとも命令「0」が終了するまで命令「1」を遅らせるのでしょうか?それとも、これは「気にしない」状況(未定義の結果を生成する)であり、コンパイラーがこれが決して起こらないように注意しなければならない状況ですか?
メモリアクセスに関する質問
レジスタへのアクセスは、データフェッチサイクル中に待たずに実行できると思います。メモリアクセスには、アクセスするメモリの種類に応じて、追加のサイクルが必要になります。
- 「__private」メモリは、ほとんどがレジスタにマップされている必要があります。
- __ローカルメモリ(同じグループの作業項目間で最大64KBを共有):現在のGPUで何サイクル余分に期待する必要がありますか?
- __グローバルメモリ:これは、たとえば256MBからxGBの外部DRAMである必要があります。ここで何サイクル余分に期待する必要がありますか?私の知る限り、このメモリはGPUデバイス用にキャッシュされていません。
- __定数メモリは__グローバルメモリのようにする必要がありますが、__ローカルメモリを使用してキャッシュされます
「ISA」の良いチュートリアルはありますか?
よろしく、ステファン
c++ - 取得するたびに異なるほど正確なタイムスタンプを取得するにはどうすればよいですか?
グローバルな一意の ID を生成するには、作成時のタイムスタンプのようなものが必要です。ただし、これらの ID は、ソース コード内で連続して生成できます。そのため、ミリ秒単位の時間は十分に正確ではなく、意図せずに同じ ID を生成する可能性があります。
したがって、フェッチされるたびに異なるように正確なタイムスタンプが必要です。CPUサイクルについて考えましたが、この情報を取得する方法があるかどうかはわかりません。
これはリアルタイム ゲーム用であるため、タイムスタンプのフェッチはパフォーマンスに関連しています。さらに、Linux、Windows、Mac とのクロスプラットフォーム互換性があるため、もちろんタイムスタンプもそうあるべきです。標準的な方法がなければ、システムの 3 つの特徴的なソリューションで生活できます。
caching - CPI とキャッシュ アクセスについて
これらは以前の宿題の問題ですが、試験の復習として使用しています。実際に問題になっているものから数値を変更しています。概念を確実に把握したいだけです。私はすでに答えを持っています。私がそれらを理解していることを明確にする必要があります。これは宿題ではなく復習です。
とにかく、これはCPIの側面に焦点を当てています
最初の問題:
1 GHz プロセッサで実行されるアプリケーションには、30% のロード/ストア命令、30% の算術演算、および 40% の分岐命令があります。個々の CPI は、ロード/ストアの場合は 3、算術演算の場合は 4、分岐命令の場合は 5 です。指定されたプロセッサでのこのプログラムの全体的な CPI を決定します。
私の答え: 全体の CPI は、サブ CPI の合計に、サブ CPI が発生するパーセンテージを掛けたものです。つまり、3*0.3 + 4*0.3 + 5*0.4 = 0.9 + 1.2 + 2 = 4.1 です。
現在、プロセッサは 1.6GHz で動作するように強化されています。分岐命令の CPI は同じままですが、ロード/ストアおよび算術命令の CPI は両方とも 6 サイクルに増加します。分岐命令の 30% とロードストアの 10% を排除する新しいコンパイラが使用されています。新しい全体的な CPI と、アプリケーションが高速または低速になる係数を決定します。
私の答え: 繰り返しになりますが、新しい CPI はその部分の合計にすぎません。ただし、パーツが変更されているため、これを考慮する必要があります。分岐命令は 30% (0.4*0.7=0.28) 減少し、ロードストアは 10% (0.3*0.9=0.27) 減少します。算術命令が残りの命令 (1-0.28-0.27=0.45)、つまり 45% を占めるようになります。これらに新しいサブ CPI を掛けて、6*0.45+6*0.27+5*0.28=5.72 を取得します。
現在、プロセッサの機能強化は 60% 速く、CPI は (5.72-4.1)/4.1 = 39.5% 大きくなっています。したがって、アプリケーションは約 0.6*0.395 = 23.7% 速く実行されます。
さて、2番目の問題:
ロード/ストア アーキテクチャを備えた新しいプロセッサの理想的な CPI は 1.25 です。このプロセッサの典型的なアプリケーションは、50% が算術演算とロジック、25% が条件付き分岐、25% がロード/ストアです。メモリは、個別のデータ キャッシュと命令キャッシュを介してアクセスされ、命令キャッシュ ミス率は 5%、データ ミス率は 10% です。キャッシュ ミスのペナルティは 100 サイクルで、ヒットしてもペナルティは発生しません。
実効CPIとは?
私の答え: 実効 CPI は、理想的な CPI に、キャッシュ アクセスによる命令ごとのストール サイクルを加えたものです。理想的な CPI は、与えられているように 1.25 です。命令ごとのストール サイクルは (0.1*100*0.25) + (0.05*100*1) = 7.5 です。0.1*100*0.25 は、データ ミス率にストール サイクル ペナルティを掛けたもので、ロード/ストアの割合 (データ アクセスが行われる場所) も掛けたものです。0.05*100*1 は命令キャッシュ ミス率です。これは、命令キャッシュ ミス率にストールしたサイクル ペナルティを掛けたものです。命令アクセスはプログラムの 100% で発生するため、これに 1 を掛けます。これに続いて、実効 CPI は次のようになります。 1.25 + 7.5 = 8.75。
一般的なアプリケーションの 1000 命令あたりのミス数と、一般的なアプリケーションの平均メモリ アクセス時間 (クロック サイクル) は?
私の答え: 1000 命令あたりのミス数は、キャッシュ アクセスによる 1 命令あたりのストール サイクル (上記のように: 7.5) に等しく、1000 で割ると 7.5/1000 = 0.0075 となります。
平均メモリ アクセス時間 (AMAT) について説明するときは、まずアクセスの総数について説明する必要があります。これは、データ アクセスの割合 (25%) に命令アクセスの割合 (100%) を加えたもの、つまり 125%=1.25 です。 . データ アクセスは .25/1.25 で、命令アクセスは 1/1.25 です。
AMAT は、データ アクセスのパーセンテージ (.25/1.25) にヒット時間 (1) とデータ ミス率の合計を掛けて、ミス ペナルティ (0.1*100) を掛けた値、または (.25/1.25)(1) と等しくなります。 +0.1*100) であり、これは、命令アクセスのパーセンテージ (1/1.25) に、ヒット時間 (1) と命令ミス率の合計にミス ペナルティ (0.05*100) を掛けた値を掛けた値、または (1 /1.25)(1+0.05*100)。まとめると、AMAT は (.25/1.25)(1+0.1*100)+(1/1.25)(1+0.05*100)=7 です。
繰り返しますが、テキストの壁で申し訳ありません。私が間違っている場合は、私がどのように間違っているかを理解できるようにしてください. できるだけ簡単に理解できるように、すべての作品を表示しようとしました。前もって感謝します。