diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 503857b5..3ad880eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,12 +17,9 @@ jobs: strategy: fail-fast: false matrix: - version: - - '1' - os: - - ubuntu-latest - arch: - - x64 + include: + - {version: '1', os: ubuntu-latest, arch: x64} + - {version: '1', os: macos-14, arch: aarch64} steps: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@v2 @@ -42,12 +39,9 @@ jobs: strategy: fail-fast: false matrix: - version: - - '1' - os: - - ubuntu-latest - arch: - - x64 + include: + - {version: '1', os: ubuntu-latest, arch: x64} + - {version: '1', os: macos-14, arch: aarch64} steps: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@v2 @@ -67,12 +61,9 @@ jobs: strategy: fail-fast: false matrix: - version: - - '1' - os: - - ubuntu-latest - arch: - - x64 + include: + - {version: '1', os: ubuntu-latest, arch: x64} + - {version: '1', os: macos-14, arch: aarch64} steps: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@v2 diff --git a/src/block_arrays.jl b/src/block_arrays.jl index dfc47807..dfe737eb 100644 --- a/src/block_arrays.jl +++ b/src/block_arrays.jl @@ -297,10 +297,8 @@ function distance_eval_body(d,a::BVector,b::BVector) partials = map(blocks(a),blocks(b)) do ai,bi distance_eval_body(d,ai,bi) end - s = reduce((i,j)->Distances.eval_reduce(d,i,j), - partials, - init=Distances.eval_start(d, a, b)) - s + init_val = Distances.eval_start(d, a, b) + reduce_for_distance(d, partials, init_val) end struct BroadcastedBArray{A} diff --git a/src/p_vector.jl b/src/p_vector.jl index dbc0cdf7..9ffffd97 100644 --- a/src/p_vector.jl +++ b/src/p_vector.jl @@ -1,6 +1,30 @@ function local_values end +function reduce_for_distance(d, partials, init) + reduce((i, j) -> Distances.eval_reduce(d, i, j), partials; init) +end + +reduce_for_distance(::Distances.Chebyshev, partials, init) = + reduce(max, partials; init) + +for T in (Distances.Euclidean, + Distances.SqEuclidean, + Distances.PeriodicEuclidean, + Distances.Cityblock, + Distances.TotalVariation, + Distances.Minkowski, + Distances.Hamming, + Distances.ChiSqDist, + Distances.KLDivergence, + Distances.GenKLDivergence) + # all Distances.metrics except Jaccard, RogersTanimoto, CosineDist, + # RenyiDivergence, BrayCurtis, SpanNormDist, since these either operate with + # tuples or have a complex reduction logic. + @eval reduce_for_distance(::$(T), partials, init) = + reduce(+, partials; init) +end + function own_values end function ghost_values end @@ -1328,10 +1352,8 @@ function distance_eval_body(d,a::PVector,b::PVector) return s end end - s = reduce((i,j)->Distances.eval_reduce(d,i,j), - partials, - init=Distances.eval_start(d, a, b)) - s + init_val = Distances.eval_start(d, a, b) + reduce_for_distance(d, partials, init_val) end # New stuff diff --git a/src/primitives.jl b/src/primitives.jl index 86726137..a4183186 100644 --- a/src/primitives.jl +++ b/src/primitives.jl @@ -806,13 +806,10 @@ function ExchangeGraph_impl_with_neighbors(snd_ids,neighbors::ExchangeGraph) is_included_all=map(snd_ids_a, snd_ids_b) do snd_ids_a, snd_ids_b all(i->i in snd_ids_b,snd_ids_a) end - result=false - and(a,b)=a && b - is_included_all=reduction(and,is_included_all,destination=:all,init=one(eltype(is_included_all))) - map(is_included_all) do is_included_all - result = is_included_all - end - result + # perform a global AND using built-in & operator (static MPI-op) + is_included_all = reduction(&, is_included_all; destination=:all, init=one(eltype(is_included_all))) + # extract the single boolean result + collect(is_included_all)[1] end @boundscheck is_included(snd_ids,neighbors.snd) || error("snd_ids must be a subset of neighbors.snd") rank = linear_indices(snd_ids)