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...