2021-01-22 04:56:18 +00:00
|
|
|
[[builtin(global_invocation_id)]]
|
|
|
|
var global_id: vec3<u32>;
|
|
|
|
|
2021-01-25 06:30:59 +00:00
|
|
|
[[block]]
|
2021-01-22 04:56:18 +00:00
|
|
|
struct PrimeIndices {
|
2021-01-28 05:31:21 +00:00
|
|
|
data: [[stride(4)]] array<u32>;
|
2021-01-22 04:56:18 +00:00
|
|
|
}; // 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.
|
2021-01-28 05:31:21 +00:00
|
|
|
fn collatz_iterations(n_base: u32) -> u32{
|
|
|
|
var n: u32 = n_base;
|
2021-01-23 06:57:02 +00:00
|
|
|
var i: u32 = 0u;
|
2021-01-22 04:56:18 +00:00
|
|
|
loop {
|
2021-01-23 06:57:02 +00:00
|
|
|
if (n <= 1u) {
|
2021-01-22 04:56:18 +00:00
|
|
|
break;
|
|
|
|
}
|
2021-01-23 06:57:02 +00:00
|
|
|
if (n % 2u == 0u) {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
[[stage(compute), workgroup_size(1)]]
|
|
|
|
fn main() {
|
|
|
|
v_indices.data[global_id.x] = collatz_iterations(v_indices.data[global_id.x]);
|
|
|
|
}
|