あれからもうちょっと深追いしてみました。
昔ながらのTSCのタイプ
- PentiumM(family[06H],models[09H, 0Dh])
- Pentium4 Xeon(family[0FH], models[00H,01H, 02H])
- Pentium(P6)
これらは、タイムスタンプカウンタ(TSC)は内部プロセッサクロックで増加する。
この内部プロセッサクロックとは、コアの現在のクロックで決定されるものである。
ただし、Intel SpeedStep Technologyがクロック可変をもたらすので、TSCのカウンティングに悪影響を及ぼすことになる。
・・・なるほど、そこで次のTSCが出てきたわけですね
Constant TSCのタイプ
- Pentium4 Xeon (family[0FH], models[03H以降]
- CoreSolo CoreDuo(family[06H],models[0EH]
- Xeon 5100, Core2Duo(family [06H], model [0FH])
- Core2, Xeon (family[06H], DisplayModel[17H])
- Atom (family[06H],DisplayModel[1CH])
タイムスタンプカウンタは一定の割合で増加する。この増分はコアクロックの最大値から設定されるものである。
この機能は、コアの周波数可変に対応するために導入された。
あくまで、コアの周波数可変に対応までが目的です。
プロセッサの電源管理に対して、まったく対処されていないので、さらに次のTSC特性が出てきたというわけです。
Invariant TSCのタイプ
これは現在の Intel Core i シリーズから 搭載されているようです。
CPUID.80000007H:EDX[8] によってプロセッサがサポートしているかを判定します。
Invariant-TSCは、CPUのどのステートによっても一定割合で増加するTSCである。
つまりディープスリープに陥っていてもカウンタが止まらない。
このInvariant TSCを備える場合には、HPETやACPI Timerの代わりとして高精度なタイマーとして使うことが可能となる。
AMD CPUの場合
上記のはすべてIntel CPUだったので、AMD CPUではどうなのかを調べてみました。
- AMD K8 Coreまで(すなわちAthlon64, Athlon64X2シリーズ)
TSCは各クロックで増加する。パワーマネジメントにより悪影響を及ぼされ、1秒あたりの増分が変わる。さらに、コアごとに TSCの同期は行われていない。 - AMD Barcelona/Phenom(それと Athlon64X2 kumaコードネームのもの)
Constant TSCを搭載している。
“AMD Athlon™ 64 X2 Dual Core Processor Driver”というものをインストールすれば、TSCの同期問題はひとまず対処される模様。
AMDのConstant TSCという部分においては、 AMD64 Architecture Programmer’s Manual を参照すると以下のように書いてあり、Intelの Invariant TSCに近いものになるのではないかと思う。
The TSC counts at a constant rate, but may be affected by power management events (such as frequency changes), depending on the processor implementation. If CPUID 8000_0007.edx[8] = 1, then the TSC rate is ensured to be invariant across all P-States, C-States, and stop-grant transitions (such as STPCLK Throttling); therefore, the TSC is suitable for use as a source of time. Consult the BIOS and Kernel Developer’s Guide applicable to your product for information concerning the effect of power management on the TSC.
上記の参考文献
- “Intel 64 and IA-32 Architectures Software Developer’s Manual” (2012March版) の記載事項より
17.12 TIME-STAMP COUNTER 節 - http://en.wikipedia.org/wiki/Time_Stamp_Counter の部分
- AMD64 Architecture Programmer’s Manual