wgpu/naga/tests/in/collatz.wgsl
2023-10-25 14:25:04 -04:00

33 lines
971 B
WebGPU Shading Language

struct PrimeIndices {
data: array<u32>
} // this is used as both input and output for convenience
@group(0) @binding(0)
var<storage,read_write> v_indices: 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 = n_base;
var i: u32 = 0u;
while n > 1u {
if n % 2u == 0u {
n = n / 2u;
}
else {
n = 3u * n + 1u;
}
i = i + 1u;
}
return i;
}
@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]);
}