Skip to content

Commit

Permalink
refactor: コンアキの節を整理
Browse files Browse the repository at this point in the history
  • Loading branch information
xhiroga committed Jul 25, 2024
1 parent cc88743 commit 33902a2
Showing 1 changed file with 70 additions and 62 deletions.
132 changes: 70 additions & 62 deletions computer-science/computer-architecture/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,53 @@ WIP

## コンピュータアーキテクチャ

### メモリ (memory)
### プロセッサ

#### CPU

CPUは、ノイマン型コンピュータにおける演算装置と制御装置を担う。CPUの構成要素は次の通り。

- 演算装置
- ALU
- 汎用レジスタ
- フラグレジスタ
- 制御装置
- program counter register (PC)(プログラムカウンタレジスタ): 次に読み込むべきメモリのアドレスを保持する。命令の実行中に書き換えられる。現在の命令にgotoが含まる場合はそちらに、そうでない場合はインクリメントする。
- instruction register (命令レジスタ)
- decoder (デコーダ)

#### パイプライン処理

自動車の製造のような、複数の工程がある作業を考える。処理のスループットを引き上げるとする。1人で全ての組み立てを行う職人の数を増やすのではなく、工程を分けて流れ作業とし、同時に複数台を製造する手法を、パイプライン処理という。コンピュータの処理については、次の工程に分けられる。

1. 命令フェッチ
2. 命令デコード
3. 演算
4. 結果の格納

> [!NOTE]
CPUがメモリをフェッチする、という表現が不思議だったのだが、毎クロックメモリ自体は読んでいて、次のクロックで読みたいアドレスを出力しておく、という言い方ならしっくり来るかも。

1クロック毎に1工程を処理する。異なる命令の各工程を同時に処理しているため、処理が終わった後すぐに次の工程にデータを送ると混乱が生まれる。そこで、各工程の間にレジスタを挟み、これをパイプラインレジスタという。

パイプライン処理のボトルネックは、最も時間のかかる工程である。例えば自動車の製造では、清掃や乾燥を含む塗装工程に最も時間がかかる。

<!-- パイプラインハザード, 構造ハザード, データハザード, 制御ハザード -->

#### 命令レベル並列処理とアウトオブオーダ処理

