5

Linuxカーネルモジュールによって、Linuxカーネル内のコードにかかる時間を非常に高い精度で測定しようとしています。

この目的のために、以下に示すように、コードで使用されるクロックティックの数を示すrdtscl()を試しました。

unsigned long ini, end;
rdtscl(ini);
//some code...
rdtscl(end);
printk("time taken=%lu ticks",end-ini);

http://en.wikipedia.org/wiki/Time_Stamp_Counterを参照したように、TSCはPentium以降のすべてのx86プロセッサに存在する64ビットレジスタであると書かれています。それで、私がデュアルコアプロセッサを持っている場合、このカウンタは両方のコアに存在しますか、それとも1つのプロセッサだけでデュアルコアであるため1つだけになりますか?

2番目の質問は次のとおりです。4つのプロセッサを搭載したIntelXeoni3プロセッサがあり、それぞれに2つのコアが搭載されています。次に、クロックティックを測定すると、単一のプロセッサのティックが得られますか、それとも4つのプロセッサすべてが追加されますか?

4

4 に答える 4

4

クロックティックが発生しない場合は、コードに重大な問題があります。自分で書いたのですrdtsclか[または、適切なソースではない場所からコピーしましたか?]

ちなみに、最新のIntel(およびAMD)プロセッサは「一定のTSC」を備えている可能性があるため、停止、スリープ、低速実行などのプロセッサは、他のプロセッサと同じ速度で動作します。まだ同期しますが、それは別の問題です。

カウンターから値を出力するループだけを実行してみてください。RDTSC命令自体だけで30〜50クロックサイクルかかるため、移動していることがわかります。

編集:これが私のrdtsc関数です:

void rdtscl(unsigned long long *ll)
{
    unsigned int lo, hi;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));                        
    *ll = ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );  
}

alernatitvely、値を返す関数として:

unsigned long long rdtscl(void)
{
    unsigned int lo, hi;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));                        
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );  
}

コードがunsignedlongのポインターを渡さないことに気付きました。これにより、タイムスタンプカウンターを呼び出し元に実際に渡していないのではなく、たまたま持っている値を保持しているのではないかと思われます。両方の値で同じです。

于 2012-12-24T08:52:40.370 に答える
2

同じWikiPediaの記事で、TSC の問題について次のように述べられています。

With the advent of multi-core/hyper-threaded CPUs, systems with multiple CPUs, and 
hibernating operating systems, the TSC cannot be relied on to provide accurate results 
— unless great care is taken to correct the possible flaws: rate of tick and whether 
all cores (processors) have identical values in their time-keeping registers. **There 
is no promise that the timestamp counters of multiple CPUs on a single motherboard will 
be synchronized**. In such cases, programmers can only get reliable results by locking 
their code to a single CPU. Even then, the CPU speed may change due to power-saving 
measures taken by the OS or BIOS, or the system may be hibernated and later resumed 
(resetting the time stamp counter). In those latter cases, to stay relevant, the 
counter must be recalibrated periodically (according to the time resolution your 
application requires).

つまり、最新のCPUはCPUクロックレートを変更して電力を節約でき、TSC値に影響を与える可能性があります。また、TSC は、カーネルが HALT を実行し、外部割り込みが受信されるまでプロセッサを停止する可能性がある場合などの状況ではインクリメントしません。

the second question is that i have intel xeon i3 processor which has 4 processors & 
each having 2 cores then measuring the clock ticks will give the ticks of single 
processor or addition of all 4 processors..?

これにより、プロセスが 1 つのプロセッサで時刻を読み取り、2 番目のプロセッサに移動して、最初のプロセッサで読み取った時刻よりも前の時刻に遭遇し、その結果、TSC が不安定な時刻源となる状況が発生する可能性があります。

于 2012-12-24T08:38:21.900 に答える
2

ここで言及されていることのいくつかは、CPU の S 状態のために TSC が時間の尺度ではないなど、正確です。しかし、TSC はマルチコア環境でも相対シーケンスに使用できると思います。Intel CPU >= nehalem arch で true に設定される TSCInvariant というフラグがあります。これらの CPU では、TSC はすべてのコアで一定の割合で変化します。したがって、コンテキストが別のコアに切り替えられた場合、TSC カウントが戻ることはありません。

Ubuntu では、sudo apt-get install cpuid を実行できます

cpuid | TscInvariant を grep して、デスクトップで確認します。

于 2015-10-28T22:53:41.863 に答える