contributed by < Rsysz
>
sysprog
在深度學習中, weights
,gradients
activations
等各種 parameter
皆涉及滿滿的浮點數運算,因此各種加速運算的方法推陳出新,FP16
與 TPU
便是 Google
所設計的加速技巧,能為 model training
帶來以下的好處。
TPU
能大幅加速運算速度parameter
占用空間的大幅下降,16GB的RAM能當32G的用training
過程,使 cycle
的時間縮短,加速模型迭代Google
所做的實驗若只針對 activations
採用 FP16
,將能加速運算且減少對模型準確度的影響。根據BF16wiki兩者的結構如下圖所示
NaN
,INF
,0
等特例先行排除(a) 0x7f800000
取出 Exp
部分,根據 Exp
部分數值 帶入BF32
展開,部分若有值,將會對 Fraction
部分進位(e) 0xffff0000
截斷後方 16
個 Bits ( 至 )首先看到 RINGBUF_DECL
與 RINGBUF_INIT
,宣告了一個 RINGBUF
結構並在 RINGBUF_INIT
內建立輸入 S + 1
大小的陣列,將start
與 end
標記元素 0
接著看到 ringbuf_write
,呼叫了 ringbuf_write_peek
與 ringbuf_write_skip
ringbuf_write_peek
將元素存入 (BUF)->elements[(BUF)->start]
ringbuf_write_skip
則用來判斷 start
與 end
元素位置的更動
但若 S = 2
陣列則為3
,此時寫入 3
因此可以不斷循環寫入,覆蓋先前的資料
(a) 1
, RB2 = (a) 1
考慮到以下靜態初始化的 singly-linked list 實作:
執行結果為:
link list
,首先看到 #define cons(x, y) (struct llist[]){{y, x}}
與 struct llist *list = cons(cons(cons(cons(NULL, A), B), C), D)
這邊偷偷在 define
內調換了 x
, y
的位置,所以 *next = x
, val = y
,所以其實結構是 D->C->B->A->NULL
,因此D = (a) 9
C = (b) 5
B = (c) 4
A = (d) 7
sort
與 sorted_insert
,從執行結果我們可以確定這是一個 increasing order
的 sorting
,!*head || (*head)->val >= node->val
判斷當 sorted
為空或 head
的數值大於當前 node
時,將 node
插入 head
因此SS1 = (d) node->next = *head
SS2 = (b) *head = node
node
大於 head
,則繼續做由小到大的 insertion sort
LeetCode 287. Find the Duplicate Number 給定一個整數序列,其中會有一個數值重複,請找出。
已知條件:
考慮以下程式碼是可能的解法:
log_2 = 8 * sizeof(int) - __builtin_clz(numsSize)
利用 bit
位移逐個 bit
做檢查並利用
c1
紀錄給定的陣列目錄該 bit
有幾個 1
c2
紀錄給定的陣列內的數值該 bit
有幾個 1
bit
為 0
則 c1 >= c2
,若重複的數在該 bit
為 1
則 c1 < c2
所以 CCC = (b) c1 < c2
nums = [3, 1, 3, 2]
num | binary |
---|---|
0 | 000 |
1 | 001 |
2 | 010 |
3 | 011 |
c1 | 022 |
num | binary |
---|---|
3 | 011 |
1 | 001 |
3 | 011 |
2 | 010 |
c2 | 033 |
走訪全數陣列成員後,
透過 bool list[numsSize]
建立一個 Flags arrary
,當重複的數出現時 trigger
,算是比較直觀簡單的做法。