1プロセッサ内に複数のALUを配置し、命令デコードの工程で命令の依存関係に応じて実行順序を調整する方式をスーパースカラという。それに対して、並列実行すべき命令の組をコンパイラが予め指定する方式に対応したプロセッサをVLIW (very large instruction word)という。VLIWは機械語の工夫で性能を引き上げる反面、プロセッサを改良すると機械語の互換性がなくなるためプログラムを新たにコンパイルする必要があり、下火になった。[^xtech_VLIW]
[^xtech_VLIW]: [VLIW](https://xtech.nikkei.com/atcl/learning/lecture/19/00102/00219/)

ハザードを減らして命令の並列度を上げるために、コンパイラが機械語プログラムを最適化することを静的最適化 (static optimization)という。それに対して、命令をスケジューリングする際に順序を入れ替えることをアウトオブオーダ (out of order)処理といい、逆に入れ替えをしないことをインオーダー (in order)処理という。アウトオブオーダ処理の中でも、命令を演算実行ステージに入れる順番の入れ替えをアウトオブオーダ実行、実行結果をレジスタに格納する順番の入れ替えをアウトオブオーダ完了という。

#### 入出力装置

入出力装置はCPUに対して抽象化されているべきであり、その方法がメモリマップドI/Oである。すべてのデバイスは、CPUから見るとメモリ上の領域に過ぎない。

### 記憶階層

#### メモリ (memory)

記憶装置。ランダムアクセス構造のメモリでは、固定幅のセルが連続して並んでおり、この固定幅のセルを「ワード」「ロケーション」と呼ぶ。

Expand Down Expand Up @@ -231,88 +277,50 @@ WIP
読み書き可能であることは、メモリが主記憶装置である必要条件ではない。言い換えると、読み込み専用の主記憶装置も普通にありえる。
組み込みシステムやBIOS、UEFIファームウェアはROMが主記憶装置の役割を果たしているとみなすことができる。

### CPU

CPUは、ノイマン型コンピュータにおける演算装置と制御装置を担う。CPUの構成要素は次の通り。

- 演算装置
- ALU
- 汎用レジスタ
- フラグレジスタ
- 制御装置
- program counter register (PC)(プログラムカウンタレジスタ): 次に読み込むべきメモリのアドレスを保持する。命令の実行中に書き換えられる。現在の命令にgotoが含まる場合はそちらに、そうでない場合はインクリメントする。
- instruction register (命令レジスタ)
- decoder (デコーダ)

### 入出力装置

入出力装置はCPUに対して抽象化されているべきであり、その方法がメモリマップドI/Oである。すべてのデバイスは、CPUから見るとメモリ上の領域に過ぎない。

### 機械語 (machine language)

コンピュータに物理的操作を行わせるための、0と1からなる語を機械語という。`+`のような演算子 (operator)と演算対象 (オペランド, operand)からなる。

機械語とだいたい1対1で対応する、人間が理解するための言語がアセンブリ言語 (assembly language)である。

#### 命令セット (instruction set)

機械語の集合を命令セットという。CPUのアーキテクチャによって実行可能な命令セットが異なる。例えば`x86系命令セット`, `ARM系命令セット`, `MIPS系命令セット`, `RISC-V系命令セット`等がある。命令セット及びCPUやレジスタ等の実行環境をまとめて命令セットアーキテクチャ (ISA, instruction set architecture)という。

ISAの設計の方向性には、CISC (シスク)とRISC (リスク)がある。CISCが単一の命令で複数の処理を行うなど複雑である一方で、RISCは命令の総数や種類を減らす思想であった。これは、初期のプログラミング環境ではコンパイラが存在せず、機械語やアセンブリ言語で直接プログラミングを行っていたためである。[^wikipedia_RISC]
[^wikipedia_RISC]: [RISC](https://ja.wikipedia.org/wiki/RISC)
#### キャッシュと仮想記憶

2010年頃から設計が始まった比較的新しいISAがRISC-V (リスクファイブ)である。チップベンダーの保有するISAに沿ったCPUを開発するためにはライセンス費用を払う必要があるが、RISC-Vはオープン規格のためその必要がない。
<!-- ページフォールト, TLB -->

> [!NOTE] RISC-Vの開発にあたって、CやPythonなどプログラミング言語のコンパイラは誰が対応したの?
### 並列プロセッサ

### パイプライン処理
コンピュータの処理能力を上げるための手段としては、クロック周波数の引き上げやCPI(命令あたりクロック数, clock cycles per instruction)の改善等が挙げられる。しかし、マイクロプロセッサの冷却能力に限界があることから、クロック周波数を引き上げるような消費電力を増やす手段も同じく限界を迎えている。したがって、プロセッサの性能向上ではハードウェアの並列性の引き上げが行われるであろう。そのようなプロセッサをマルチコア・マイクロプロセッサ、通常は単に省略してマルチコアプロセッサと呼ぶ。マルチコアプロセッサは通常、共有記憶型マルチコアプロセッサ(SMP, Shared Memory Processor)である。

自動車の製造のような、複数の工程がある作業を考える。処理のスループットを引き上げるとする。1人で全ての組み立てを行う職人の数を増やすのではなく、工程を分けて流れ作業とし、同時に複数台を製造する手法を、パイプライン処理という。コンピュータの処理については、次の工程に分けられる。
#### GPU

1. 命令フェッチ
2. 命令デコード
3. 演算
4. 結果の格納

> [!NOTE]
CPUがメモリをフェッチする、という表現が不思議だったのだが、毎クロックメモリ自体は読んでいて、次のクロックで読みたいアドレスを出力しておく、という言い方ならしっくり来るかも。

1クロック毎に1工程を処理する。異なる命令の各工程を同時に処理しているため、処理が終わった後すぐに次の工程にデータを送ると混乱が生まれる。そこで、各工程の間にレジスタを挟み、これをパイプラインレジスタという。
CPUが汎用的な計算を素早く行うのに対して、GPUは並列計算を得意としている。例えばIntel Core i9は24コアを搭載し、各コアが複数のALUを持つ。それに対して、NVIDIA RTX4090は16,384個のCUDA Coreを持つ。

パイプライン処理のボトルネックは、最も時間のかかる工程である。例えば自動車の製造では、清掃や乾燥を含む塗装工程に最も時間がかかる。
#### GPUプログラミング

<!-- パイプラインハザード, 構造ハザード, データハザード, 制御ハザード -->
CPUの世界では命令セットアーキテクチャに沿ったプロセッサの開発が行われているのに対して、GPUのハードウェアでは会社・世代を超えた機械命令の互換性がない。したがって、NVIDIAはPTX (Parallel Thread Execution)という命令セットを公開し、そのレイヤーで互換性を保証している。

### キャッシュと仮想記憶
##### CUDA

<!-- ページフォールト, TLB -->
NVIDIAのGPUプログラミング環境。

### 命令レベル並列処理とアウトオブオーダ処理
##### OpenCL

1プロセッサ内に複数のALUを配置し、命令デコードの工程で命令の依存関係に応じて実行順序を調整する方式をスーパースカラという。それに対して、並列実行すべき命令の組をコンパイラが予め指定する方式に対応したプロセッサをVLIW (very large instruction word)という。VLIWは機械語の工夫で性能を引き上げる反面、プロセッサを改良すると機械語の互換性がなくなるためプログラムを新たにコンパイルする必要があり、下火になった。[^xtech_VLIW]
[^xtech_VLIW]: [VLIW](https://xtech.nikkei.com/atcl/learning/lecture/19/00102/00219/)

ハザードを減らして命令の並列度を上げるために、コンパイラが機械語プログラムを最適化することを静的最適化 (static optimization)という。それに対して、命令をスケジューリングする際に順序を入れ替えることをアウトオブオーダ (out of order)処理といい、逆に入れ替えをしないことをインオーダー (in order)処理という。アウトオブオーダ処理の中でも、命令を演算実行ステージに入れる順番の入れ替えをアウトオブオーダ実行、実行結果をレジスタに格納する順番の入れ替えをアウトオブオーダ完了という。
NVIDIAやAMDなどGPUを問わずに使えるGPUプログラミング環境。

## GPU
##### Metal

CPUが汎用的な計算を素早く行うのに対して、GPUは並列計算を得意としている。例えばIntel Core i9は24コアを搭載し、各コアが複数のALUを持つ。それに対して、NVIDIA RTX4090は16,384個のCUDA Coreを持つ
macOSやiOSなどでサポートされるCG, GPGPUプログラミングのためのAPI。MSL (Metal Shading Language)を用いてプログラミングを行う

### GPUプログラミング
### 機械語 (machine language)

CPUの世界では命令セットアーキテクチャに沿ったプロセッサの開発が行われているのに対して、GPUのハードウェアでは会社・世代を超えた機械命令の互換性がない。したがって、NVIDIAはPTX (Parallel Thread Execution)という命令セットを公開し、そのレイヤーで互換性を保証している
コンピュータに物理的操作を行わせるための、0と1からなる語を機械語という。`+`のような演算子 (operator)と演算対象 (オペランド, operand)からなる

#### CUDA
機械語とだいたい1対1で対応する、人間が理解するための言語がアセンブリ言語 (assembly language)である。

NVIDIAのGPUプログラミング環境。
#### 命令セット (instruction set)

#### OpenCL
機械語の集合を命令セットという。CPUのアーキテクチャによって実行可能な命令セットが異なる。例えば`x86系命令セット`, `ARM系命令セット`, `MIPS系命令セット`, `RISC-V系命令セット`等がある。命令セット及びCPUやレジスタ等の実行環境をまとめて命令セットアーキテクチャ (ISA, instruction set architecture)という。

NVIDIAやAMDなどGPUを問わずに使えるGPUプログラミング環境。
ISAの設計の方向性には、CISC (シスク)とRISC (リスク)がある。CISCが単一の命令で複数の処理を行うなど複雑である一方で、RISCは命令の総数や種類を減らす思想であった。これは、初期のプログラミング環境ではコンパイラが存在せず、機械語やアセンブリ言語で直接プログラミングを行っていたためである。[^wikipedia_RISC]
[^wikipedia_RISC]: [RISC](https://ja.wikipedia.org/wiki/RISC)

#### Metal
2010年頃から設計が始まった比較的新しいISAがRISC-V (リスクファイブ)である。チップベンダーの保有するISAに沿ったCPUを開発するためにはライセンス費用を払う必要があるが、RISC-Vはオープン規格のためその必要がない。

macOSやiOSなどでサポートされるCG, GPGPUプログラミングのためのAPI。MSL (Metal Shading Language)を用いてプログラミングを行う。
> [!NOTE] RISC-Vの開発にあたって、CやPythonなどプログラミング言語のコンパイラは誰が対応したの?
## 未分類

Expand Down

0 comments on commit 33902a2

Please sign in to comment.