Predicates
Apply a predicate to check if all / any elements in a collection return true. Could be implemented as a reduction, but is better optimised with stopping the search once a false / true is found.
Other names: not often implemented standalone on GPUs, typically included as part of a reduction.
Function signature:
any(pred, v::AbstractGPUVector;
block_size::Int=256, cooperative::Bool=true)
all(pred, v::AbstractGPUVector;
block_size::Int=256, cooperative::Bool=true)
Example:
import AcceleratedKernels as AK
using CUDA
v = CuArray(rand(Float32, 100_000))
AK.any(x -> x < 1, v)
AK.all(x -> x > 0, v)
Note on the cooperative
keyword: some older platforms crash when multiple threads write to the same memory location in a global array (e.g. old Intel Graphics); if all threads were to write the same value, it is well-defined on others (e.g. CUDA F4.2 says "If a non-atomic instruction executed by a warp writes to the same location in global memory for more than one of the threads of the warp, only one thread performs a write and which thread does it is undefined."). This "cooperative" thread behaviour allows for a faster implementation; if you have a platform - the only one I know is Intel UHD Graphics - that crashes, set cooperative=false
to use a safer mapreduce
-based implementation.