使用程序集优化 __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