<< ハグアップアップチェッカー考察 | main | Phenom II X6 1055T 低電圧耐性 >>

k10railgun-0.801.1 alpha版

・readme.txtからの垂れ流し

1.概要
 Linuxでpowernow-k8の仕様を突いたPhenom II/Athlon II(AMD K10)用のPstate値・
電圧・倍率・他を変更する簡易ツール。
 またはCPU非依存のTSC簡易測定付き(Intelでも動く)。
-----------------------------------------------------------------------------
2.免責事項
 爆発/浸水/盗難/地震/落雷/津波またはチャック・ノリスなど何が起こっても知り
ません。自己責任でお願いします。
-----------------------------------------------------------------------------
3.付属品
 ・0.0.5より当社比約2倍に膨れたk10railgun.py
 ・このドキュメント
 ・実験的な無駄なコード
 ・怪しい片言の英語--help
 ・range/errorチェックの類は全くしていない。
-----------------------------------------------------------------------------
4.動作確認
HW:AMD Phenom II X2 550 BE + Gigabyte GA-M85M-US2H(F11b)
   AMD Phenom II X6 1055 + Gigabyte GA-MA78GPM-DS2H(F6f)
SW:openSUSE 11.2 x86_64
   openSUSE 11.2 i586
   openSUSE 11.3 x86_64

4.1.たぶん動きそうに無い環境・対応しているはずだが未確認やよくわらかない物
 SinglePlaneのマザー/PVI/C5/PSI-L/AltVid/CPB
4.1.1 実装していないもの
 AltVidの設定 - 対象環境がなくチェックができない為
-----------------------------------------------------------------------------
5.起動例
# python k10railgun.py
とか実行フラグが付いているなら./k10railgun.py

5.1.必要な物
・python
 pythonだけなのでx86/AMD64を問わない。ただし,openSUSE 11.2/11.3以外は何を
聞かれても分からない。
・Linux Box
・dmidecode(なければ他の測定方法がある)
・K10のCPU(Phenom II / Athlon IIなど)
・怪しいプログラムを動かす勇気
・/cpu/?/msrと/cpu/?/cpuid
が存在している事。スクリプト中で自動的にロードするはずだが無い場合はrootで
# modprobe msr / # modprobe cpuidする。

-----------------------------------------------------------------------------
6.表示?
 たぶん80C/25Lに収まるはず。

[Default]F4x1[F3:E0] Register
 起動時のP-Stateテーブル。-rでリセットする場合はここからコピーしてくる。
 CPBのCPUの場合順番がばらばらだが,-rの場合はFreq降順にソートしてから書き込
む。
[CurrentB]MSRC00100[68:64] Register
 カレント,もしくはMSRに書き込む前の状態

[See the changes]Do not write to MSR.
 書き込もうとしている状態の表示。

[CurrentA]MSRC00100[68:64] After
 書き込み後に再度PStateレジスタを読みパースした物。

Freq Ratio FIDh VDD  VIDh  Nb   NbVh
 MHz       /DID   mV /IddA  VDD /DID
 左から,クロック(Bclk補正含む),倍率,FID(HEX)/DID,VDD(mv),
VID(HEX)/Idd(A),NbVDD(mV),NbVID(HEX)/NbDID。

6.1 電圧(mV)の表示と設定の仕様
 本来は最小12.5mV単位なのだが,小数点数表示をケチる為に適当に繰り上げるよう
にしているので(あんまりチェックもしていない),例えば,1212.5mVは1213mVに表
示される。その為,表示上は+-12/+-13mVが交互に加減されるが,絶対値はf.5を含む
場合は必ず繰り上げられる(はず)。
 設定も同様にf.5は設定できないが,それを含むレンジに適当に丸めるので,例え
ば,mV相対値+-で指定した場合,基準から+6〜0〜-6(13step分)が元の値に収ま
り(+-0VID),超える(+-7〜)と次のVID(+-1VID)に入る。次の値は元々の基準からする
と+-7〜+-18(12step)になり,+-19〜+-31(13step)が次の次(+-2VID)になる。

-----------------------------------------------------------------------------
7.オプション
 0.0.5までと一部互換が無い。

7.1 CPB対応CPUと対応Kernelの確認
 MSRへの書き込み時にKernelのバージョンを参照して未対応モジュールらしいものと
対応モジュールで判定を分けているが,未対応の基準はKernel 2.6.31(openSUSE 11.2
)と対応はKernel 2.6.34(openSUSE 11.3)での場合で分けているので,その中間の
2.6.32-2.6.33はとりあえず対応しているものとして処理している。これはどうなって
いるのか全く調べていない為で,未対応ならば--old-kernelオプションを付けてる事
で未対応モジュールとして処理させる事ができる(はず)。

