この記事はOUCC Advent Calender 9日目の記事です.
はじめまして,ネムレスと申します.
これを機会にTwitterアカウントを設立しました.
一応,OUCC所属なのでなにか書こうかなーと思い登録しましたが
特にネタがないので,適当な事書いてお茶を濁します.ごめんなさい.
CPUアーキテクチャ
なんか目の前にいくつかの種類のアーキテクチャのプロセッサが転がってたのでこれについて書きます.
CPUのアーキテクチャとはどのようなものか聞かれて答えられますか?
主に次のような事項が上げられます.
- 命令アーキテクチャ
- デコードパイプライン
- 演算アーキテクチャ
- キャッシュ
- データパス
- レジスタ
- etc...
命令アーキテクチャ
CPUの機械語がどういう機械語かという事です.
これはCPUの演算器(ALU)だとか,レジスタとか,そういったものがどういうデータパスで接続されて,どういう指示を与えてメモリから実行していくかに大きく依存します.
皆さんが使ってるIntelのx86_64アーキテクチャ以外に様々な物があります.
- Itanium64
- SPARC
- ARM,AArch64
- MIPS
- PowerPC,POWER
- AVR32
- SH
- Alpha
- S390
- MC68000
- etc etc
思い付くものを上げてみましたが色々あります.
x86_64はIntelとAMDが主に作ってますが,VIAとかも作っています.
他にもSPARCは元はSunが作っていましたが今はFujitsuがHPCで良く使ってたり,ARMはスマートフォン向け等で近年多くの企業が製造していますね.
命令アーキテクチャを新たに作らず,既存の物と互換のある設計にしたりして複数の企業がその命令セットを採用するということは,既にコンパイルしたバイナリが動作したりするといったソフトウェア資産の面で大きなメリットがあります.
しかし,命令セットが同じだとしても中身はまったく高性能化したり複雑化して別物であったりします.IntelのCPUはi8086以来命令セットは後方互換を持ちつづけていますが,ご存知の通りまるで中身はベツモノです.
デコードパイプライン
命令アーキテクチャが決まると,その機械語をデコードしてCPUの各モジュールをオンにしたりオフにしたりメモリを読み込むといった具体的な動作をさせる信号を流します.そのためのデコードというのは実は重要な部分で,命令が高性能かつ高機能になればなるほどデコードは複雑になってしまうというトレードオフになります.
デコードを単純にして多くの命令を沢山実行させるのがRISC,ひとつひとつの命令を高機能にして高速化を図るかわりにデコードが複雑で並列実行が苦手なのがCISC,と伝統的に区別されてきました.
RISCはMIPS,ARM,PowerPCなど
CISCはx86_64,MC68000などがそうです.
デコードが複雑だと電力消費が増えるとかどうしても1命令を高機能に複雑にしていく方向は限界があると言われていましたが,
スーパースカラを取り入れベクトル命令を取り入れとRISC化してきたx86_64に対し,
どうみても複雑な命令をどんどんん取り入れたりThumb2命令とARM命令で命令長が異なりRISCは固定長命令では……となってしまうARMがいたり,互いに互いの良いところを吸収する形で発展しており両者の違いは曖昧になっています.
演算アーキテクチャ,キャッシュ,レジスタ
演算器はCPUのコアとなります.
昔は浮動小数点数演算ユニット(FPU)のみ別売りのコプロセッサとして販売されたりして,PC-98時代などはi286とかにそれを付けて高性能化!等としていましたが,今やスーパーコンピュータで使われていたベクトル命令すら取り入れられています.
演算ユニットを何個,どこに配置するか,またはどんな方法で設計された回路を使うか,様々な考えがあります.
また,ALUにレジスタやキャッシュをどう接続するかは考えものです.x86_64のように並列化命令(SIMD)のためのレジスタを追加したりしていると考える事も多いでしょう.
キャッシュも,メモリとCPUの間に設置されますが,どういうデータパスで接続されるのか,どういうメモリをどのくらいの容量で配置するか,様々なトピックがあります.
おわりに
思いついた適当に書きましたがCPUの設計については素人なのでちゃんと理解できてない部分がおおいです.
しかしながら,たまにはこういう部分に目を向けて欲しいな,せめて自分がつかってる端末やマシンのCPUがx86だったりARMだったりのどのアーキテクチャで動いてるのかぐらいは考えてみて欲しいと思ったりしてこの記事書きました.
そんなわけでたまには低レイヤな話でした.