实例:求平均值

正常模式下,计算n个值的平均值,需要运算n次。

  1. function average(list) {
  2. var n = list.length;
  3. var sum = 0.0;
  4. for (var i = 0; i < n; i++) {
  5. sum += list[i];
  6. }
  7. return sum / n;
  8. }

使用 SIMD,可以将计算次数减少到n次的四分之一。

  1. function average(list) {
  2. var n = list.length;
  3. var sum = SIMD.Float32x4.splat(0.0);
  4. for (var i = 0; i < n; i += 4) {
  5. sum = SIMD.Float32x4.add(
  6. sum,
  7. SIMD.Float32x4.load(list, i)
  8. );
  9. }
  10. var total = SIMD.Float32x4.extractLane(sum, 0) +
  11. SIMD.Float32x4.extractLane(sum, 1) +
  12. SIMD.Float32x4.extractLane(sum, 2) +
  13. SIMD.Float32x4.extractLane(sum, 3);
  14. return total / n;
  15. }

上面代码先是每隔四位,将所有的值读入一个 SIMD,然后立刻累加。然后,得到累加值四个通道的总和,再除以n就可以了。