1
考慮以下將整數轉換為浮點數的 C 程式:
注意上述有效的 input
範圍僅在 0 到 215 - 1 (請思考為何如此),以下用 bitwse 改寫得到更快的實作:
補上以上程式碼。
作答區
Q1 = ?
(a)
0xff(b)
0x7f(c)
0x3f(d)
0x2f(e)
0x1f(f)
0x0f(g)
0x1Q2 = ?
(a)
fraction | exponent(b)
fraction + exponent(c)
fraction ^ exponent(d)
exponent << 23 | (fraction & 0x7f)(e)
exponent << 23 | (fraction & 0x3f)(f)
exponent << 23 | (fraction & 0x1f)延伸問題: 在 Linux 核心的 RAID 程式碼找到 i2f
的實作並且解說,需要涵蓋 x86_64 加速的 __fls
和相關效能分析
測驗 2
考慮以下 pthread_barrier 的替代實作:
pthread_barrier_
系列函式其實只做而且只能做一件事:將先後到達的多個執行緒擋在同一個 barrier 前,直到所有執行緒到齊,然後撤下 barrier 同時放行。重要操作有:
init
函數: 負責指定要等待的執行緒個數;wait
函數: 由每個執行緒主動呼叫,它通知 barreir 說「我到起跑線前了」。在 wait
執行尾聲,barrier 會檢查是否所有人都到 barrier 前了,若是,barrier 就消失,所有執行緒繼續執行下一行程式碼;如果不是,則所有已到 wait
的執行緒持續等待,剩下沒執行到 wait
的執行緒可繼續執行;destroy
: 釋放 init
申請的資源;補完程式碼。
作答區
B1 = ?
(a)
b->total–(b)
b->total++B2 = ?
(a)
b->total–(b)
b->total++延伸問題: 比較上述 barrier 和內建 pthread_barrier_
的實作效能差異,並且用 atomics 和 futex 改寫