Isolate projects to avoid transitive dependency Add parameter for passing devices Incorporate further reviews Update all dependencies
85 lines
2.1 KiB
Julia
85 lines
2.1 KiB
Julia
using Distributed
|
|
|
|
@everywhere using Pkg
|
|
@everywhere Pkg.activate("."; io = devnull) # don't spam `Activating environment at...`
|
|
@everywhere include("StreamData.jl")
|
|
@everywhere include("Stream.jl")
|
|
@everywhere using SharedArrays
|
|
@everywhere const SharedArrayData = StreamData{T,SharedArray{T}} where {T}
|
|
|
|
function devices()::Vector{DeviceWithRepr}
|
|
return [(undef, "CPU (localhost) $(nworkers())P", "Distributed.jl")]
|
|
end
|
|
|
|
function make_stream(
|
|
arraysize::Int,
|
|
scalar::T,
|
|
_::DeviceWithRepr,
|
|
silent::Bool,
|
|
)::Tuple{SharedArrayData{T},Nothing} where {T}
|
|
|
|
if !silent
|
|
println("Using max $(nworkers()) process(es) + 1 master")
|
|
end
|
|
return (
|
|
SharedArrayData{T}(
|
|
SharedArray{T}(arraysize),
|
|
SharedArray{T}(arraysize),
|
|
SharedArray{T}(arraysize),
|
|
scalar,
|
|
arraysize,
|
|
),
|
|
nothing,
|
|
)
|
|
end
|
|
|
|
function init_arrays!(data::SharedArrayData{T}, _, init::Tuple{T,T,T}) where {T}
|
|
|
|
@sync @distributed for i = 1:data.size
|
|
@inbounds data.a[i] = init[1]
|
|
@inbounds data.b[i] = init[2]
|
|
@inbounds data.c[i] = init[3]
|
|
end
|
|
end
|
|
|
|
function copy!(data::SharedArrayData{T}, _) where {T}
|
|
@sync @distributed for i = 1:data.size
|
|
@inbounds data.c[i] = data.a[i]
|
|
end
|
|
end
|
|
|
|
function mul!(data::SharedArrayData{T}, _) where {T}
|
|
@sync @distributed for i = 1:data.size
|
|
@inbounds data.b[i] = data.scalar * data.c[i]
|
|
end
|
|
end
|
|
|
|
function add!(data::SharedArrayData{T}, _) where {T}
|
|
@sync @distributed for i = 1:data.size
|
|
@inbounds data.c[i] = data.a[i] + data.b[i]
|
|
end
|
|
end
|
|
|
|
function triad!(data::SharedArrayData{T}, _) where {T}
|
|
@sync @distributed for i = 1:data.size
|
|
@inbounds data.a[i] = data.b[i] + (data.scalar * data.c[i])
|
|
end
|
|
end
|
|
|
|
function nstream!(data::SharedArrayData{T}, _) where {T}
|
|
@sync @distributed for i = 1:data.size
|
|
@inbounds data.a[i] += data.b[i] + data.scalar * data.c[i]
|
|
end
|
|
end
|
|
|
|
function dot(data::SharedArrayData{T}, _) where {T}
|
|
return @distributed (+) for i = 1:data.size
|
|
@inbounds data.a[i] * data.b[i]
|
|
end
|
|
end
|
|
|
|
function read_data(data::SharedArrayData{T}, _)::VectorData{T} where {T}
|
|
return VectorData{T}(data.a, data.b, data.c, data.scalar, data.size)
|
|
end
|
|
|
|
main() |