Skip to content

Commit 725c9e5

Browse files
authored
Merge pull request #101 from fverdugo/performance
Performance
2 parents 1a55add + 9446979 commit 725c9e5

File tree

6 files changed

+100
-58
lines changed

6 files changed

+100
-58
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.3.2] - 2023-05-10
9+
10+
### Fixed
11+
12+
- Performance improvements.
13+
814
## [0.3.1] - 2023-03-17
915

1016
### Fixed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "PartitionedArrays"
22
uuid = "5a9dfac6-5c52-46f7-8278-5e2210713be9"
33
authors = ["Francesc Verdugo <[email protected]> and contributors"]
4-
version = "0.3.1"
4+
version = "0.3.2"
55

66
[deps]
77
CircularArrays = "7a955b69-7140-5f4e-a0ed-f168c5e2e749"
@@ -18,7 +18,7 @@ SparseMatricesCSR = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1"
1818
[compat]
1919
CircularArrays = "1"
2020
Distances = "0.10"
21-
FillArrays = "0.10, 0.11, 0.12, 0.13"
21+
FillArrays = "0.10, 0.11, 0.12, 0.13, 1"
2222
IterativeSolvers = "0.9"
2323
MPI = "0.16, 0.17, 0.18, 0.19, 0.20"
2424
SparseMatricesCSR = "0.6"

src/mpi_array.jl

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,18 +196,55 @@ end
196196
function Base.map(f,args::Vararg{MPIArray,N}) where N
197197
a = first(args)
198198
@assert all(i->size(a)==size(i),args)
199-
item = f(map(i->i.item,args)...)
199+
item = f(map(i->i.item_ref[],args)...)
200+
MPIArray(item,a.comm,a.size)
201+
end
202+
203+
function Base.map(f,a::MPIArray)
204+
item = f(a.item_ref[])
200205
MPIArray(item,a.comm,a.size)
201206
end
202207

203208
function Base.map(f,args::Vararg{MPIArray,2})
204209
a = first(args)
205210
@assert all(i->size(a)==size(i),args)
206-
t1,t2 = map(i->i.item,args)
211+
t1,t2 = map(i->i.item_ref[],args)
207212
item = f(t1,t2)
208213
MPIArray(item,a.comm,a.size)
209214
end
210215

216+
function Base.map(f,args::Vararg{MPIArray,3})
217+
a = first(args)
218+
@assert all(i->size(a)==size(i),args)
219+
t1,t2,t3 = map(i->i.item_ref[],args)
220+
item = f(t1,t2,t3)
221+
MPIArray(item,a.comm,a.size)
222+
end
223+
224+
function Base.map(f,args::Vararg{MPIArray,4})
225+
a = first(args)
226+
@assert all(i->size(a)==size(i),args)
227+
t1,t2,t3,t4 = map(i->i.item_ref[],args)
228+
item = f(t1,t2,t3,t4)
229+
MPIArray(item,a.comm,a.size)
230+
end
231+
232+
function Base.map(f,args::Vararg{MPIArray,5})
233+
a = first(args)
234+
@assert all(i->size(a)==size(i),args)
235+
t1,t2,t3,t4,t5 = map(i->i.item_ref[],args)
236+
item = f(t1,t2,t3,t4,t5)
237+
MPIArray(item,a.comm,a.size)
238+
end
239+
240+
function Base.map(f,args::Vararg{MPIArray,6})
241+
a = first(args)
242+
@assert all(i->size(a)==size(i),args)
243+
t1,t2,t3,t4,t5,t6 = map(i->i.item_ref[],args)
244+
item = f(t1,t2,t3,t4,t5,t6)
245+
MPIArray(item,a.comm,a.size)
246+
end
247+
211248
function Base.map!(f,r::MPIArray,args::MPIArray...)
212249
a = first(args)
213250
@assert all(i->size(a)==size(i),args)

src/p_range.jl

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -433,19 +433,18 @@ end
433433

434434
function assembly_local_indices(indices,neighbors_snd,neighbors_rcv)
435435
cache = map(assembly_cache,indices)
436-
mask = map(cache) do cache
437-
isassigned(cache.local_indices_snd) && isassigned(cache.local_indices_rcv)
436+
mask = map(cache) do mycache
437+
isassigned(mycache.local_indices_snd) && isassigned(mycache.local_indices_rcv)
438438
end
439439
if ! getany(mask)
440-
local_indices_snd, local_indices_rcv = compute_assembly_local_indices(indices,neighbors_snd,neighbors_rcv)
441-
map(cache,local_indices_snd,local_indices_rcv) do cache, local_indices_snd, local_indices_rcv
442-
cache.local_indices_snd[] = local_indices_snd
443-
cache.local_indices_rcv[] = local_indices_rcv
440+
new_local_indices_snd, new_local_indices_rcv = compute_assembly_local_indices(indices,neighbors_snd,neighbors_rcv)
441+
map(cache,new_local_indices_snd,new_local_indices_rcv) do mycache, mylocal_indices_snd, mylocal_indices_rcv
442+
mycache.local_indices_snd[] = mylocal_indices_snd
443+
mycache.local_indices_rcv[] = mylocal_indices_rcv
444444
end
445-
return local_indices_snd, local_indices_rcv
446445
end
447-
local_indices_snd, local_indices_rcv = map(cache) do cache
448-
cache.local_indices_snd[], cache.local_indices_rcv[]
446+
local_indices_snd, local_indices_rcv = map(cache) do mycache
447+
mycache.local_indices_snd[], mycache.local_indices_rcv[]
449448
end |> tuple_of_arrays
450449
local_indices_snd, local_indices_rcv
451450
end
@@ -476,20 +475,20 @@ function compute_assembly_local_indices(indices,neighbors_snd,neighbors_rcv)
476475
end
477476
end
478477
rewind_ptrs!(ptrs)
479-
local_indices_snd = JaggedArray(data_lids,ptrs)
480-
global_indices_snd = JaggedArray(data_gids,ptrs)
481-
local_indices_snd, global_indices_snd
478+
my_local_indices_snd = JaggedArray(data_lids,ptrs)
479+
my_global_indices_snd = JaggedArray(data_gids,ptrs)
480+
my_local_indices_snd, my_global_indices_snd
482481
end |> tuple_of_arrays
483482
graph = ExchangeGraph(parts_snd,parts_rcv)
484483
global_indices_rcv = exchange_fetch(global_indices_snd,graph)
485-
local_indices_rcv = map(global_indices_rcv,indices) do global_indices_rcv,indices
486-
ptrs = global_indices_rcv.ptrs
484+
local_indices_rcv = map(global_indices_rcv,indices) do myglobal_indices_rcv,myindices
485+
ptrs = myglobal_indices_rcv.ptrs
487486
data_lids = zeros(Int32,ptrs[end]-1)
488-
global_to_local_indices = global_to_local(indices)
489-
for (k,gid) in enumerate(global_indices_rcv.data)
487+
global_to_local_indices = global_to_local(myindices)
488+
for (k,gid) in enumerate(myglobal_indices_rcv.data)
490489
data_lids[k] = global_to_local_indices[gid]
491490
end
492-
local_indices_rcv = JaggedArray(data_lids,ptrs)
491+
my_local_indices_rcv = JaggedArray(data_lids,ptrs)
493492
end
494493
local_indices_snd,local_indices_rcv
495494
end
@@ -568,9 +567,7 @@ function uniform_partition(rank,n::Integer,ghost::Bool,periodic::Bool=false)
568567
uniform_partition(rank,length(rank),n,ghost,periodic)
569568
end
570569

571-
function uniform_partition(rank,np::Integer,n::Integer)
572-
uniform_partition(rank,(np,),(n,))
573-
end
570+
function uniform_partition(rank,np::Integer,n::Integer) uniform_partition(rank,(np,),(n,)) end
574571

