contributed by <hsiehong
>
進階電腦系統理論與實作
FP32 to BF16 轉換程式
測試程式
BB1
= 0xff800000
BB2
= 0xffff0000
轉換前會先確認 floating point 是否是 NaN
, 0
, 或 infinity
,是的話就直接回傳,exp
跟 man
分別就是在讀取 exponent part
跟 fraction part
的資訊,由於 BF16 與 FP32 對於 Nan
(exponent 全 1,fraction 全 0), Infinity
(exponent 全 1,fraction 非 0),0
的判斷條件都一樣,所以可以直接回傳
若是 Normalized Number,可以直接捨棄 FP32 的後 16 bits,
reference
CCC = c1 < c2
log_2
代表取幾次 log
會等於 0,用意是在計算需要考慮幾個 bits,因為題目有說到 n 個數的範圍都介在 0 ~ n-1,這些數都能用 log_2 個 bits 來表示num | b1 | b0 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
sum | 2 | 2 |
num | b1 | b0 |
---|---|---|
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
2 | 1 | 0 |
sum | 3 | 2 |
c1
, c2
就是分別在統計基準點跟重複陣列在每個 bit 出現 1 的次數,若 > 基準點就表示重複的數在這個 bit 也是 1,裡面的迴圈就是在實做這個部份,而外面的迴圈是在將每個 bit 跑過一遍check[]
,其中 check[i]
代表 i
是否有出現過,若前面出現過就直接回傳 i
執行結果
low
, high
, mid
來尋找重複出現的數字,初始定 low
= 1, high
= n - 1, mid
= (low
+ high
) / 2,每一輪利用 mid
當作標竿,mid
是 array 的 index,利用變數 count
統計陣列中 <= mid
的數字有幾個,每一輪統計完若 count
> mid
,根據鴿籠原理可以確認重複的數是落在小於 mid
這個區間的,此時再把搜索範圍改成 [1, mid],反之亦然,下面舉例:low
= 1, high
= 8, mid
= 4,第一輪計算 <= 4 的 element 個數,發現 count
= 6,<= 4 的數範圍只可能是 [1,4],確有 6 個數,代表重複的數必定在這個區間並將搜索區間更改,直到 low
>= hign
為止,low
即為所求1 ~ n - 1
,n
是 array size,再透過 array 的 index
來當作一個 flag
來尋找重複的數index | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
num | 1 | 7 | 5 | 6 | 4 | 2 | 3 | 3 | 3 |
執行結果