7.2 各種オプション
・--fq=P0,P1,P2,P3
 動作クロックをMHzで指定する。100MHz単位四捨五入付き。
 または,空=無変更,絶対値,+相対値,-相対値,x倍率で指定し,PStateからカン
マで気切る。例:--fq=g1.1などと書くとP0=1.0/P3=0.0としてガンマ曲線補間をする。
相対値はCPU0を基準に設定する。
 MHz単位指定した(もしくは計測した)Bclkを基準とするのでOCしている場合は直感的
になるがせいせい0.5倍づつしか補完されないので素直にxで倍率指定するべきであ
る。

例:--fq=,2000,-100,x5
 P0stateから無変更,2000MHz,相対-100MHz,相対+200MHz,5倍設定になる。

・--vdd=P0,P1,P2,P3
 電圧をmV(ミリボルト)で指定する。だいたい12mV〜13mV間隔。基本的に--fqと同じ
ように空,絶対値,相対値が使える。また,0x1aなどとすると16進数でraw値を入れ
る事ができる。補間機能はもっていない。

・-r / --reset
 [Default]を元にP-Stateのテーブルをリセットする。
 リセット後も--fqオプション等はスクリプト中で確認し続けるので,-r --fq=パラ
メータなどとかくと,電圧はデフォルトのままでクロックだけを変えるという変な指
定も可能。

・-w / --write
 このオプションを付けると実際にMSRに書き込む。MSRに書き込んだ後に
# rmmod powernow-k8 && modprobe powernow-k8
を自動的に実行する。

・--worestart-pk8
 write時にpowernow-k8のリロードをしない。

・--psi-l=Value
 PSI-L(Power Saving Indicator)機能を有効する。値はmV。設定値>=カレントVDDと
なると有効になるものらしいのだが,確認する術がないのでどうなるか知らない。値
に0(Zero)を入れるとDisabledする。

・--vsslamtime
 VSSlamTimeの値をus(マイクロ秒)で設定する。任意の値を入れられるが,仕様上
有効なのは10,20,30,40,60,100,200,500になる。0の場合はカレントPStateテーブル
から計算した値を自動的に設定する。
 仕様上,0.4us/mVという事になっているので,先の設定可能な時間から算出した場
合ぞれぞれ,25/50/75/100/150/100/250/500/1250mVになる。必要時間は
0.4*(P0-Pminの電圧差)usになるので,仮に400mV差の場合は160us必要になり設定する
近い値は200usになる。

・--ov
 過電圧を許可する。過電圧の基準はデフォルトのPstate0 VIDを元にしている。
BlackEditionにも有効になる。

・--oc
 オーバークロックを許可する。リミッターのデフォルトはPstate0 VIDを元にしてい
る。BlackEditionにも有効になるが,たぶんBEでしか意味が無い。

・--bclk=BaseClk
 表示する為のベースクロックMHzで指定する。他に,
dmidecode = # dmidecode -t4のExternal Clock
bootlog = /varg/log/boot.msgから拾う
semitsc = 超簡易TSC測定
がある。デフォルトはdmidecode。

・-p
 HW Pstate値を強制変更する。ただし,変更しても元のpowernow-k8にすぐに書き換
えられてしまうのでrmmod powernow-k8するとか,powersave -lとか適当な方法で他か
ら変更されないようにして使うこと。

・--cpfvid fq,vid
 与える値は--fq/-vddとほぼ同じ。相対値はカレントのFID/VIDを元にしている。こ
れもpowernow-k8にすぐに書き換えられてしまうのでその機能を停止しておく事。

・--psave=profile_name
 現在の設定値・変更値(カレント)をプロファイルとして/etc/k10railgun/に保存す
る。名前は自由に付けられるが,

__boot.conf - --start用
__autosave.conf - --write する毎に自動的に書き込む
default.conf - --psave='' と書くとこれになる
は一応予約されている。

 保存する値は--fq/--vdd/--nbvdd/--vsslamtime/--psi-lのみである。

・--load=profile_name
default.conf - --pload='' と書くとこれになる
 /etc/k10railgun/からプロファイルを読み込む。--writeの制限を受けるので
--writeを書かないとそのプロファイルで実行されない。また,プロファイルの値を他
のオプションでオーバーライトするので,例えば,

test.conf
--vdd=-150,-150,-150,-150

# k10railgun --pload=test.conf --vdd=-100,-100,-100,-100 
とした場合,test.conf内の--vddオプション値を直接指定した--vddオプションをに置
き換え実行する。

