WebGPU Compute taylor series (1 thread)

JavaScript

async function main() {
  const adapter = await navigator.gpu?.requestAdapter();
  const hasTimer = adapter.features.has('timestamp-query');
  const device = await adapter?.requestDevice({
    requiredFeatures: hasTimer ? ['timestamp-query'] : [],
  });
  if (!device) {
    fail('need a browser that supports WebGPU');
    return;
  }
  device.addEventListener('uncapturederror', e => console.error(e.error.message));

  /* from chatgpt

  def compute_exp(x, terms=20):
    result = 1.0  # First term of the series (e^0 = 1)
    factorial = 1.0  # To compute factorial iteratively
    power = 1.0  # To compute x^n iteratively

    for n in range(1, terms):
        factorial *= n  # Compute n!
        power *= x      # Compute x^n
        result += power / factorial  # Add term to the result

    return result */

  function computeExp(x, terms) {
    let result = 1;
    let factorial = 1;
    let power = 1;
    for (let i = 1; i <= terms; ++i) {
      factorial *= i;
      power *= x;
      result += power / factorial;
    }
    return result;
  }

  function cpu(results, terms) {
    const len = results.length;
    for (let i = 0; i < len; ++i) {
      results[i] = computeExp(i, terms)
    }
  }

  const module = device.createShaderModule({
    code: `
      struct Params {
        terms: u32,
      };
      @group(0) @binding(0) var<uniform> u: Params;
      @group(0) @binding(1) var<storage, read_write> results: array<f32>;

      fn computeExp(x: f32, terms: u32) -> f32 {
        var result: f32 = 1;
        var factorial: f32 = 1;
        var power: f32 = 1;
        for (var i = 1u; i <= terms; i++) {
          factorial *= f32(i);
          power *= x;
          result += power / factorial;
        }
        return result;
      }

      @compute @workgroup_size(1) fn computeSomething() {
        let len = arrayLength(&results);
        for (var i = 0u; i < len; i++) {
          results[i] = computeExp(f32(i), u.terms);
        }
      }
    `,
  });
 
  const...