首页 > 解决方案 > 用标量快速乘以 int8 数组

问题描述

我想知道是否有一种快速的int8数组相乘方法,

for(i = 0; i < n; ++i)
    z[i] = x * y[i];

我看到英特尔内在函数指南_mm_mulhi_epi16列出了几个 SIMD 指令,例如. 我缺少类似的东西吗?_mm_mullo_epi16int16int8

标签: cassemblyx86sse8-bit

解决方案


将输入分为低和高,一个可以

__m128i const kff00ff00 = _mm_set1_epi32(0xff00ff00);
__m128i lo = _mm_mullo_epi16(y, x);
__m128i hi = _mm_mullo_epi16(_mm_and_si128(y, kff00ff00), x);
__m128i z = _mm_blendv_epi8(lo, hi, kff00ff00);

YYAFAIK ,YYyy|YYyy|YYyy|YYyy乘以的高位00xx|00xx|00xx|00xx不会干扰低 8 位??ll,同样YY00|YY00*00xx|00xx的乘积在 处产生正确的 8 位乘积HH00。这两个正确对齐的结果需要混合。

__m128i x = _mm_set1_epi16(scalar_x);, 和__m128i y = _mm_loadu_si128(...);

另一种方法是使用shufb计算LutLo[y & 15] + LutHi[y >> 4],不幸的是,移位也必须由_mm_and_si128(_mm_srli_epi16(y,4),_mm_set1_epi8(15)).


推荐阅读