diff options
Diffstat (limited to 'cli/tests/testdata/webgpu_computepass_shader.wgsl')
| -rw-r--r-- | cli/tests/testdata/webgpu_computepass_shader.wgsl | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/cli/tests/testdata/webgpu_computepass_shader.wgsl b/cli/tests/testdata/webgpu_computepass_shader.wgsl new file mode 100644 index 000000000..7d4748e2a --- /dev/null +++ b/cli/tests/testdata/webgpu_computepass_shader.wgsl @@ -0,0 +1,37 @@ +[[block]] +struct PrimeIndices { + data: [[stride(4)]] array<u32>; +}; // this is used as both input and output for convenience +[[group(0), binding(0)]] +var<storage> v_indices: [[access(read_write)]] PrimeIndices; +// The Collatz Conjecture states that for any integer n: +// If n is even, n = n/2 +// If n is odd, n = 3n+1 +// And repeat this process for each new n, you will always eventually reach 1. +// Though the conjecture has not been proven, no counterexample has ever been found. +// This function returns how many times this recurrence needs to be applied to reach 1. +fn collatz_iterations(n_base: u32) -> u32{ + var n: u32 = n_base; + var i: u32 = 0u; + loop { + if (n <= 1u) { + break; + } + if (n % 2u == 0u) { + n = n / 2u; + } + else { + // Overflow? (i.e. 3*n + 1 > 0xffffffffu?) + if (n >= 1431655765u) { // 0x55555555u + return 4294967295u; // 0xffffffffu + } + n = 3u * n + 1u; + } + i = i + 1u; + } + return i; +} +[[stage(compute), workgroup_size(1)]] +fn main([[builtin(global_invocation_id)]] global_id: vec3<u32>) { + v_indices.data[global_id.x] = collatz_iterations(v_indices.data[global_id.x]); +} |