・--plist
 プロファイルの名前と内用を表示する。

・--start
  boot用モード。これで起動すると/etc/k10railgun/.k10railgun.lockfile1を作
る。
もし,/etc/k10railgun/.k10railgun.lockfile1がすでにある場合は
/etc/k10railgun/.k10railgun.lockfile2を作り,そこでスクリプトは停止し何の設定
もしない。
 詳しくは8.1を参照。

・--stop
 reboot/halt用モード。正常終了確認の為の
/etc/k10railgun/.k10railgun.lockfile1を削除する。

・--unlock
 異常終了用の/etc/k10railgun/.k10railgun.lockfile2を削除する。
 
・--install
 openSUSEでしかテストしていない簡易インストーラー。詳しくは8.2を参照

・--non-modprobe
 k10railgun.py起動時にKernelモジュールのmsr/cpuidをmodprobeするする。しかし
終了時にremodはしない。ロードしなければ実行できないのであまり意味は無い。

・--old-kernel
 CPB未対応Kernel対策をする。

7.3.--tool CPU非依存簡易ツール
 非依存といってもx86以外はどうなるか知らない。少なくともAMD/K10チェック前に
実行する。MSRモジュールが組み込まれていない場合は組み込む必要がある(自動では
ない)。

7.3.1 # k10railgun.py --tool --bclk=semitsc
とすると
2811.91538997 semitsc
--bclkのオプションは普通の--bclkと同じでbootlogなども有効。値は1秒間分のTSC。

7.3.2 簡易governor切り替え
# k10railgun.py -t -g-
 と値を"-"ハイフンを入れると次のように列挙する。
0.conservative 1.userspace 2.powersave 3.ondemand 4.performance
# k10railgun.py -t -g0
などとすると全てCPUのgovernorをconservativeに切り替える。

7.4.--log K10用ログツール
7.4.1.--sleep 表示間隔
 sleep時間はデフォルトで1秒だが,1秒間止めるのでなく,1秒間隔に取得表示する
ように努力する。途中で多少ずれた場合は補正される。ゼロで1回表示になり,また
0.1などと設定すると100ms単位での取得も可能であるが,あまりにも短いとそれ自体
の負荷でPStateが上がりあまり意味がない。

7.4.2.--log=cofq カレントクロックの表示
 具体的には各CPUのMSRC0010071のFDIDを取得しFreqに換算し表示する。ベースクロ
ックを変更している場合はこれを考慮しない。デフォルトでは1秒間隔。stdout?に出
力されるので必要であればリダイレクトで保存する。

1280337919.21
sec avg max min  0 1 2 3 4 5
0.0 1466 2800 800 800 800 2800 2800 800 800
1.0 1466 2800 800 800 800 2800 2800 800 800
2.001 1466 2800 800 800 800 2800 2800 800 800
3.0 1466 2800 800 800 800 2800 2800 800 800
フォーマットは
1行目 開始時間
2行目 ラベル-左から
nowtime-開始時間,平均(MHz),max(MHz),min(MHz),残りはCPU0〜で,3行目からがデー
タになる。

7.5 副作用
 -r --vdd=xxx -wと書いた一度デフォルト値でリセットしユーザ指定のvdd値を上書
きしてからMSR書き込む。

7.5.1 CPB未対応モジュールとの副作用
 CPB未対応モジュール対応策などはWrite時に判定するので,単に-r -wと書くとデ
フォルト値のままCPB未対応モジュール考慮してMSR書き込むで,まともな動作にな
る(はず)。
 一番単純なのは,
# k10railgun.py -r -w --old-kernel
とだけ書いて実行する。

-----------------------------------------------------------------------------
8.1 --start/--stop/--unlockの概要
 --start boot用
 --stop halt/reboot用
 --unlock ロック解除用

 若干特殊な何故つけたのか忘れてしまった謎の2重ロック機構を持つ。
 --startで作られたlockfile1は--stopで削除されるので次回起動したときは
lockfile1が無い為,正常に起動できる。
 しかし,なんらかの理由で--start時にlockfile1がすでに存在する場合は,
lockfile2を作り再度同じ設定で--startで実行しようとする事を阻止する。解除する
には--unlockを実行しlockfile1/2を削除する。
 これは,低電圧・オーバークロックにより正常に終了できなくなりコールドブート
が発生し,再度その設定によってシステムが不安定な状態のまま再起動を繰り返すの
を避ける為の機能である。

8.2 --install
 openSUSE 11.2/11.3でしか試していないので他でどうなるか知らない。
 --installを実行すると以下の事の実行する。
