現代のCPUにはパフォーマンスカウンタがかなりあります - http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html読み方は? 私はキャッシュミスとブランチ誤予測に興味があります。i5、i7 CPUでパフォーマンスカウンターを読み取る方法
答えて
PAPIのように見えますが、非常にクリーンなAPIがあり、Ubuntu 11.04でもうまく動作します。 それがインストールされています後は、以下のアプリは、私が何を望むかを行います:インテルQ6600上でこれをテストし
は#include <stdio.h>
#include <stdlib.h>
#include <papi.h>
#define NUM_EVENTS 4
void matmul(const double *A, const double *B,
double *C, int m, int n, int p)
{
int i, j, k;
for (i = 0; i < m; ++i)
for (j = 0; j < p; ++j) {
double sum = 0;
for (k = 0; k < n; ++k)
sum += A[i*n + k] * B[k*p + j];
C[i*p + j] = sum;
}
}
int main(int /* argc */, char ** /* argv[] */)
{
const int size = 300;
double a[size][size];
double b[size][size];
double c[size][size];
int event[NUM_EVENTS] = {PAPI_TOT_INS, PAPI_TOT_CYC, PAPI_BR_MSP, PAPI_L1_DCM };
long long values[NUM_EVENTS];
/* Start counting events */
if (PAPI_start_counters(event, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_start_counters - FAILED\n");
exit(1);
}
matmul((double *)a, (double *)b, (double *)c, size, size, size);
/* Read the counters */
if (PAPI_read_counters(values, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_read_counters - FAILED\n");
exit(1);
}
printf("Total instructions: %lld\n", values[0]);
printf("Total cycles: %lld\n", values[1]);
printf("Instr per cycle: %2.3f\n", (double)values[0]/(double) values[1]);
printf("Branches mispredicted: %lld\n", values[2]);
printf("L1 Cache misses: %lld\n", values[3]);
/* Stop counting events */
if (PAPI_stop_counters(values, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_stoped_counters - FAILED\n");
exit(1);
}
return 0;
}
、それは4つのパフォーマンスイベントをサポートします。あなたのプロセッサは多かれ少なかれサポートしています。
パフォーマンスカウンターは、RDPMC
insnで読み取られます。
EDIT:少しより多くの情報を追加するには、パフォーマンスカウンタを読み込むことは非常に簡単ではありません、我々はここでそれを説明するのであれば、それは特権命令を必要とする特定のレジスタをモデル化するために書き込みを必要とする以外にも、それは、ページ上にページを取ります。代わりに、パフォーマンス・カウンター上に構築された、準備済みのプロファイラー(oprofileまたはIntel VTune)を使用するようにアドバイスします。
RDPMCについて言及しても、それほど難しくはありません。 RDPMCの特権モードが無効にされると、そのコードはわずか15行に制限され、Linux 2.6.32ではデフォルトで無効になります。また、かなりいいライブラリがあります - http://icl.cs.utk.edu/papi/software/index.html –
約perf? perf list hw cache
には33の異なるイベントが表示され、マニュアルページには生のパフォーマンスカウンタディスクリプタの使用方法が示されています。
私はhttp://perfmon2.sourceforge.net/、perfmon2呼ばれ、使用できる利用可能なライブラリがあると思うし、ドキュメンテーションはhttp://www.hpl.hp.com/research/linux/perfmon/perfmon.php4とhttp://www.hpl.hp.com/techreports/2004/HPL-2004-200R1.htmlで入手できます、私は最近、私はできるだけ早く私はそれを把握するようサンプルコードをポストだろう、このLIBを掘り起こすています〜
- 1. i3/i5/i7 CPUを過小評価するためのドライバをプログラミングする
- 2. 実行時にi3/i5/i7 Intel Coreファミリを検出する
- 3. OpenGLでglGetTexImageでキューブマップからCPUにデータを読み取る方法は?
- 4. ユーザー空間のIntel Xeonのパフォーマンスカウンターの読み取り
- 5. C#特定のプロセス(パフォーマンスカウンター)からCPUとRAMを取得
- 6. Cでバイトを読み取る方法#
- 7. ビデオファイルをグレースケールで読み取る方法
- 8. XmlReaderでjsonを読み取る方法
- 9. asm命令を使用してMIPS CPUレジスタを読み取る
- 10. MultiFrame DICOMイメージを読み取る方法
- 11. カスタムフィールド値を読み取る方法
- 12. i7プロセッサコード解体のgdbでメモリアドレスを読み取るにはどうすればいいですか?
- 13. 埋め込みリソースをUWPで読み取る方法は?
- 14. x64 CPUでのアトミック16バイトの読み取り
- 15. バーコードから読み取る方法は?
- 16. を別の方法である方法から値を読み取る方法
- 17. Intel i7プロセッサのCPUID
- 18. OS Xマウンテンライオンでパフォーマンスカウンターを読み込むことはできますか?
- 19. コアi5とwcfの問題
- 20. MacOSX(Macbook Pros)のCPU温度(+その他のセンサーデータ)をプログラムで読み取る
- 21. CPUは厳しいですか? PHPバイトがブラウザにgzipファイルを読み取る
- 22. LispでEOFまでの入力を読み取る方法
- 23. Visual C++でファイルを非同期で読み取る方法は?
- 24. pythonでLinux上で正常に行を読み取る方法
- 25. データベースから動的プロパティを読み取る方法
- 26. GPUはCPUまたはCPUからGPUへの書き込みを読み取りますか?
- 27. フォーマット済みのデータをファイルから読み取る方法は?
- 28. アンドロイドのsdcardからテキストファイルのみを読み取る方法は?
- 29. mfcでクラスオブジェクトフォームファイル(CFileを使用)を読み取る方法は?
- 30. PHPでURLを介してデータを読み取る方法
PAPIは良いものです。クロスプラットフォームなので、x86-WindowsからIBM BlueGenesまで、ほとんどのプラットフォームで動作します。 –