livaの雑記帳(2016/11)

11/30

  • とあるものを実装しているのだけど、中々進捗が産めずに困ってる
    • 参考になるコードは見つかったので、いい加減今日中には解決したい
  • BitVisor Summit 5に参加してきた
    • 僕でも理解できる話が結構多い!
    • PCI割り込み周りの話とかx2APICとかとか
    • BitVisorでもまだこういう話が残っているのか、とちょっと驚いてしまった
  • 自分用メモ
    • コアの同期時間を意識してロックを取るプログラムを書いてみる
      • てかその前にnice値あげよう
    • Xeon Phiアーキテクチャーについていろいろ調べよう
      • ネットワークの遅延、大丈夫?

 

11/21

  • 自作OS上でのXeonPhiのベンチがどうも上手く行かないので、Linux上でも同じ事をやって比較してみる
    • ↓とか参考にして、スレッドをCPUに固定
    • $ sar -P ALL 1 1000
    • Linuxの計測、コア間でめちゃくちゃ性能差が出て、正直うーんという感じ。pthreadでやっているのをMPIとかでやるようにすれば改善されるのだろうか?
  • Linux向けにコードを修正している時にバグを発見。修正したらDDR4とMCDRAMで有意な差が出た!!
    • MCDRAM、早いですね

 

11/16

  • CPUID命令のどこを見ればXeon Phiを識別できるだろうか
  • ワーシャル-フロイド法を愚直に並列化して、ベンチマーク取ってみたものの、メモリ帯域を使い切れず
  • というわけで今後のやる事に関する自分用メモ
    • Linux上で走らせてみる
    • コア間通信の測定
    • LU分解も試してみる

11/11

  • 今日のハマりポイント
    • メモリのベンチマークをしたいのだけど、動かない
    • 256コアの同期を取って、同時並列にメモリアクセスをする、というベンチ
    • そもそも同期にたどり着かない
    • 原因解明をする
      • いちおう256コア、ベンチマークの先頭までは到達している
      • 途中で物理メモリのAlloc関数を呼ぶので、そこが怪しげ
        • 調べたけど、違うっぽい
      • 紆余曲折の結果、ベンチマークのためにメモリを初期化するのだけど、その途中で幾つかのコアが死んでるっぽい事が判明
      • 更に調査。死ぬのは特定のメモリにアクセスした時っぽい
      • 10MB*256で2GBのメモリを使うのだけど、物理アドレス空間先頭2GBの中に触ってはいけないアドレスがあるっぽい
      • grubがくれるメモリ情報
        • 確かに存在した!
      • 物理メモリアロケータに、触ってはいけないメモリ領域を通知するコードを実装した
        • 物理メモリアロケータのメモリリザベーションコードがバグってて、これまた嵌った
  • ちょっと一息ついたので、息抜きがてらe1000 NICの初期化中にGPで落ちる問題を調査してみる
    • 落ちるのはLockを取る所
    • 調べたら、Lockオブジェクトをきちんと割り当ててなかった。はい。

11/9

  • SpinLock::LockでInvalid CpuIdで落ちる問題を解決
    • levelfourが数日前に指摘した、一瞬invalidな状態になるケースを弾いても発生
    • invalidな状況を弾いた上で、CpuIdの比較を行うのでは、弾くのと比較がatomicでないから、結局意味がない
    • 対応としては、CpuIdにoperator ==を実装し、比較についてはinvalidな状況を弾かなくて良くした

11/8

  • OSKitの組み込み、アリかもと思ったんだけど、大きすぎて無理そう
    • たぶんやるとしてもlibcを引っ張ってくる、くらい
  • 書いた→デバッグ方法
  • 固定ページの順序付けをした
  • GRUBにファイルを読み込んでもらう方法が分かった
    • grub.cfgにmodule2 (ファイル名)とするだけ
    • あとはmultiboot specification2に則ってmoduleの展開場所のアドレスが取得できる
    • 詰まりポイント
      • module2で指定すれば良いって話、GRUB2の仕様書に書いてないんだけど(どっかのフォーラムへの投稿を偶然見つけた)
      • アドレス取得の際にnullptrを読んでしまって変な値が取得された(あるある)

11/7

  • アンパンマン、新しい基盤よ!
    • p_20161107_080103
    • 9年前の代物
      • OEM品(DELL)
    • 4年位使って、その後新しいのリプレースした際、押入れに仕舞われていた
      • 仕舞う際にサランラップでぐるぐる巻きにしたので、解体当初のままの姿。解体した時点で付着していた埃まで残ってる
    • 僕の中では初めてのPC自作がCore 2 Duoマシンだった事もあって、Core 2 Duo搭載の本基盤もそう古い物だと思ってなかったのだけど、もう9年も前になるんだなぁ、と感慨深い
    • 電源入れたら動きました。今時の基盤にしてはタフ
    • OS開発のテストにでも使う予定
      • PS/2端子がない
        • USBキーボードドライバ実装の機運?
      • NICがIntel e1000
        • 雑魚い基盤なのに、蟹さんではないのが驚き
        • ちなみに、ドライバ初期化の途中でGPで落ちてる。スタックが足りなくなったかな?
    • にしても、物がどんどん増えていって、ラボの机が溢れかえっていく