1.自身を/usr/sbinにコピー
2./etc/k10railgunディレクトリを作る
3./etc/init.d/boot.localに以下を追加。boot.localが無い場合はboot.local自体を
作る。
¥nusr/sbin/k10railgun.py --start --pload=__boot.conf -w # k10railgun-start¥n

4./etc/init.d/halt.localに以下を追加。halt.localが無い場合はhalt.local自体を
作る。
¥n/usr/sbin/k10railgun.py --stop # k10railgun-stop¥n

ただし,インストーラーのチェックが甘いので記述内容をちょっとでも変えると再度
インストールした時にまた追加されてしまう事に注意。
-0.801.1a追記
 0.0.5より若干甘くしたので(具体的には"k10railgun.py"の文字だけ見る),一時的
にコメントアウトするなり記述を若干変えた程度では再追加はされないはず。

-----------------------------------------------------------------------------
-3.K10の仕様
-3.1 cofvidの電圧
             CPU0 CPU1 CPU2 CPU3 CPU4 CPU5
[CoFreq MHz] 3300  800  800 2800  800  800
[CoVDD  mV ] 1200 1163 1163 1163 1200 1163
のようにP3のコアも高い電圧値が入るが,その場で一番高いVID合わせられる仕様であ
るらしいので問題にならない。
 どうしても気になるならconservativeで動かせば抑えられるが,挙動の違いから
もっさりになる可能性がある。

-----------------------------------------------------------------------------
-2.powernow-k8の仕様
-2.1 Cpufreqのmax値とPStateの仕様
 Cpufreqなどで表示するクロックはpowernow-k8がカレントPStateの倍率とOCされて
いない事を前提にした算出なので,ベースクロックを変えたりしている場合に全く合
わないのはこの為である。

-2.2 powernow-k8とBlackEditionとの組み合わせの仕様
 KernelのPState制御の最速なるPState値はpowernow-k8がロードされた時点で決まる
が,ロードされた時にPStateレジシタ群でモジュールが拾ってきたCPUのMaxFreqを超
える場合は超えないようにPState制御に制限がかかる。この為,BlackEditionでP0が
本来のクロックより高い場合は最速PStateを落とされて,通常P0-3で動く所をP1-3な
りに制限され,P0に入らないようになる(cpufreqからは設定もできない)。

-2.3 Core Peformance boost非対応Kernelモジュール
 CPBが付いているCPUを非対応モジュールで動かした場合次ような挙動になる。
例:Phenom II X6 1055T
MSR          - モジュールの認識 - 発行 - CPUの実際の動作
C0010064 Pb0 3.3GHz - P0/3.3GHz - HWP0 - C0010065→をカレントに入れる→2.8GHz
C0010065 P0  2.8GHz - P1/2.8GHz - HWP1 - C0010066→をカレントに入れる→2.2GHz
C0010066 P1  2.2GHz - P2/2,2GHz - HWP2 - C0010067→をカレントに入れる→1.5GHz
C0010067 P2  1.5GHz - P3/1.5GHz - HWP3 - C0010068→をカレントに入れる→0.8GHz
C0010068 P3  0.8GHz -         
 モジュールが認識しているクロックと実際の動作は1段づつずれる。またモジュール
が拾ってきた最高クロックが2.8GHzになるので「-2.2」のBlackEditionのような制限
がかかりPS0/3.3GHzだと思っているP0は発行されなくなり実際はHWP1-3発行に制限さ
れ2.2GHz-0.8GHz駆動になる。
 対応モジュールでは極端な話,Pb0を飛ばしMSRの2段目からをP0としているので
この制限がかからない(BlackEditionと最高クロックの組み合わせはかかる)。

-2.4 k10railgunでの対策例(TRICK/もしくは山田)
 k10railgunではこの制限にかからないように次ような動作をする。

-2.4.1 Core Peformance boost非対応Kernelモジュール用対応動作
 1.設定しようとしているPb0を抜いたP0-P3をC0010064〜+3に書き込む
 2.powernow-k8をリロード
 3.設定しようとしているPb0を含む全PState値を書き込む
というようにモジュールの認識と発行と実動作を合うように小芝居をし制限がかから
ないようにいる。

-2.4.2 BlackEditionとOC倍率対策
 1.P0にデフォルト値から拾ってきたP0値を載せて書き込む
 2.powernow-k8をリロード
 3.カレントのP0に本来設定しようとしている値を書き込む
というようにBlackEditionでMaxFreqを超える倍率をP0に設定した場合を考慮して小
芝居をする。これはCore Peformance boost対応/非対応モジュールで実行する(は
ず)。

