Skip to content

Commit 9130e5a

Browse files
authored
Merge pull request #209 from lamBOOO/use-standard-reduce-operations
Use standard reduce operations for distances
2 parents 63119b9 + bb2a12f commit 9130e5a

4 files changed

Lines changed: 41 additions & 33 deletions

File tree

.github/workflows/ci.yml

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,9 @@ jobs:
1717
strategy:
1818
fail-fast: false
1919
matrix:
20-
version:
21-
- '1'
22-
os:
23-
- ubuntu-latest
24-
arch:
25-
- x64
20+
include:
21+
- {version: '1', os: ubuntu-latest, arch: x64}
22+
- {version: '1', os: macos-14, arch: aarch64}
2623
steps:
2724
- uses: actions/checkout@v2
2825
- uses: julia-actions/setup-julia@v2
@@ -42,12 +39,9 @@ jobs:
4239
strategy:
4340
fail-fast: false
4441
matrix:
45-
version:
46-
- '1'
47-
os:
48-
- ubuntu-latest
49-
arch:
50-
- x64
42+
include:
43+
- {version: '1', os: ubuntu-latest, arch: x64}
44+
- {version: '1', os: macos-14, arch: aarch64}
5145
steps:
5246
- uses: actions/checkout@v2
5347
- uses: julia-actions/setup-julia@v2
@@ -67,12 +61,9 @@ jobs:
6761
strategy:
6862
fail-fast: false
6963
matrix:
70-
version:
71-
- '1'
72-
os:
73-
- ubuntu-latest
74-
arch:
75-
- x64
64+
include:
65+
- {version: '1', os: ubuntu-latest, arch: x64}
66+
- {version: '1', os: macos-14, arch: aarch64}
7667
steps:
7768
- uses: actions/checkout@v2
7869
- uses: julia-actions/setup-julia@v2

src/block_arrays.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,8 @@ function distance_eval_body(d,a::BVector,b::BVector)
297297
partials = map(blocks(a),blocks(b)) do ai,bi
298298
distance_eval_body(d,ai,bi)
299299
end
300-
s = reduce((i,j)->Distances.eval_reduce(d,i,j),
301-
partials,
302-
init=Distances.eval_start(d, a, b))
303-
s
300+
init_val = Distances.eval_start(d, a, b)
301+
reduce_for_distance(d, partials, init_val)
304302
end
305303

306304
struct BroadcastedBArray{A}

src/p_vector.jl

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,30 @@
11

22
function local_values end
33

4+
function reduce_for_distance(d, partials, init)
5+
reduce((i, j) -> Distances.eval_reduce(d, i, j), partials; init)
6+
end
7+
8+
reduce_for_distance(::Distances.Chebyshev, partials, init) =
9+
reduce(max, partials; init)
10+
11+
for T in (Distances.Euclidean,
12+
Distances.SqEuclidean,
13+
Distances.PeriodicEuclidean,
14+
Distances.Cityblock,
15+
Distances.TotalVariation,
16+
Distances.Minkowski,
17+
Distances.Hamming,
18+
Distances.ChiSqDist,
19+
Distances.KLDivergence,
20+
Distances.GenKLDivergence)
21+
# all Distances.metrics except Jaccard, RogersTanimoto, CosineDist,
22+
# RenyiDivergence, BrayCurtis, SpanNormDist, since these either operate with
23+
# tuples or have a complex reduction logic.
24+
@eval reduce_for_distance(::$(T), partials, init) =
25+
reduce(+, partials; init)
26+
end
27+
428
function own_values end
529

630
function ghost_values end
@@ -1328,10 +1352,8 @@ function distance_eval_body(d,a::PVector,b::PVector)
13281352
return s
13291353
end
13301354
end
1331-
s = reduce((i,j)->Distances.eval_reduce(d,i,j),
1332-
partials,
1333-
init=Distances.eval_start(d, a, b))
1334-
s
1355+
init_val = Distances.eval_start(d, a, b)
1356+
reduce_for_distance(d, partials, init_val)
13351357
end
13361358

13371359
# New stuff

src/primitives.jl

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -806,13 +806,10 @@ function ExchangeGraph_impl_with_neighbors(snd_ids,neighbors::ExchangeGraph)
806806
is_included_all=map(snd_ids_a, snd_ids_b) do snd_ids_a, snd_ids_b
807807
all(i->i in snd_ids_b,snd_ids_a)
808808
end
809-
result=false
810-
and(a,b)=a && b
811-
is_included_all=reduction(and,is_included_all,destination=:all,init=one(eltype(is_included_all)))
812-
map(is_included_all) do is_included_all
813-
result = is_included_all
814-
end
815-
result
809+
# perform a global AND using built-in & operator (static MPI-op)
810+
is_included_all = reduction(&, is_included_all; destination=:all, init=one(eltype(is_included_all)))
811+
# extract the single boolean result
812+
collect(is_included_all)[1]
816813
end
817814
@boundscheck is_included(snd_ids,neighbors.snd) || error("snd_ids must be a subset of neighbors.snd")
818815
rank = linear_indices(snd_ids)

0 commit comments

Comments
 (0)