---
# System prepended metadata

title: 台大 105 硬體
tags: [NTU, 硬體, '105']

---

# 台大 105 硬體
###### tags: `NTU` `105` `硬體`
1.
(a) 請搜尋: GPGPU
(b) supercomputer
\(c\) $\frac{8}{250}$
(d) 大部份的人並不需要可以在一秒內處理 2800 張影像的超級電腦
(e) 同層的節點運算是獨立的，GPU 強大的 SIMD 運算能力很適合這種場景
(f) Data fetch => input layer => hidden layer 1 => hidden layer 2 => hidden layer 3 => output layer => write data
(g) throughput up, latency up
(h) yes, TPU 就是一個例子
好處: 可以針對需求研發，徹底榨出所有性能
壞處: 彈性不夠大，需求改變時得砍掉重練; 成本太高
(i) 每個節點都得傳到另外 $\frac{N}{2}$ 個節點，所需傳輸量為 $\frac{N^2}{2}$
(j) $\frac{10A}{5A + 12.8QN}$
:::info
假設浮點數大小為 4 bytes。
5N 個點分配到 Q 個處理器上，每個點需要 A ns，總共為 $\frac{5AN}{Q}$
5N 個點分配到 2Q 個處理器上，總共為 $\frac{5AN}{2Q}$
傳輸時間需要 $\frac{N^2}{2}\times 32(bits)\div 10(Gbps)$ ns，因為總共有五層，所以要傳四次
speed up: $\frac{10A}{5A + 12.8QN}$
:::
(k) $\frac{5A}{12.8QN}$
:::info
P 台電腦，傳輸時間需要 $\frac{(P-1)N^2}{P}\times 32\times 4\div 10 = 12.8N^2$ ns
:::
(l)
- small: 用 GPU 就可以了
- medium: 用 PX2，或是 FPGA
- large: 用複數台 PX2、FPGA，或是客製化晶片
2. 
(a) yes
:::info
以下考慮最壞的情況
read: 讀取 invalidate queue，發現資料已經被別的 CPU 修改 -> 讀取記憶體 -> page fault -> 執行 LRU 找出該被淘汰的 block -> 放進去
write: 發送 invalidate message -> 寫進 cache / 記憶體
:::
(b) no
:::info
假設題目的意思是有某個變數被某個 CPU 寫入，然後被另外一個 CPU 讀取，這樣來回交替。接著再存取同個 block 的其它資料。

如果是這樣的話，因為兩邊都有最新的資料，所以不會發生 false sharing
:::
\(c\) NO
:::info
ABI 是二進位介面，是二進位檔與機器互動的介面，參考: [ABI](https://en.wikipedia.org/wiki/Application_binary_interface)
:::
(d) NO, 都是 API
(e) NO, JVM 是為了讓 APP 不用針對每種裝置重新編譯，而不是作業系統本身

3. 先搞清楚每種 request 的意義
    - local read: 讀取自己的 cache
    - remote read: 別的 CPU 來要資料
    - local write: 寫自己的 cache
    - remote write: 別的 CPU 來要資料，要回去後寫入

|  | Invalidate |Shared  |Exclusive  |
|- |:---------- |:------ |:--------- |
|**local read**|Shared|Shared|Exclusive|
|**remote read**|Invalidate|Shared|Shared|
|**local write**|Exclusive|Exclusive|Exclusive|
|**remote write**|Invalidate|Invalidate|Invalidate|

false sharing 可藉由把兩個變數隔開來避免，假設 block size 為 16 bytes:
```c=
struct {
    int a;
    char padding[12];
    int b;
}
```
這樣就可以確保 a 跟 b 不會在同個 block
4. (a) YES (b) YES
5. 連線到一半突然斷線、伺服器與本地裝置時間不一致等等...
6.
(a) Buffered / Unbuffered  I/O: 將 I/O 資料 暫存/不存 在 user space 裡 | Buffered I/O 只需一次 copy，Unbuffered I/O 需要多次 copy
(b) 
i. random access 應該會比較好...
ii. [這裡](https://medium.com/@clu1022/%E6%B7%BA%E8%AB%87i-o-model-32da09c619e6)寫得很清楚
7. 當 request 太多時 thread 會不夠用
8. 
```c=
// 將 semaphore 加一，並隨機喚醒一個 process
signal(semaphore *);
// 將 semaphore 減一，如果小於零就 sleep
wait(semaphore *);

typedef struct {
    semaphore mutex(1);
    int count;
    semaphore wait(0);
} barrier;

void barrier_wait(barrier *b, int n) {
    wait(&b->mutex);
    b->count++;
    signal(&b->mutex);
    if (b->count < n) {
        wait(&b->wait);
    }
    signal(&b->wait);
}
```
(b) prority-based scheduling / 用一個 table 記錄每個 friend 對每個檔案的存取優先權
9. 跟 8(b) 一樣的方法...隨便啦
