我想计算 3 个元素的两个向量的 点积。我正在查看 wasm 矢量指令,只有一个 dot 指令:
i32x4.dot_i16x8_s
它的类型是两个
v128
作为输入,并根据wasm规范返回一个
v128
。
根据维基百科:
点积是一种代数运算,它采用两个等长的数字序列(通常是坐标向量),并返回一个数字
但是 wasm 指令的名称暗示它期望两个输入向量被组织为
i32x4
和 i16x8
。
这对我来说并没有什么意义,因为输入向量的元素数量不同。另外,我不明白返回的
v128
是以什么格式组织的,是i32x4
还是i16x8
还是其他?
此外,使用 4D 计算计算两个 3D 元素的点积的正确方法是什么,我可以用
1
填充向量,并可能以某种方式操纵答案吗?
如果我详细说明 WAT 代码,我会猜测类似:
(module
(func $my_function (result i32)
v128.const i32x4 1 3 -5 0
v128.const i16x8 4 -2 -1 0 0 0 0 0
i32x4.dot_i16x8_s
i32x4.extract_lane 0
)
)
维基百科文章有一个例子:
dot([1 3 -5], [4 -2 -1]) returns 3
使用 WebAssembly 执行此操作的正确方法是什么?
wasm 中的点积必须解释为 i32x4 为输出,i16x8 为输入。这确实对应于 Intel
pmaddwd
或将单词成对乘加成双字。
内在函数也是特定于实现的,因为 -32768 **2 * 2 溢出 int32_t。
要计算两个 3 元素向量的点积,必须将其展开为
a[0]*b[0]+a[1]*b[1]...
。
为这三个值分配完整的 v128 可能有助于 JIT 优化。