wgpu/naga/tests/in/collatz.wgsl

33 lines
971 B
WebGPU Shading Language
Raw Normal View History

2021-01-22 04:56:18 +00:00
struct PrimeIndices {
data: array<u32>
} // this is used as both input and output for convenience
2021-01-22 04:56:18 +00:00
2022-01-19 15:33:06 +00:00
@group(0) @binding(0)
var<storage,read_write> v_indices: PrimeIndices;
2021-01-22 04:56:18 +00:00
// 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.
2021-02-06 07:20:38 +00:00
fn collatz_iterations(n_base: u32) -> u32 {
2021-07-06 05:16:15 +00:00
var n = n_base;
2021-01-23 06:57:02 +00:00
var i: u32 = 0u;
2022-03-22 10:22:29 +00:00
while n > 1u {
if n % 2u == 0u {
2021-01-23 06:57:02 +00:00
n = n / 2u;
2021-01-22 04:56:18 +00:00
}
else {
2021-01-23 06:57:02 +00:00
n = 3u * n + 1u;
2021-01-22 04:56:18 +00:00
}
2021-01-23 06:57:02 +00:00
i = i + 1u;
2021-01-22 04:56:18 +00:00
}
return i;
}
@compute @workgroup_size(1)
2022-01-19 15:33:06 +00:00
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
2021-01-22 04:56:18 +00:00
v_indices.data[global_id.x] = collatz_iterations(v_indices.data[global_id.x]);
}