-2.4.3 offlineからの復帰
 sysfsからofflineにしたコアはonline時に値がリセットされるので再設定する必要
がある。

-2.4.4 k10railgun.pyの個別コア操作
 サポートしない。
 個別にRatioをいじったとしても,その後でpowernow-k8をロードしたときに
powernow-k8がCPU情報を拾ってくるCPUがpowernow-k8の初期化プロセスの走っている
CPUに限定されそれが不定である為で,6cores/6online時に確率は1/6になる。

-1.-1
 どうしても動かなく,どうしても動かしたい切羽詰まった状態である場合にブログ
にコメントして頂ければ対応する場合があります。
-1.TODO
ncurses
surfboard

filesize : 20359
sha1sum : ffca9cdae57b49ec3e93c853d554d249928940f3
Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2010-08-03 20:29:24 ..... 19042 7644 readme.txt 2010-08-03 20:30:19 ..... 41063 12427 k10railgun.py ------------------- ----- ------------ ------------ ------------------------ 60105 20071 2 files, 0 folders

・追記
 ダウンロード先を間違えていたのを修正した。


コメント
ちょっと書き換えて、AMD FX(piledriver)で使っています。
Pステートやブーストステートの数を書き換える事で、移植できる様です。
以下、0.801.1 alphaへのパッチ。

--- k10railgun.py.org 2010-08-03 20:30:19.000000000 +0900
+++ k10railgun.py 2014-04-14 00:43:59.768342431 +0900
@@ -1,4 +1,4 @@
-#! /usr/bin/python
+#! /usr/bin/python2
# -*- coding: utf-8 -*-
import struct
import sys, os, time, commands, platform
@@ -114,7 +114,7 @@
nbp = tHBAMD((4, 0x1f4)).param
nbp = [vmask(nbp, 6, 0), vmask(nbp, 13, 7)]
pst=[]
- for no in range(cpuinfo.PstateMaxVal+1):
+ for no in range(cpuinfo.PstateMaxVal+2):
psr = tHBAMD((4, 0x1e0+no*4)).param
ps = PSTATE(1 << 63)
ps.setDFid(vmask(psr, 8, 0))
@@ -127,7 +127,7 @@

def get_current_table(self):
pst = []
- for ps in range(cpuinfo.PstateMaxVal+1):
+ for ps in range(cpuinfo.PstateMaxVal+2):
pst += [PSTATE(tMSR(0xc0010064+ps).param)]
return pst

@@ -291,7 +291,7 @@

if ps.isdigit():
ps = int(ps)
- else: ps = cpuinfo.PstateMaxVal+1
+ else: ps = cpuinfo.PstateMaxVal+2
if ps > cpuinfo.PstateMaxVal-cpuinfo.cpb:
ps = vb.getCurPstate()
s2 = (ps -1) & 0x3
@@ -625,8 +625,9 @@
return nums_value_parse(var, 511)

def check_k10check():
- if cpuinfo.ExtendedFamily != 1 or cpuinfo.BaseFamily != 0xf:
- return False,'Not AMD K10 Family.'
+ if cpuinfo.ExtendedFamily != 6 or cpuinfo.BaseFamily != 0xf:
+ print '%X' % (cpuinfo.ExtendedFamily)
+ return False,'Not AMD bulldozer Family.'
return True,None
def check_HwPState():
if cpuinfo.getHwPstateFlasg == 0:
@@ -956,8 +957,8 @@
print 'PS%38s | %36s' % (head[1], head[1])
ll = len(cpuinfoview.pstate4(0, llist[0]))
psl = [ ['0','1','2','3','4'],
- ['b0','0','1','2','3']][cpuinfo.cpb]
- for p in range(cpuinfo.PstateMaxVal+1):
+ ['b0','b1','0','1','2','3','4']][cpuinfo.cpb]
+ for p in range(cpuinfo.PstateMaxVal+2):
lp = cpuinfoview.pstate4(p, llist[p])
rp = cpuinfoview.pstate4(p, rlist[p
  • A-11
  • 2014/04/14 1:39 AM
コメントする









この記事のトラックバックURL
トラックバック
k10railgun-0.801.1a
■ k10railgun-0.801.1 alpha版 http://xblog
  • とある人柱の日記
  • 2010/10/14 9:00 AM
calendar
    123
45678910
11121314151617
18192021222324
25262728293031
<< August 2019 >>
検索
いろいろ
google
selected entries
categories
archives
recent comment
recent trackback
recommend
links
profile
search this site.
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM