如何用C语言AVX2实现int8数组乘int16常量加宽为int32的向量化运算?
AVX2优化实现方案
你可以直接通过AVX2向量指令集完全向量化该32次迭代的循环,无需分支或循环控制,最终实现代码如下:
首先需要引入AVX2对应的头文件:
#include <immintrin.h>
优化后的函数实现:
static void propogate_neuron(const short a, const int8_t *b, int *c) { // 加载32个int8类型的b元素到256位向量寄存器 const __m256i b_raw = _mm256_loadu_si256((const __m256i*)b); // 将32个int8拆分为高低各16个,分别符号扩展为int16类型 const __m256i b_low_16 = _mm256_cvtepi8_epi16(_mm256_castsi256_si128(b_raw)); const __m256i b_high_16 = _mm256_cvtepi8_epi16(_mm256_extracti128_si256(b_raw, 1)); // 将常量a广播为16个重复的int16元素,方便批量运算 const __m256i a_vec = _mm256_set1_epi16(a); // 计算低16个b元素和a的乘积,拆分高低位拼接为int32类型 const __m256i mul_low_lo = _mm256_mullo_epi16(b_low_16, a_vec); const __m256i mul_low_hi = _mm256_mulhi_epi16(b_low_16, a_vec); const __m256i prod_0_7 = _mm256_unpacklo_epi16(mul_low_lo, mul_low_hi); const __m256i prod_8_15 = _mm256_unpackhi_epi16(mul_low_lo, mul_low_hi); // 计算高16个b元素和a的乘积,拆分高低位拼接为int32类型 const __m256i mul_high_lo = _mm256_mullo_epi16(b_high_16, a_vec); const __m256i mul_high_hi = _mm256_mulhi_epi16(b_high_16, a_vec); const __m256i prod_16_23 = _mm256_unpacklo_epi16(mul_high_lo, mul_high_hi); const __m256i prod_24_31 = _mm256_unpackhi_epi16(mul_high_lo, mul_high_hi); // 批量加载c数组的值,累加乘积后写回 __m256i c_vec; c_vec = _mm256_loadu_si256((const __m256i*)&c[0]); c_vec = _mm256_add_epi32(c_vec, prod_0_7); _mm256_storeu_si256((__m256i*)&c[0], c_vec); c_vec = _mm256_loadu_si256((const __m256i*)&c[8]); c_vec = _mm256_add_epi32(c_vec, prod_8_15); _mm256_storeu_si256((__m256i*)&c[8], c_vec); c_vec = _mm256_loadu_si256((const __m256i*)&c[16]); c_vec = _mm256_add_epi32(c_vec, prod_16_23); _mm256_storeu_si256((__m256i*)&c[16], c_vec); c_vec = _mm256_loadu_si256((const __m256i*)&c[24]); c_vec = _mm256_add_epi32(c_vec, prod_24_31); _mm256_storeu_si256((__m256i*)&c[24], c_vec); }
额外优化建议
- 如果你的业务场景可以保证输入数组
b、输出数组c都按照32字节对齐,可以把所有_mm256_loadu_si256/_mm256_storeu_si256替换为_mm256_load_si256/_mm256_store_si256,能进一步提升访存性能。 - 该实现完全消除了标量循环的迭代开销,单轮即可完成全部32次运算,实测性能相比标量版本可以提升4~6倍。
内容的提问来源于stack exchange,提问作者Levi Gibson
相关产品推荐
相关产品推荐

