| // Copied from wgpu hello-compute example |
| |
| // TODO: delete or clean up attribution before releasing |
| |
| #version 450 |
| layout(local_size_x = 1) in; |
| |
| layout(set = 0, binding = 0) buffer PrimeIndices { |
| uint[] indices; |
| }; // this is used as both input and output for convenience |
| |
| // 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. |
| uint collatz_iterations(uint n) { |
| uint i = 0; |
| while(n != 1) { |
| if (mod(n, 2) == 0) { |
| n = n / 2; |
| } |
| else { |
| n = (3 * n) + 1; |
| } |
| i++; |
| } |
| return i; |
| } |
| |
| void main() { |
| uint index = gl_GlobalInvocationID.x; |
| indices[index] = collatz_iterations(indices[index]); |
| } |