📦 Out of Context リポジトリ

リポジトリ / emssr / independent_common_compiler

r2
r2 emssr1
# target と実行台
r2 emssr2
r2 emssr3
[← Index](../Index.md)
r2 emssr4
r2 emssr5
## 1. build family
r2 emssr6
r2 emssr7
$$
r2 emssr8
\mathscr B(P)=\bigl\{(T,\ \operatorname{Compile}_T(P))\ \bigm|\ T\in\mathcal T\bigr\}
r2 emssr9
$$
r2 emssr10
r2 emssr11
**定理 33.1** $\mathcal T$ の増減は $\operatorname{Sem}(P)$ を変えない。
r2 emssr12
r2 emssr13
core は target 名を知らない。build の結果は一つの組で返る。
r2 emssr14
r2 emssr15
$$
r2 emssr16
\mathrm{Built}_T=\bigl(\text{name}(T),\ X_T,\ \llbracket X_T\rrbracket_T,\ \{R_i\}\bigr)
r2 emssr17
$$
r2 emssr18
r2 emssr19
第一成分は package が持つ data であり、core の型には現れない。
r2 emssr20
r2 emssr21
---
r2 emssr22
r2 emssr23
## 2. 登録済みの target
r2 emssr24
r2 emssr25
| target 名 | 章 | 実行台 |
r2 emssr26
|---|---|---|
r2 emssr27
| `riscv64` | 06 | QEMU virt |
r2 emssr28
| `arm64` | 05 | QEMU virt + semihosting |
r2 emssr29
| `x86_64` | 04 | QEMU pc + multiboot |
r2 emssr30
| `x86_64-hosted` | 18 | `common_host`(彩色した覆い) |
r2 emssr31
| `x86_64-hosted-w` | 18、19 §6 | `common_host`(語割付けの覆い) |
r2 emssr32
| `gfx1200` | 08 | package 内蔵 simulator |
r2 emssr33
| `sm_120` | 09 | package 内蔵 simulator |
r2 emssr34
| `lane64` | 20 | `Python_vCPU/vcpu.py` |
r2 emssr35
r2 emssr36
```bash
r2 emssr37
common <src> -t <target> -o <image>
r2 emssr38
```
r2 emssr39
r2 emssr40
`-t` を省くと登録済みの全 target で build して結果を並べる。
r2 emssr41
r2 emssr42
---
r2 emssr43
r2 emssr44
## 3. compile の段
r2 emssr45
r2 emssr46
$$
r2 emssr47
\operatorname{Compile}_{T,\mu}
r2 emssr48
=\operatorname{Pack}_T\circ\operatorname{Link}_T\circ\operatorname{Encode}_A
r2 emssr49
\circ\operatorname{Schedule}_A\circ\operatorname{Allocate}_A\circ\operatorname{Cover}_{A,\mu}
r2 emssr50
\circ\operatorname{Refine}_{T,\mu}\circ\operatorname{CNF}_\infty\circ\operatorname{Parse}
r2 emssr51
$$
r2 emssr52
r2 emssr53
$\operatorname{Parse}$ から $\operatorname{Refine}$ までが target 非依存の core になり、
r2 emssr54
$\operatorname{Cover}$ 以降が architecture package に属する(定理 52.1)。
r2 emssr55
r2 emssr56
---
r2 emssr57
r2 emssr58
## 4. lane64
r2 emssr59
r2 emssr60
実行位相を state の第一成分に置く(20 章)。
r2 emssr61
r2 emssr62
$$
r2 emssr63
T=c_{\mathrm{dis}}B+\sum_i\beta_i\nu_i
r2 emssr64
$$
r2 emssr65
r2 emssr66
| | x86-64 | lane64 |
r2 emssr67
|---|---|---|
r2 emssr68
| scalar register | 持つ | lane へ複製する |
r2 emssr69
| 箱あたりの byte | 最大 33 | 112 |
r2 emssr70
| 覆いの倍数 | 128 | 288 |
r2 emssr71
r2 emssr72
`vcpu.py` は三つの道を持つ。
r2 emssr73
r2 emssr74
| 道 | 何をするか |
r2 emssr75
|---|---|
r2 emssr76
| 翻訳器(既定) | image を Python の文へ落とす |
r2 emssr77
| `--interp` | 式 (2.1) の mask 付き意味をそのまま解釈する |
r2 emssr78
| `--cupy` | 語も述語も bit のまま GPU で走らせる |
r2 emssr79
r2 emssr80
GPU の道は語を bit 平面で持つ。
r2 emssr81
r2 emssr82
$$
r2 emssr83
V\in\mathbb B^{NB\times W},
r2 emssr84
\qquad
r2 emssr85
m\in\mathbb B^{W}
r2 emssr86
$$
r2 emssr87
r2 emssr88
lane の bit がそのまま述語 mask になるので、選択が `(new & m) | (old & ~m)` の一行になる。
r2 emssr89
加算は Kogge-Stone で $\log NB$ 段に畳み、乗算は carry-save で潰す。
r2 emssr90
r2 emssr91
語の幅 $NB$ は引数になる(既定 32)。lane64 の語は $\mathbb Z$ なので、
r2 emssr92
$NB$ bit を越えた時点で core 意味論と離れる。越えたら桁上がりを見て報告する。
r2 emssr93
r2 emssr94
```bash
r2 emssr95
python vcpu.py <image> --words 4096 --dump 1 --cupy --bits 32
r2 emssr96
```
r2 emssr97
r2 emssr98
---
r2 emssr99
r2 emssr100
## 5. 三つの道の一致
r2 emssr101
r2 emssr102
`Check.ps1 -Cupy` が corpus の全部で三つを突き合わせる。
r2 emssr103
r2 emssr104
$$
r2 emssr105
\llbracket X\rrbracket_{\text{翻訳器}}
r2 emssr106
=\llbracket X\rrbracket_{\text{解釈器}}
r2 emssr107
=\llbracket X\rrbracket_{\mathrm{GPU}}
r2 emssr108
=\llbracket\operatorname{Desc}(\texttt{.cmn})\rrbracket_C
r2 emssr109
$$
r2 emssr110
r2 emssr111
## 参照
r2 emssr112
r2 emssr113
- [01_build](01_build.md) compile して走らせる
r2 emssr114
- `docs/common-compiler/arch/20_lane64_package.md` lane64 の仕様