新入社員でもなんでもないけど参加してきた。 個人的には、計算機科学は勉強したことなかったので、全然知らない考え方も多く、いい取っ掛かりを得られた、大変参考になる勉強会だった。
ハードウェアについて
コンピュータの5大要素
- 入力・記憶・演算・制御・出力
- 寸劇www
ノイマン型コンピュータ
- 昔からこの基本構造は変わっていない。
仕事の中でのハードウェア
ボトルネック調査
- CPU
- memory
- Disk IO(補助記憶)
効率の良いアーキテクチャ
- ハードウェアをよく知る
効率がいい、とは?
- アーキテクチャから見て効率がいい
- コンピュータのきもちを知ること。
- どのように動いているのか?
CPU の話
Control Unit + 演算装置 = CPU
5大要素とあわせて
- Processer
- Program
- Data
CPU
- Address Busで指定した場所に、Data Busカラデータが流れる。
CPUの4つの原則
- 時間軸に合わせて4つの仕事をする
- Fetch
- Decode
- Execute
- Write back
- 時間軸に合わせて4つの仕事をする
Fetch
- 主記憶からのデータの取り出し
Decode
- 回路で実行できる内容に変換
Execute
- その内容を下に、回路上で実行
Write back (or store)
- 結果を戻す
- 原則に含まれないこともある。
これらがCPU Clockにあわせて動作している。
CPU Clock
- 水晶(クリスタル)に電圧をかけると、一定周期のOn/Offの波形が出てくる。
- このクロックに合わせて命令を実行する。
- 市場に出ているCPUの中では、最速は5.2GHz
高速化の方法
- Pipeline
- GPUのような計算し続けるものには効果が高い。
- プログラムの動きによっては、パイプラインの途中で無駄が発生してしまって、効果が少ない。
- Super Scalar
- いっぺんに計算してしまえ!というもの
- Out of Order
- 遅い処理(memoryからの読み込み)などは他の命令と並行してやってしまってもいいよね、というやり方。
- Pipeline
CISC vs RISC
- CISC - いろんな命令セットを回路で実装する考え方
- でも、実は利用頻度の高い命令は限られていた。
- RISC - 利用頻度の高い命令セットのみで、プログラム側でそれを組み合わせて使う考え方。
- 今は、CPUの中で命令セットはCISCで飛ばして、内部は実はRISCの組み合わせをしている、という実装がほとんど。
- CISC - いろんな命令セットを回路で実装する考え方
Peak CPU Clocks
- クロックを上げていくのは、とてもコストがかかるようになってきたので、コア数増やす方向に進んでる。
で、ぶっちゃけどう動いてるの?
Z80 CPU
- 今日はコレで考える。
bit width?
- レジスタやバスの幅で決まることが殆ど
マシン語
- を学びたいが。。。つらいのでw
アセンブラ
register vs memory
- CPUで実行する際には、memoryから一旦registerに持ってきて実行している。
- コレをどう使うか?がアセンブラの醍醐味
- Z80のレジスタは8bit。場合によって2つ合わせて16bitの命令セットとして扱うこともある。
Endian
- big endian - 順番通りにレジスタに入る。ABCD -> ABCD
- little endian - 順番がひっくり返る。 ABCD -> CDAB
Accumulator
- 何かを計算するときはここを使うレジスタ
Status (flag) Register
- 計算した結果や特定の命令セットの結果が反映されるflagがあるレジスタ
どんな命令セットがあるか。
- 5 functions
- Data transfer
- Data Processing
- Z80は足し算とshift rotateぐらいしかない
- Test and Jump
- Input / Output
- Control
- 制御コード
1単位時間あたりに実行されているのは、これらの命令のどれか。
引き算はどうするか
- 2の補数をとって負の数との足し算をしていた。
ニーモニックとオペランド
まとめ
- アセンブラ
- 英語大事
I/O入門
I/Oとは
- コンピュータで必ずしも必要ではないパート
- なしでも計算はできる
- とはいえ、ないと使えたものではない。
I/Oの基本
- IA-32の入出力
- I/Oポート
- 割り込み
- DMA
- メモリマップドI/O
- IA-32の入出力
IOポート
- 最も単純な入出力
- このportに対して何かデータを送れば、(なんだかはわからないけど)その先のデバイスに送られる。
- 逆に読み出しをするときはポートを読む
- 基本的には8bitでのアクセス単位
- キーボードなど。
割り込み
- 外から何らかの理由で入ってくる、作業を中断させる通知
- キーボードを押した瞬間などに反応するときは、割り込みで発生させている。
I/Oがどう使われるのか?
- 入力装置が付いているのはわかった。どう使うか?
- 話が変態的すぎて。。。
その他のI/O
- メモリマップドI/O
- CPUの物理メモリ空間に、デバイスのメモリ空間をマッピング
- CPUから直接デバイスのメモリ空間にデータを送れる。
- CPUの物理メモリ空間に、デバイスのメモリ空間をマッピング
- DMA
- プロセッサがDMAコントローラに対して要求し、データ転送をそちらに任せることができる。
- データ転送の時間中にCPUが処理時間を食われることがない。
IRQ
- 割り込みを送るための線
- しかし物理線は15本しかない。
- 同じ線で複数のデバイスが割り込みを入れたりする。
- CPU側では、どのデバイスが割り込みしてきたかわからない。。。
- デバイスドライバ側で、ISRレジスタというところに「どのデバイスが割り込んだか」の情報を記録して、それで判断する。
Busとは
- 内部バス
- 周辺回路
- 拡張バス
PCIバス
- 32bit,周波数33MHz, 帯域幅133MHz
- パラレル転送
- plag and play対応だったが、活線挿抜できたわけではなかった。
- PCI-X
- 周波数33MHz, 帯域幅1.06GHzに拡張
- 上位互換、だがよく物理干渉して刺せなかったりした。
- PCI Express
- シリアル転送、複数レーンを束ねて転送可能に
- 1レーンあたり 250MB/s (1.25GHzで、1クロックあたり2bit転送してる)
- 4レーン 1GB/s , 16レーンで4GB/s
- 仕様上は最大32レーン
- 活線挿抜に対応
PCI Express 2.0
- クロックを2倍(1.25GHz -> 2.5GHz)にして、レーンごとの転送速度も500MB/sに。
- MSIサポートが必須に。
MSI
- そもそもIRQ使わなくていいじゃん、と気づいた。
- IRQを使わないで、メモリ書き込みによって割り込みを通知する。
- ニセのメモリ書き込みをして、CPUに割り込みと認識させる。
- CPUがいちいちISRを見なくていい。
- 仮想化環境では、world changeの問題が発生するため、IRQでの割り込みはすごく効率が悪い。
- コレが解消できるので、仮想環境としてはすごくいい。
CPUのインターコネクト
- NUMA(非対称)とUMA(対象)
- 今はほぼUMA
- NUMAだと、メモリはどちらかのCPUに依存してる
- 下手にマルチプロセッサで使うと、1プロセッサより遅い。。。ということが発生しうる。
- NUMA(非対称)とUMA(対象)
QPIとHyperTransport
- Quick Path Interconnect
- 下手にチューニングなしだと遅くなるかも。。という点は気をつけておく。
まとめ
- I/Oは必須ではないが、ないと使えないもの。
IOを勉強するには
- ArduinoとかPICでやると、勉強しやすい。
- PIC USBマイコンボードなど。
- もっとガチな人にはBeagleBoard
- Linux Boxを手作りで作ろう。。。なんてときに。
インターフェース入門
インターフェースとは
- 2つのものの間にたって、情報をやりとりするもの。
ハードウェアインターフェース
- 音響カプラ
- X.21企画
- RS-232C
- 俗に言う「シリアル端子」
- 25 pin
- 9pinもあるが、同期通信できない。
- DB-60(HD60)
- Cisco独自規格
- 端子数が上がった
- 通信速度は上がった
- でも、データの通信並列数は1
- シリアル通信
端子数が多いわけ
- 直接データを送受信しない端子
- 同じデータを流す端子
- 使ってないものも。
- なぜ多い?信頼性の工場のため。
- ある程度やると、性能頭打ち。
動作周波数
- 33MHz
- 1cycle = 0.03 nano sec
- SDR
- Single Data Rate
- 1cycleあたり1bitのデータ転送
- 1周期のup /down を1bitと見る
DDR
- Double Data Rate
- 1cycleの周期up downを別々のサイクルと見て、1cycle 2bitのデータを送る。
なぜ性能が頭打ちになるか?
- 費用対効果
- 主に、半導体性能がネックだった。
パラレル通信
- データを同時送受信する。
- IEEE 1284
- RS-232Cと端子は同じ
- 同時送受信 8bit
- SCSI
- 50pin
- 同時送受信 8bit
- ATA
- 40pin
- 16bit
- Ultra SCSI 320
- 2.56Gbps
しかし、世界はパラレルからシリアルへ。
- なぜ。。?
- パラレルじゃダメだから戻ってきた。
- 半導体性能のUP
- 動作性能UP
- スキュー発生率UP
スキューとは
- クロック同期型の回路において、異なるタイミングでデータ転送が行われてしまうこと。
- コレを回避するためには、基板設計を考え直す必要がある。
- ミクロン単位で配線を設計する必要がある。。
今流行の端子
- USB
- 端子数 4 - 9
- シリアル通信
- IEEE 1394
- FireWire
- 端子数4 -9
- シリアル通信
- S-ATA
- 端子数7
- シリアル通信
- SAS
- Serial Attached SCSI
- 端子数7
- シリアル通信
- Thunderbolt
- 20pin
- 非同期パラレル通信
- 内部的にはPCI Express
- InfiniBand
- 4 - 48
- シリアル通信 (1X)
- 非同期パラレル(2X - 12X) レーンのような考え方。
- 最近のはやりは非同期パラレル
- 同期しないのでスキューは発生しない。
- USB
今日のまとめ
- ハードウェアは、インフラエンジニアにとって結構重要
- アーキテクチャ
- 基本構造は昔から一緒
- コンピュータの気持ちになろう。
- CPU
- 動作原理を知っておこう。
- バス
- データ転送をよく知っておくと、よりコンピュータを理解できる。
インターフェース
気になったらどんどん自分で調べよう!