WebAssembly 中 3D 向量的点积

问题描述 投票:0回答:1

我想计算 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 执行此操作的正确方法是什么?

linear-algebra webassembly simd dot-product
1个回答
0
投票

wasm 中的点积必须解释为 i32x4 为输出,i16x8 为输入。这确实对应于 Intel

pmaddwd
或将单词成对乘加成双字。 内在函数也是特定于实现的,因为 -32768 **2 * 2 溢出 int32_t。

要计算两个 3 元素向量的点积,必须将其展开为

a[0]*b[0]+a[1]*b[1]...
。 为这三个值分配完整的 v128 可能有助于 JIT 优化。

© www.soinside.com 2019 - 2024. All rights reserved.