575572
function uniform_partition(rank,np::Integer,n::Integer,ghost::Bool,periodic::Bool=false)
576573
uniform_partition(rank,(np,),(n,),(ghost,),(periodic,))
@@ -589,19 +586,19 @@ function block_with_constant_size(rank,np,n,ghost,periodic=map(i->false,ghost))
589586
own_ranges = map(local_range,Tuple(p),np,n)
590587
local_ranges = map(local_range,Tuple(p),np,n,ghost,periodic)
591588
owners = map(Tuple(p),own_ranges,local_ranges) do p,or,lr
592-
owners = zeros(Int32,length(lr))
589+
myowners = zeros(Int32,length(lr))
593590
for i in 1:length(lr)
594591
if lr[i] in or
595-
owners[i] = p
592+
myowners[i] = p
596593
end
597594
end
598-
if owners[1] == 0
599-
owners[1] = p-1
595+
if myowners[1] == 0
596+
myowners[1] = p-1
600597
end
601-
if owners[end] == 0
602-
owners[end] = p+1
598+
if myowners[end] == 0
599+
myowners[end] = p+1
603600
end
604-
owners
601+
myowners
605602
end
606603
n_ghost = 0
607604
cis = CartesianIndices(map(length,local_ranges))

src/p_sparse_matrix.jl

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -506,12 +506,13 @@ function to_trivial_partition(b::PVector,row_partition_in_main)
506506
destination = 1
507507
T = eltype(b)
508508
b_in_main = similar(b,T,PRange(row_partition_in_main))
509-
map(own_values(b),partition(b_in_main),partition(axes(b,1))) do bown,b_in_main,indices
509+
fill!(b_in_main,zero(T))
510+
map(own_values(b),partition(b_in_main),partition(axes(b,1))) do bown,my_b_in_main,indices
510511
part = part_id(indices)
511512
if part == destination
512-
b_in_main[own_to_global(indices)] .= bown
513+
my_b_in_main[own_to_global(indices)] .= bown
513514
else
514-
b_in_main .= bown
515+
my_b_in_main .= bown
515516
end
516517
end
517518
assemble!(b_in_main) |> wait
@@ -521,12 +522,12 @@ end
521522
function from_trivial_partition!(c::PVector,c_in_main::PVector)
522523
destination = 1
523524
consistent!(c_in_main) |> wait
524-
map(own_values(c),partition(c_in_main),partition(axes(c,1))) do cown, c_in_main, indices
525+
map(own_values(c),partition(c_in_main),partition(axes(c,1))) do cown, my_c_in_main, indices
525526
part = part_id(indices)
526527
if part == destination
527-
cown .= view(c_in_main,own_to_global(indices))
528+
cown .= view(my_c_in_main,own_to_global(indices))
528529
else
529-
cown .= c_in_main
530+
cown .= my_c_in_main
530531
end
531532
end
532533
c
@@ -549,33 +550,33 @@ function to_trivial_partition(
549550
n += 1
550551
end
551552
end
552-
I = zeros(Int,n)
553-
J = zeros(Int,n)
554-
V = zeros(Ta,n)
553+
myI = zeros(Int,n)
554+
myJ = zeros(Int,n)
555+
myV = zeros(Ta,n)
555556
n = 0
556557
for (i,j,v) in nziterator(a)
557558
if local_row_to_owner[i] == owner
558559
n += 1
559-
I[n] = local_to_global_row[i]
560-
J[n] = local_to_global_col[j]
561-
V[n] = v
560+
myI[n] = local_to_global_row[i]
561+
myJ[n] = local_to_global_col[j]
562+
myV[n] = v
562563
end
563564
end
564-
I,J,V
565+
myI,myJ,myV
565566
end |> tuple_of_arrays
566567
assemble_coo!(I,J,V,row_partition_in_main) |> wait
567-
I,J,V = map(partition(axes(a,1)),I,J,V) do row_indices,I,J,V
568+
I,J,V = map(partition(axes(a,1)),I,J,V) do row_indices,myI,myJ,myV
568569
owner = part_id(row_indices)
569570
if owner == destination
570-
I,J,V
571+
myI,myJ,myV
571572
else
572-
similar(I,eltype(I),0),similar(J,eltype(J),0),similar(V,eltype(V),0)
573+
similar(myI,eltype(myI),0),similar(myJ,eltype(myJ),0),similar(myV,eltype(myV),0)
573574
end
574575
end |> tuple_of_arrays
575-
values = map(I,J,V,row_partition_in_main,col_partition_in_main) do I,J,V,row_indices,col_indices
576+
values = map(I,J,V,row_partition_in_main,col_partition_in_main) do myI,myJ,myV,row_indices,col_indices
576577
m = local_length(row_indices)
577578
n = local_length(col_indices)
578-
compresscoo(M,I,J,V,m,n)
579+
compresscoo(M,myI,myJ,myV,m,n)
579580
end
580581
PSparseMatrix(values,row_partition_in_main,col_partition_in_main)
581582
end
@@ -586,11 +587,12 @@ function Base.:\(a::PSparseMatrix,b::PVector)
586587
Tb = eltype(b)
587588
T = typeof(one(Ta)\one(Tb)+one(Ta)\one(Tb))
588589
c = PVector{Vector{T}}(undef,partition(axes(a,2)))
590+
fill!(c,zero(T))
589591
a_in_main = to_trivial_partition(a)
590592
b_in_main = to_trivial_partition(b,partition(axes(a_in_main,1)))
591593
c_in_main = to_trivial_partition(c,partition(axes(a_in_main,2)))
592-
map_main(partition(c_in_main),partition(a_in_main),partition(b_in_main)) do c, a, b
593-
c .= a\b
594+
map_main(partition(c_in_main),partition(a_in_main),partition(b_in_main)) do myc, mya, myb
595+
myc .= mya\myb
594596
nothing
595597
end
596598
from_trivial_partition!(c,c_in_main)

src/p_vector.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,10 @@ function copy_cache(a::VectorAssemblyCache)
251251
buffer_rcv)
252252
end
253253
function p_vector_cache_impl(::Type,vector_partition,index_partition)
254-
neighbors = assembly_neighbors(index_partition)
255-
indices = assembly_local_indices(index_partition,neighbors...)
256-
buffers = map(assembly_buffers,vector_partition,indices...) |> tuple_of_arrays
257-
map(VectorAssemblyCache,neighbors...,indices...,buffers...)
254+
neighbors_snd,neighbors_rcv= assembly_neighbors(index_partition)
255+
indices_snd,indices_rcv = assembly_local_indices(index_partition,neighbors_snd,neighbors_rcv)
256+
buffers_snd,buffers_rcv = map(assembly_buffers,vector_partition,indices_snd,indices_rcv) |> tuple_of_arrays
257+
map(VectorAssemblyCache,neighbors_snd,neighbors_rcv,indices_snd,indices_rcv,buffers_snd,buffers_rcv)
258258
end
259259
function assembly_buffers(values,local_indices_snd,local_indices_rcv)
260260
T = eltype(values)
@@ -267,8 +267,8 @@ function assembly_buffers(values,local_indices_snd,local_indices_rcv)
267267
buffer_snd, buffer_rcv
268268
end
269269

270-
struct JaggedArrayAssemblyCache
271-
cache::VectorAssemblyCache
270+
struct JaggedArrayAssemblyCache{T}
271+
cache::VectorAssemblyCache{T}
272272
end
273273
Base.reverse(a::JaggedArrayAssemblyCache) = JaggedArrayAssemblyCache(reverse(a.cache))
274274
copy_cache(a::JaggedArrayAssemblyCache) = JaggedArrayAssemblyCache(copy_cache(a.cache))
@@ -518,7 +518,7 @@ Equivalent to
518518
PVector(vector_partition,index_partition)
519519
520520
"""
521-
function pvector(f,index_partition)
521+
@inline function pvector(f,index_partition)
522522
vector_partition = map(f,index_partition)
523523
PVector(vector_partition,index_partition)
524524
end

0 commit comments

Comments
 (0)