Оптимизация __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