c - 用标量快速乘以 int8 数组
问题描述
我想知道是否有一种快速的int8
数组相乘方法,即
for(i = 0; i < n; ++i)
z[i] = x * y[i];
我看到英特尔内在函数指南_mm_mulhi_epi16
列出了几个 SIMD 指令,例如. 我缺少类似的东西吗?_mm_mullo_epi16
int16
int8
解决方案
将输入分为低和高,一个可以
__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);
YY
AFAIK ,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))
.
推荐阅读
- powershell - 通过导出 .csv 文件,通过 Powershell 将禁用的用户移动到 AD 中的 OU
- python - 用于回归的 KNN
- graphql - 类型应该使用 Apollo Graphql 引用特定的枚举或联合
- javascript - 当且仅当有 2 行或更多行要显示时,如何缩进第一行?
- windows - 如何让背景图像显示在 Windows Mail 10 应用程序中?
- python - while 循环不会对齐并继续代码并继续循环
- python - 简单邮件传输协议脚本错误
- r - 使用数据字典应用值替换
- c# - 从字典中获取前 n 个值的最佳方法是什么?
- c++ - 如何将值插入向量数组