0から7の範囲でパラメータを増やして関数のパラメータのオーバーヘッドを計算したいとします。ハードウェアオーバーヘッドとソフトウェアオーバーヘッドを見積もる方法。cプログラミングでrdtscを使ってforループのオーバーヘッドを見積もる方法
答えて
最初に行うことはdisassembly
です.Linuxではobjdump
からお手伝いできます。 objdump
は、コードの生成方法を確認するのに役立ちます。あなたが渡されたパラメータで何もしていないならば、それはスタックからのパラメータを取ってそれらをレジスタ上に保つことの違いにすぎません。これらのmov
の操作にはCPUのサイクル数がほとんどかからないため、タイミング情報を得るのは困難ですが、CPUサイクルは簡単です。
あなたの質問は本当によくポーズされていません。しかし、rdtsc
命令を実行する最も信頼性の高い方法は、すべてのCコンパイラによって完全にサポートされているインラインアセンブリで呼び出すことです。 C標準で規定されているタイミング関数は実装によって異なります。インテルは、rdtsc
のものhereを実装する最良の方法について、本当に良い白書を持っています。主な関心事は、あなたの質問の範囲外である可能性のある順序外の実行です。
私が見つけた最良の実装はthis repoで、これは私が自分で使用するために調整したものです。
#include <cpuid.h>
#include <stdint.h>
/*** Low level interface ***/
/* there may be some unnecessary clobbering here*/
#define _setClockStart(HIs,LOs) { \
asm volatile ("CPUID \n\t" \
"RDTSC \n\t" \
"mov %%edx, %0 \n\t" \
"mov %%eax, %1 \n\t": \
"=r" (HIs), "=r" (LOs):: \
"%rax", "%rbx", "%rcx", "%rdx"); \
}
#define _setClockEnd(HIe,LOe) { \
asm volatile ("RDTSCP \n\t" \
"mov %%edx, %0 \n\t" \
"mov %%eax, %1 \n \t" \
"CPUID \n \t": "=r" (HIe), "=r" (LOe):: \
"%rax", "%rbx", "%rcx", "%rdx"); \
}
#define _setClockBit(HIs,LOs,s,HIe,LOe,e) { \
s=LOs | ((uint64_t)HIs << 32); \
e=LOe | ((uint64_t)HIe << 32); \
}
/*** High level interface ***/
typedef struct {
volatile uint32_t hiStart;
volatile uint32_t loStart;
volatile uint32_t hiEnd;
volatile uint32_t loEnd;
volatile uint64_t tStart;
volatile uint64_t tEnd;
/*tend-tstart*/
uint64_t tDur;
} timer_st;
#define startTimer(ts) \
{ \
_setClockStart(ts.hiStart,ts.loStart); \
}
#define endTimer(ts) \
{ \
_setClockEnd(ts.hiEnd,ts.loEnd); \
_setClockBit(ts.hiStart,ts.loStart,ts.tStart, \
ts.hiEnd,ts.loEnd,ts.tEnd); \
ts.tDur=ts.tEnd-ts.tStart; \
}
#define lapTimer(ts) \
{ \
ts.hiStart=ts.hiEnd; \
ts.loStart=ts.loEnd; \
}
:マクロのこの基本セットは、あなたが互換性のあるプロセッサを持っていると仮定すると、あなたを与える〜32クロックは、各コール(あなたがあなた自身のプロセッサのためのテストを行う必要があります)上のオーバーヘッドのダニ
その後、私のBroadwellマイクロアーキテクチャのチップでは、この
#include <stdio.h>
#include <math.h>
#include "macros.h" /* Macros for calling rdtsc above */
#define SAMPLE_SIZE 100000
int main()
{
timer_st ts;
register double mean=0;
register double variance=0;
int i;
/* "Warmup" */
for(i=1;i<SAMPLE_SIZE;i++)
{
startTimer(ts);
endTimer(ts);
}
/* Data collection */
for(i=1;i<SAMPLE_SIZE;i++)
{
startTimer(ts);
endTimer(ts);
mean+=ts.tDur;
}
mean/=SAMPLE_SIZE;
fprintf(stdout,"SampleSize: %d\nMeanOverhead: %f\n", SAMPLE_SIZE,mean);
return 0;
}
のようなもので、それを呼び出す私はこの出力を得た
SampleSize: 100000
MeanOverhead: 28.946490
29クロックのチックのクロック解像度はかなり良いです。人々が典型的に使用するライブラリ関数(例えば、gettimeofday
)は、クロックレベルの正確さとオーバーヘッド〜200-300を持たないでしょう。
「ハードウェアオーバーヘッド」と「ソフトウェアオーバーヘッド」の違いはわかりませんが、上記の実装では、rdtsc
コールの間にタイミングや中間コードを実行する関数呼び出しはありません。だから私は、ソフトウェアのオーバーヘッドはゼロだろうと思う。
'rdtsc'は本質的にチップ固有であり、(一部の)インテルCPUに限定されています。コンパイラは一般的に 'asm'をサポートしていますが、使用される表記は異なります。C標準では必須ではありません(たとえば、asmは標準C-ISO/IEC 9899:2011のキーワードではありません)。標準的なC(またはPOSIX)のタイミング関数は、プラットフォームやCPUタイプによってより確実に利用でき、アセンブラが 'rdtsc'命令に直接アクセスするよりも遅くても、信頼性高く動作します。 –
- 1. モデルを使って見積もりをする方法R
- 2. Tkinterを使ってPythonでforループを使ってボタンを作る方法は?
- 3. 私のC++プログラムでヒープフラグメンテーションを検出して見積もる方法は?
- 4. forループを使ってggplotにレイヤーを追加する方法
- 5. Objective-C characterAtIndexを使ったNSString forループ
- 6. GAEでホスティングサービスの費用を見積もる方法は?
- 7. whileループとforループのプログラミングの問題
- 8. 他の可能性を前もって与えて確率を見積もる
- 9. Googleマップを使ってNYCの空き地を見積もる方法はありますか?
- 10. JPEGファイルサイズを見積もる
- 11. フルテキストインデックスサイズを見積もる
- 12. フレームレートを見積もる
- 13. Postgresテーブルの1列のサイズを見積もる方法は?
- 14. 検索アプリケーションの効率を見積もる方法は?
- 15. Railsアプリの開発コストを見積もる方法は?
- 16. pub.dartlang.orgパッケージの品質を見積もる方法は?
- 17. forループを使用して要素を配列にロードする方法は? C#
- 18. jqueryを使ってループする方法
- 19. バイナリクラシファイアに必要なメモリ量を見積もる方法は?
- 20. forループでスライスを使ってリストを作成する
- 21. カスタムインデックスを使用してforループをベクトル化する方法
- 22. Cプログラミングでqsortを使用してStructをソートする方法
- 23. divを作成してforループでforループを使ってdivを追加する
- 24. eclipseを使ったCプログラミング
- 25. forループを使った関数のテストスクリプト
- 26. RenderTransformを使ったコードビハインドforループのアニメーション
- 27. カスタムforループをC++で書いて
- 28. タスクの時間を見積もる
- 29. forループinループ配列を使用してインデックスを作成する方法
- 30. インデックスを使ってforループの変数を宣言する(i)
'gettimeofday'はどのPOSIXシステムでもうまく動作します。 'rdtsc'命令はx86アーキテクチャ上にのみ存在し、すべてで同じように動作しないので、回避することをお勧めします。 –
@BenVoigt 'clock_gettime'が' gettimeofday'を置き換えています。私は、いつmanページがそれが将来削除されると言いますか分からない。 – tijko
@tijko:まだ 'clock_gettime()'がない 'gettimeofday()'のプラットフォームがあります - Mac OS X(10.11.4)はそのようなものです。現時点では、 'gettimeofday()'は 'clock_gettime()'より移植性があります。 –