home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 February / VPR9802A.ISO / BENCH / pfm68621 / PFM686.DOC < prev    next >
Text File  |  1997-10-06  |  14KB  |  433 lines

  1.        ***                                                     ***
  2.        ***       Performance meter for Intel 686 ver 2.1A      ***
  3.        ***                                                     ***
  4.        ***    著作権者:第三京浜  jbd00025@niftyserve.or.jp    ***
  5.        ***              (こじ)  hgg02424@niftyserve.or.jp    ***
  6.        ***                                                     ***
  7.        ***                                       1997 10-8     ***
  8.  
  9.  
  10.  
  11. ----   pfm686 ver 2.1A  ---- 97-10-8 公開
  12.  
  13. ・ cache size option を指定するとエラーが出たのを直しました.
  14.    (Thanks なまいさん)
  15.  
  16. ----   pfm686 ver 2.1   ---- 97-10-5 公開
  17.  
  18. ・ cache write における flush 動作を pfm686 v1.* の方式に戻しました.
  19.    これにより,P5における内部 cache write 計測が再びできるように
  20.    なりました.
  21.  
  22. ・ cache 容量を検出して報告するようにしました.ただしこの機能はあくまで
  23.    こういうことができるかどうかを調べるための調査用です.
  24.  
  25. ・ 改変 CWSDPMI との併用により,4Gbytes までの main メモリ,
  26.    170Mbytes までの cache メモリに対応できます.
  27.  
  28.  
  29. ----   pfm686 ver 2.0   ---- 97-9-16 公開
  30.  
  31. ・開発環境を DJGPP v2 に移しました.
  32. ・main write 測定の方法を新しくしました.
  33. ・コードを大幅にスリム化し,計測精度を向上させました.
  34.  
  35.  
  36. PFM686 ver 1.* との違い.
  37.  
  38. ・ cwsdpmi という DPMI server 上で動作します.
  39.  これには pfm シリーズ用に一部の動作を改造した cwsdpmi を用います.
  40.  
  41. ・  main write の計測方法を変えました(後述).
  42.  
  43.  
  44.  
  45.  
  46.  
  47. ----  内容  ----
  48.  
  49. pfm686.doc : この file
  50. pfm686.exe : 実行形式
  51. pfm686.c   : ソース
  52.  
  53.  
  54.  
  55.  
  56. ---  動作環境 ---
  57.  
  58. ・ P5 以上の intel 系 CPU を搭載した IBM-PC 系マシンで動作すると思います.
  59.  
  60. ・ PFM686.exe と CWSDPMI は常に同じ dir に置いてください.
  61.  
  62. ・  PFM686 v2 の機能をすべて利用するためには,PFM686 用に改造を加えた
  63.     CWSDPMI が必要です.この PFM686専用 CWSDPMI は FEXT LIB 12 にあります.
  64.  
  65. ・  正確な計測をするため,VCPI もしくは 生DOS 下での使用をおすすめします.
  66.     Windows の DOS 窓のような環境での計測結果はあまりアテにならないので
  67.     注意してください(気を付ければ一応計測はできます).
  68.  
  69.  
  70. ----  コンセプト  ----
  71.  
  72.  目的はPCに搭載されたメモリの速度を計ることです.考え方の基本は
  73. 第三京浜さんの pfm486 からひきついでいます.
  74.  
  75.  pfm486 は DOS上の .com プログラムであるため,大容量の cache(256K 以上)
  76. が搭載されたPCに対しては,正確な計測はできなくなりました.
  77.  pfm586 および pfm686 v1 は,開発環境を DJGPP v1 に移す事により,
  78. 大容量の cache に対応すると同時に様々なオプションを付加することにより,
  79. 多彩なメモリパホーマンス計測を可能としていました.
  80.  そして今回の pfm686 v2 からは,開発環境を DJGPP v2 に移し,ソースコード
  81. を大幅に見直す事で安定性を向上させました.DPJPP v2 の生成するコードは
  82. DPMI server 下の プロテクトモード環境で動作します.
  83.  
  84.  pfm686 v2 においても,任意の物理アドレスを指定して計測することが
  85. できます.複数の BANK に違う種類のメモリを混在させている場合などの
  86. 動作の検証や,アラインミスしたときの速度低下などの検証ができます.
  87. pfm686 v2 におけるメモリアドレス指定機能は,物理メモリ取得 function 
  88. を DPMI server に対して発行するため強力です.
  89.  
  90.   pfm686 v2 では,測定用のコードの見直しにより L2 cache がどんなに
  91. 大きくても正確なメインメモリ測定ができます.また逆に option に小さい
  92. 値を指定すると CPU の内部 cache の動作を検証することもできます.
  93.  
  94.   pfm686 v2 では,pfm686 専用 CWSDPMI との併用により,1M ~ 4GB までの
  95. 任意の物理アドレスのうちの最大 512MB 区間を確保できます.これだけ余裕が
  96. あれば,将来的にmain memory 4GB, cache 170MB というPCが出て来ても
  97. 大丈夫です.
  98.  
  99.  
  100.  
  101.  
  102.  
  103. --- pfm686 の使用方法
  104.  
  105. pfm686.exe は DOS 上で動かす事を前提として作られています.
  106. pfm686 用に改造した CWSDPMI(FEXT DL12 にあります)と pfm686 を同じ dir
  107. に置いて,pfm686.exe を実行してください(普通はそれだけです).
  108.  
  109. もし他の DPMI がすでに install されている場合は 
  110.  
  111. > CWSDPMI[Enter]
  112.  
  113. とすることで,CWSDPMI が常駐モードでインストールできる場合があります.
  114. この場合,常駐直後に実行されたプログラムは CWSDPMI 下で動作します.
  115.  
  116.  
  117. 使用例:1( option を付けないで実行)
  118. > pfm686.exe
  119.  address option を指定しない場合は,DPMI が自動で適切なアドレスを
  120. 割り付けます.また,cache size option を指定しない場合は 外部 cache 
  121. を 256Kbyte であると仮定して実行します.
  122.  
  123.  
  124. 使用例:2( CPU の内部 cache を測定)
  125. > pfm686.exe 2
  126.  
  127.  
  128. 使用例:3(512KBytes の L2 cache を指定)
  129. > pfm686.exe 512
  130.  
  131. L2 cache が 512KB であることがわかっている場合,このように容量 option 
  132. を指定することにより,測定の信頼度が向上します.
  133.  
  134.  
  135. 使用例:4( 測定する main memory の先頭物理アドレスを 0x200000 に指定)
  136.  
  137. pfm686.exe a 200000
  138.  
  139. a と アドレスの間にはスペースを一個空けてください.
  140. この option を clean boot DOS 以外で使用すると,メモリ上の必要な
  141. データを破壊する可能性があります.
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149. --- 表示内容に関する説明 ----
  150.  
  151.  
  152. 1.
  153. " pfm686 ver2.1   DysanKeihin & (koji) "
  154. ---
  155. pfm686 の version番号と,著作権表示です.
  156.  
  157.  
  158. 2.
  159. " Cache size : [  64]Kbytes       "
  160. ---
  161. cache size を指定したときにだけ表示します.
  162.  
  163.  
  164. 3.
  165. " Cache fill 01EB0000 - 01EC0000  "
  166. " Dummy fill 01EB4000 - 01FF0370  "
  167. ---
  168. a option を指定した時だけ表示します.これは pfm686 が使っている
  169. 物理メモリアドレスを表しています.
  170.  
  171.  
  172. 4.
  173. "CPU:  P6  [GenuineIntel Fam6 Mdl1 Stp 7]"
  174. ---
  175. CPU type の表示です.[]の中身は CPU-ID 命令で読み出した string を
  176. そのまま表示したものです.
  177.  
  178. 5.
  179. "This FPU is BUGGY version."
  180. ---
  181. この表示は,いまさらの「バグペン」を検出したときに表示します.
  182.  
  183.  
  184. 6.
  185. Either CMOS-RTC or 14.318MHz clock seems strange.
  186. factor : :1.0070
  187. ---
  188. この表示は,14.318MHz 系の clock が RTC と食い違っているときに
  189. 表示します.
  190.  
  191.  
  192. 7.
  193. " 250.00[MHz] "
  194. ---
  195. CPU の動作周波数表示です.この CPU 周波数判定は rdtsc 命令を使って
  196. いるため,互換CPUなどでは,pfm686 自体が実行不可能な場合があります.
  197. その時には pfm586 を使ってください.
  198.  
  199.  
  200. 8.
  201. |----------------------------------------|
  202. |               | [ns/dword] |[CPUclocks]|
  203. |---------------+------------+-----------|
  204. | E-cache read  |    3.788   |   0.945   |
  205. | E-cache write |    7.467   |   1.863   |
  206. | main    read  |   16.600   |   4.142   |
  207. | main    write |   33.291   |   8.306   |
  208. ------------------------------------------
  209. ---
  210. 外部 cache と,main memory に対する read と write の速度を表しています.
  211. 1 double word あたりの read/write 時間と,clock 数をあらわしています.
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219. --- memory 速度の計測方法に関する説明 ---
  220.  
  221.  pfm686 では,メモリ上の2つの区間を使います.
  222.  
  223.  
  224.    Ecache区間(可変)          Dummy Fill 区間
  225. |---------------------||---------------------------------|
  226.  
  227. Dummy fill 区間は最低 1Mbytes は確保しますが,Ecache 区間が 512K
  228. よりも大きい値が指定されたときは Ecache 区間の2倍を確保します.
  229.  
  230. E-cache read
  231. 1. cache fill区間を adcl code で埋める
  232. 2. adcl code を実行.(cache fill区間が cache におさまる)
  233. 3. 時間を計りながら 再び 2.を 実行する.
  234.  
  235.  
  236. E-cache write
  237. 1. プログラム配列上に pushal code を書き込む.
  238. 2. Ecache 区間に空書きして L1 cache からの writeback 動作を
  239.    起こさせる.
  240. 3. sp を Ecache 区間の最後に張り付けて pushal code を実行.
  241.    (Ecache 区間が stack data で埋め尽くされる)
  242. 4. 時間を計りながら 2. 3. と同じ事を実行.
  243.  
  244.  
  245. main read 
  246. 1. Ecache 区間を adcl code で埋める
  247. 2. Dummy Fill区間の data を読みこむ(cache の内容が Dummy に置き変る)
  248. 3. 時間を計りながら Ecache 区間の adcl codeを実行
  249.  
  250.  
  251. main write 
  252. 1. プログラム配列上に pushal code を書き込む.
  253. 2. Dummy Fill 区間に空書きして L2 cache からの writeback 動作を
  254.    起こさせる.
  255. 3. sp を Ecache 区間の最後に張り付けて pushal code を実行.
  256.    (Ecache 区間が stack data で埋め尽くされる)
  257. 4. 時間を計りながら 2. 3. と同じ事を実行.
  258.  
  259.  
  260. さらに詳しい事はソースを見て考えてください.
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. ---- PFM686 v1.2B 以前の計測値との違いについて  -----
  269.  
  270. PFM686 v2 では,write 速度の方法自体がそれ以前のものとは変っています.
  271. 以前のものより,main write の計測値が遅く出ます.いろいろ調べましたが
  272. おそらくこの「遅く出る」値の方が正しいと確信しました.以下の例は,
  273. 私のマシン(P6-250MHz(100*2.5) 256 L2 cache, 32MB EDO DRAM, 440FX)
  274. での計測結果です.
  275.  
  276. 古い PFM の計測値の例(コマンドラインオプションなし)
  277. -- pfm686 ver1.2B  DysanKeihin & (koji) --
  278. ------------------------------------------
  279. |CPU:  P6  [GenuineIntel Fam6 Mdl1 Stp 7]|
  280. |----------------------------------------|
  281. |  249.50[MHz]  | [ns/dword] |[CPUclocks]|
  282. |---------------+------------+-----------|
  283. | E-cache read  |    3.860   |   0.963   |
  284. | E-cache write |    7.859   |   1.961   |
  285. | main    read  |   16.615   |   4.145   |
  286. | main    write |   13.189   |   3.291   |
  287. ------------------------------------------
  288.  
  289.  
  290. pfm686 v2 での計測値の例(コマンドラインオプションなし)
  291. -- pfm686  ver2.1  DysanKeihin & (koji) --
  292. ------------------------------------------
  293. |CPU:  P6  [GenuineIntel Fam6 Mdl1 Stp 7]|
  294. |----------------------------------------|
  295. |  249.50[MHz]  | [ns/dword] |[CPUclocks]|
  296. |---------------+------------+-----------|
  297. | E-cache read  |    3.882   |   0.969   |
  298. | E-cache write |    7.851   |   1.959   |
  299. | main    read  |   16.601   |   4.142   |
  300. | main    write |   33.264   |   8.299   | <--- ココがちがう
  301. ------------------------------------------
  302.  
  303.  
  304. なぜこういう違いが起こるのかについて以下で説明します.
  305.  
  306. PFM686 v1.* -> v2.* での write 計測に関する,具体的な変更点は cache flush
  307. のやりかたです.pfm486 以来,大きなメモリ領域を読み込むことで cache flush
  308. ができるもの,と考えて来ましたが,この伝統的な方法は,特に P6 以降の
  309. CPUでは,思惑通りに機能していないようです.そもそもメモリの速度において
  310. read より write の方が速いということ自体が不自然であり,これは P6 に
  311. なって以降ずっと疑問としてありました.さらに PFM686 v1.2 以前の PFM で
  312. おかしいと感じることはほかにもあって,
  313.  
  314. ・ L2 cache on 時の main write 測定と,L2 cache off 時の main write
  315.   計測値は理屈では一致するはずなのにそうもなっていないことがある.
  316.     (L2 on で main write まで速い値になる)
  317.  
  318. ・  cache size option に大きな値(2048など)を指定すると main write 
  319.   まで遅い値がでる(どうやらこの時の main write 値が正しいらしい).
  320.  
  321.  なぜこういう現象が起きるのかということをよく考えて,従来からの
  322. pfm シリーズのコードを総点検してみたところ,cache flush の方法自体が
  323. おかしいのではないかと気付きました.
  324.   そこであたらしい cache, main write 測定方法ですが,「書き捨て方式」
  325. というのを考えました.ゴミを大量に memory に書き込むことによって
  326. まず write back cache をあふれさせます.その直後に時間を計りながら
  327. 所定の pushal を実行し write 測定をおこないます.
  328.  
  329. PFM686 v2.* で用いているこの方法により,L2 を off したときの main write
  330. 測定値と,L2 on の時の main write 測定値がほぼぴたり一致します.
  331. pfm686 の cache size option に大きな値を指定した場合の L2 speed と
  332. main speed もきちんと一致します.
  333.  
  334. 以下その例を示します.
  335.  
  336.  
  337. BIOS 設定にて L2 cache を off にしたときの pfm686 v1.2B
  338. -- pfm686 ver1.2B  DysanKeihin & (koji) --
  339. | E-cache read  |   16.613   |   4.145   |
  340. | E-cache write |   32.269   |   8.051   |
  341. | main    read  |   16.617   |   4.146   |
  342. | main    write |   32.956   |   8.223   |
  343.  
  344. BIOS 設定にて L2 cache を off にしたときの pfm686 v2.1
  345. -- pfm686  ver2.1  DysanKeihin & (koji) --
  346. | E-cache read  |   16.601   |   4.142   |
  347. | E-cache write |   33.148   |   8.270   |
  348. | main    read  |   16.602   |   4.142   |
  349. | main    write |   33.316   |   8.312   |
  350.  
  351. このように 古い pfm の値が新しい pfm の値に近づきました.
  352. もともと L2 cache off での計測ですからこれが main memory
  353. の本当の速度であることに疑いはありません.
  354.  
  355.  
  356.  
  357. pfm686 v1.2B で cache size option に 1024KB を指定した場合.
  358. -- pfm686 ver1.2B  DysanKeihin & (koji) --
  359. | Cache size : [1024]Kbytes              |
  360. | E-cache read  |   16.604   |   4.143   |
  361. | E-cache write |   26.748   |   6.674   |
  362. | main    read  |   16.603   |   4.143   |
  363. | main    write |   28.224   |   7.042   |
  364.  
  365. pfm686 v2 で cache size option に 1024KB を指定した場合.
  366. -- pfm686  ver2.1  DysanKeihin & (koji) --
  367. | Cache size : [1024]Kbytes              |
  368. | E-cache read  |   16.601   |   4.142   |
  369. | E-cache write |   33.203   |   8.284   |
  370. | main    read  |   16.601   |   4.142   |
  371. | main    write |   33.253   |   8.297   |
  372.  
  373. pfm686 v2.* における main 側の計測値はほぼ一定していますが,
  374. v1.2B における結果は v2.* のそれに近いとはいえ,まだすこし
  375. 速い方向にずれています.
  376.  
  377. v1.2B でこのような計測結果が出て来る理由は以下のように
  378. 説明できそうです.
  379.  
  380. pushal によって書き込まれたデータのうち 256KB がcache にヒットし,
  381. 768KB(1024-256)が cache からあふれた.よって v1.2 での計測結果は
  382.  ( 真のcache速度 * 256 + 真のmain速度 * 768 ) / 1024
  383. =( 1.959 x 256 + 8.299 x 768 ) / 1024 = 6.714 [clocks]
  384.  
  385. 同じ方法で cache option に 2048KB,4096MB を指定して実験しましたが,
  386. ほぼこのモデルにあてはまりそうです.
  387.  
  388. つまり従来の pfm では main write が本来よりも速く測定されることが
  389. あります.近くに有った P5 マシンを借りて,同じ現象が起きるかどうか
  390. 試して見ましたが,有意な差は見られなかったので,この現象は P6 特有
  391. のものかもしれません.
  392.  
  393. 以上に示したようなやりかたは pfm686 の出力した計測結果が正しいか
  394. 否かを判断するために有効だと思います.
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402. ---- そのた -----
  403.  
  404.  
  405. ※ PFM 専用 改変CWSDPMI に関して:
  406. CWSDPMI は DJGPP v2 での仕様をターゲットとした DPMI server です.
  407. PFM686 では CWSDPMI に改造を加えたものを使用します.オリジナルの
  408. CWSDPMI は使えませんので注意が必要です.
  409. PFM専用 CWDSPMI は NIFTY-Serve fext DL 12 に実行形式とソースが
  410. あります.
  411.  
  412.  
  413. ※ 転載に関して:
  414. このプログラムの転載に際しては,事前に小島宛に転載したいという旨を
  415. 知らせてください.
  416.  
  417. また,CWSDPMI の転載に関しては PFM686 とはまったく別の扱いです
  418. ので,CWSDPMI に添付のドキュメントを参照してください.
  419.  
  420.  
  421.  
  422. このプログラムに関する問い合わせは fext mes12 までどうぞ.
  423.  
  424.  
  425. 謝辞:PC98 版 pfm シリーズの移植者でもあり,pfm686v2 作成に関して
  426. いろいろ助言してくださった vinwa さんに感謝いたします.
  427.  
  428.  
  429. このプログラムの著作権者:第三京浜  jbd00025@niftyserve.or.jp
  430.                           (こじ)  hgg02424@niftyserve.or.jp
  431.  
  432. このドキュメントの著者:(こじ)小島 昭二 hgg02424@niftyserve.or.jp
  433.