11/4

  • Rustのお話
    • Rustでの継承(c++における継承)周りの知識が無かったので、調べてみた
      • Traitを使う
      • 異なる型のオブジェクトをまとめて扱う場合はTrait Objectを使う

11/2

  • 買った→サンワサプライ USB3.0切替器(2回路) SW-US32
    • デバッグが捗る〜〜〜〜
  • メモリのベンチをする
    • マシン1
      • CPU:Core™ i7-6700K
        • L3 Cache: 8MB
    • マシン2
      • Xeon Phi 7210
        • L2 Cache: 1MB
          • 32MBとかほざいてるけど、それは2つのコアで1MBのL2 Cacheを共有していて、それが32セットあるから32MBってだけ
        • Memory Mode: Flat
          • MCDRAMを全て普通のメモリとして使用
    • DDR SDRAMのベンチ
      • 20MBくらいの領域をランダムアクセスすれば良いかな?
      • 糞雑魚プログラムの結果→
        • Corei7: 40ms
        • Phi: 155ms
          • 大体3倍。でもPhiのベンチをどこのCPUでやるかで変わりそうではある
    • MCDRAM vs DDR SDRAM
      • 同じ糞雑魚プログラム
        • Phi DDR4 SDRAM: 155ms
        • Phi MCDRAM: 155ms
          • 変わらん
    • 教授殿より、ちゃんとしたメモリベンチツールを使う&各コアごとに測れ、との有難いお達し
  • Xeon Phiで発生していたバグを一つ修正した
    • APIC IDのbit幅の問題。修正漏れがあった
    • invalidなCPU番号で落ちる問題が残っているものの、一応動かせるようにはなった
  •  キーボードが認識しない件。もしやと思ってPS/2接続のキーボードを持ってきたらすんなり動いた
    • コード修正は0行。かなり見当違いの作業をしていた事になる
    • 結論。ACPICAによる初期化が行われていない時はUSB接続のキーボードはLegacy emulationを行ってくれる。
    • しかし、ACPICAによる初期化が行われると、USB接続のキーボードはUSB HIDとしてしか扱えなくなる(たぶん)ので、最初からPS/2キーボード繋ぎますか?USBドライバ書きますか?というお話。
    • ところで、以前はACPI初期化しててもキーボードが反応したような気がするのだけど、気のせい?
      • その頃のコミットを片っ端からcheckoutして試すも、動かず。もしかしたら裏でACPIを切ってたのかもしれない
    • 手持ちのノートPCだとACPI初期化後もキーボードが使えるのだけど、まさか内部接続はPS/2?
    • PS/2キーボードを探すのに苦労した。僕が初めてPCを自作した時(10年くらい前)は、むしろUSB接続のキーボードを所持していなかったのになぁ(もちろん、当時はUSB接続のキーボードは一般に流通してはいたのだけど、安いからといって買ったためか、PS/2だった)
      • 今時PS/2キーボードなんて売ってるのかと思ったら意外と売ってた。驚き
      • 昔は部室に腐る程USB->PS/2変換器があったもので、大学に入ってからも時々見掛けたものだけど、今所属している研究室が今年できたため、そんなものは転がってなかった
        • 結局いろんな所を探しても変換器は見つからずじまい

11/1

  • キーボードが反応しない問題を調査中
    • 大事なことなので何度も書くけども、昔は動いたんだ。ACPI初期化した状態で。
    • で、FADTの”IA-PC Boot Architecture Flags”の8042フラグを調べてみると、立ってない。うそーん
      • 以前どうだったかは分からない
      • QEMUでフラグが立ってないのは、バージョンが古いかららしい→OSDev.org
    • あれこれ言っていても埒が明かないので、ACPI経由でキーボード情報を取得してみる事にする。
      • PNP0303というHIDで取得できるっぽいのだけど、その定義がACPI仕様書からは見つからない
      • あった
      • _STAを表示すると0→死んでる
        • QEMUだと15
        • msdn曰く、_SRSで有効化できるらしい(逆に無効化は_DIS)
          • まさかMicrosoft様の情報が役立つときが来るとは
            • HIDリストをホストしてるのもMSだけど
          • AcpiSetCurrentResourcesで有効化しようとするものの、エラーが返ってくる
            • そもそも、AcpiGetHandle(METHOD_NAME__SRS)がエラーになる
              • 後から考えてみれば、確かにdsdt.dsl内に_SRSエントリが無かった
            • どうしろと
  • Raph_Libraryをマージした
    • バイバイsubmodule
  • twitterから流れてきたのだけど、libstand良さそう
  • 何時もDSDTの出力方法を忘れるので、メモ
    • 出力はdsdt.dsl

# apt-get install acpica-tools

# acpidump > dump

$ acpixtract dump

$ iasl -d dsdt.dat

広告