You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用WebAssembly计算三维向量的点积?

用WebAssembly SIMD实现三维向量点积的正确方式

关于i32x4.dot_i16x8_s指令的澄清

先纠正你对该指令的误解:

  • 两个输入均为v128类型的i16x8格式(每个输入包含8个16位有符号整数),并非一个i32x4和一个i16x8。命名中的i32x4指输出格式,i16x8指输入格式。
  • 返回的v128是i32x4格式:指令会把两个输入的i16x8向量拆分为4组连续的i16x2子向量,对每组计算带符号点积(即a*b + c*d,a、c来自第一个输入的子向量,b、d来自第二个输入的对应子向量),再将每个点积结果符号扩展为32位整数,最终输出包含4个32位整数的v128。

三维向量点积的实现思路

三维向量点积是三个对应元素乘积的和,你可以通过以下方式利用i32x4.dot_i16x8_s实现:

  1. 填充向量:将三维向量的元素放入i16x8的对应位置,剩余位置补0,让指令计算出所需的乘积项组合。
  2. 提取并求和结果:从指令输出的i32x4中提取有效乘积项,相加得到最终的三维点积。

示例代码(计算dot([1,3,-5], [4,-2,-1]))

以下是完整的WAT代码,最终返回结果3:

(module
  (func (export "dot_3d") (result i32)
    ;; 定义局部变量存储向量和结果
    (local $vec1 v128)
    (local $vec2 v128)
    (local $simd_result v128)
    (local $final_sum i32)

    ;; 初始化vec1:[1, 3, -5, 0, 0, 0, 0, 0](i16x8格式)
    v128.const_i16x8 0 0 0 0 0 0 0 0
    i32.const 1
    v128.insert_lane_i16 0
    i32.const 3
    v128.insert_lane_i16 1
    i32.const -5
    v128.insert_lane_i16 2
    i32.const 0
    v128.insert_lane_i16 3
    local.set $vec1

    ;; 初始化vec2:[4, -2, -1, 0, 0, 0, 0, 0](i16x8格式)
    v128.const_i16x8 0 0 0 0 0 0 0 0
    i32.const 4
    v128.insert_lane_i16 0
    i32.const -2
    v128.insert_lane_i16 1
    i32.const -1
    v128.insert_lane_i16 2
    i32.const 0
    v128.insert_lane_i16 3
    local.set $vec2

    ;; 执行SIMD点积指令
    local.get $vec1
    local.get $vec2
    i32x4.dot_i16x8_s
    local.set $simd_result

    ;; 提取分组结果并求和:-2(1*4+3*-2) +5(-5*-1+0*0)=3
    local.get $simd_result
    v128.extract_lane_i32 0
    local.get $simd_result
    v128.extract_lane_i32 1
    i32.add
    local.set $final_sum

    ;; 返回最终点积结果
    local.get $final_sum
  )
)

另一种直观的打包方式

你也可以把向量元素交叉放入i16x8的偶数和奇数位,让每组单独计算一个乘积:

  • vec1: [1, 0, 3, 0, -5, 0, 0, 0]
  • vec2: [0,4,0,-2,0,-1,0,0]
    此时指令输出的i32x4前三位分别是1*4、3*-2、-5*-1,将这三个数相加即可得到结果,逻辑更直观但代码稍长。

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:47:47