实例:求平均值
正常模式下,计算n
个值的平均值,需要运算n
次。
function average(list) {
var n = list.length;
var sum = 0.0;
for (var i = 0; i < n; i++) {
sum += list[i];
}
return sum / n;
}
使用 SIMD,可以将计算次数减少到n
次的四分之一。
function average(list) {
var n = list.length;
var sum = SIMD.Float32x4.splat(0.0);
for (var i = 0; i < n; i += 4) {
sum = SIMD.Float32x4.add(
sum,
SIMD.Float32x4.load(list, i)
);
}
var total = SIMD.Float32x4.extractLane(sum, 0) +
SIMD.Float32x4.extractLane(sum, 1) +
SIMD.Float32x4.extractLane(sum, 2) +
SIMD.Float32x4.extractLane(sum, 3);
return total / n;
}
上面代码先是每隔四位,将所有的值读入一个 SIMD,然后立刻累加。然后,得到累加值四个通道的总和,再除以n
就可以了。