使用程序集優化 __mm_add_epi32_inplace_purego
此問題旨在優化 __mm_add_epi32_inplace_purego 函數的內部循環,該函數對位元組數組執行位置填充計數。目標是透過利用彙編指令來提高效能。
內部循環的原始Go 實作:
__mm_add_epi32_inplace_purego(&counts[i], expand)
The使用「&counts[i]」傳遞陣列元素的位址可能效率低。為了優化這一點,我們可以將指標傳遞給整個陣列:
__mm_add_epi32_inplace_inplace_purego(counts, expand)
此修改減少了與將陣列作為參數傳遞相關的開銷。
此外,內部循環可以使用組譯指令進一步最佳化。以下彙編程式碼是 __mm_add_epi32_inplace_purego 在彙編中實現的版本:
// func __mm_add_epi32_inplace_asm(counts *[8]int32, expand *[8]int32) TEXT ·__mm_add_epi32_inplace_asm(SB),NOSPLIT,$0-16 MOVQ counts 0(FP), DI MOVQ expand 8(FP), SI MOVL 8*0(DI), AX // load counts[0] ADDL 8*0(SI), AX // add expand[0] MOVL AX, 8*0(DI) // store result in counts[0] MOVL 8*1(DI), AX // load counts[1] ADDL 8*1(SI), AX // add expand[1] MOVL AX, 8*1(DI) // store result in counts[1] MOVL 8*2(DI), AX // load counts[2] ADDL 8*2(SI), AX // add expand[2] MOVL AX, 8*2(DI) // store result in counts[2] MOVL 8*3(DI), AX // load counts[3] ADDL 8*3(SI), AX // add expand[3] MOVL AX, 8*3(DI) // store result in counts[3] MOVL 8*4(DI), AX // load counts[4] ADDL 8*4(SI), AX // add expand[4] MOVL AX, 8*4(DI) // store result in counts[4] MOVL 8*5(DI), AX // load counts[5] ADDL 8*5(SI), AX // add expand[5] MOVL AX, 8*5(DI) // store result in counts[5] MOVL 8*6(DI), AX // load counts[6] ADDL 8*6(SI), AX // add expand[6] MOVL AX, 8*6(DI) // store result in counts[6] MOVL 8*7(DI), AX // load counts[7] ADDL 8*7(SI), AX // add expand[7] MOVL AX, 8*7(DI) // store result in counts[7] RET
此組譯程式碼將「counts」和「expand」的元素載入到暫存器中,執行加法,並將結果儲存回「counts」。透過避免將陣列作為參數傳遞並使用高效的彙編指令,此程式碼顯著提高了內部循環的效能。
總而言之,透過將指標傳遞給陣列而不是元素的位址透過在彙編中實現內部循環,可以最佳化 __mm_add_epi32_inplace_purego 函數,以提高位置總體計數操作的效能。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3