アセンブリを使用した __mm_add_epi32_inplace_purego の最適化
この質問は、バイト配列に対して位置ポピュレーション カウントを実行する __mm_add_epi32_inplace_purego 関数の内部ループを最適化することを目的としています。目標は、アセンブリ命令を利用してパフォーマンスを向上させることです。
内部ループの元の Go 実装:
__mm_add_epi32_inplace_purego(&counts[i], expand)
'&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,-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' の要素をレジスタにロードし、加算を実行し、結果を ' に格納します。数えます」。配列を引数として渡す必要を回避し、効率的なアセンブリ命令を使用することにより、このコードは内部ループのパフォーマンスを大幅に向上させます。
要約すると、要素のアドレスの代わりに配列へのポインターを渡すことにより、また、アセンブリに内部ループを実装することで、__mm_add_epi32_inplace_purego 関数を最適化して、位置人口カウント操作のパフォーマンスを向上させることができます。
以上が位置人口カウント操作のパフォーマンスを向上させるために、アセンブリ命令を使用して __mm_add_epi32_inplace_purego 関数を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。