Intel 工程師 Noah Goldstein 優化了 glibc 函式庫中的 memset() 函式。此優化使 Skylake-X 和 Ice Lake 架構處理器的桌面版本效能提升約 7.5%。對於伺服器版本,效能增益略低,主要是由於單核心整體效能較低。
memset() 函數的先前實作使用了rep stosb 彙編指令。直到最近,由於處理器內的零過零寫回最佳化,該指令的運作速度相當快。然而,在此優化中發現了一個潛在漏洞,可能導致側通道攻擊。結果,零過零寫回優化被取消,從而導致rep stosb的性能惡化。新版的memset()仍然使用rep stosb指令,但是條件更加嚴格。
具體改變了什麼可以透過更改程式碼中的以下註解來了解,該註解描述了 memset() 的實作細節
以前版本的描述:
/* memset 實作為: 1. 使用重疊儲存來避免分支。 2. 如果大小小於 VEC,則使用整數暫存器儲存。 3. 如果大小從 VEC_SIZE 到 2 * VEC_SIZE,則使用 2 個 VEC 儲存。 4. 如果大小從 2 * VEC_SIZE 到 4 * VEC_SIZE,則使用 4 個 VEC 儲存。 5. 在機器 ERMS 功能上,如果大小大於或等於 __x86_rep_stosb_threshold,則將使用 REP STOSB。 6. 如果大小大於 4 * VEC_SIZE,則將 4 * VEC_SIZE 與 4 個 VEC 儲存對齊,並一次儲存 4 * VEC,直到完成。 */
新版本的描述:
/* memset 實作為: 1. 使用重疊儲存來避免分支。 2. 如果大小小於 VEC,則使用整數暫存器儲存。 3. 如果大小從 VEC_SIZE 到 2 * VEC_SIZE,則使用 2 個 VEC 儲存。 4. 如果大小從 2 * VEC_SIZE 到 4 * VEC_SIZE,則使用 4 個 VEC 儲存。 5. 如果大小大於 4 * VEC_SIZE,則將 1 * VEC_SIZE 與 4 個 VEC 儲存對齊,並一次儲存 4 * VEC,直到完成。 6. 在機器 ERMS 功能上,如果大小範圍為 [__x86_rep_stosb_threshold, __x86_memset_non_temporal_threshold),則會使用 REP STOSB。 7. 如果 size >= __x86_memset_non_temporal_threshold,則使用非暫存。 */
來源: linux.org.ru
