Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Aland, Sebastian
amdis
Commits
2d6d2384
Commit
2d6d2384
authored
Nov 01, 2012
by
Thomas Witkowski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some performance issues, part II.
parent
9fc53052
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
51 deletions
+53
-51
AMDiS/src/parallel/ElementObjectDatabase.cc
AMDiS/src/parallel/ElementObjectDatabase.cc
+26
-27
AMDiS/src/parallel/ElementObjectDatabase.h
AMDiS/src/parallel/ElementObjectDatabase.h
+18
-15
AMDiS/src/parallel/InteriorBoundary.cc
AMDiS/src/parallel/InteriorBoundary.cc
+9
-9
No files found.
AMDiS/src/parallel/ElementObjectDatabase.cc
View file @
2d6d2384
...
...
@@ -179,6 +179,7 @@ namespace AMDiS {
}
}
void
ElementObjectDatabase
::
addVertex
(
Element
*
el
,
int
ith
)
{
DegreeOfFreedom
vertex
=
el
->
getDof
(
ith
,
0
);
...
...
@@ -796,7 +797,7 @@ namespace AMDiS {
nSize
=
vertexLocalMap
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
ElementObjectData
,
DegreeOfFreedom
>::
iterator
it
=
vertexLocalMap
.
begin
();
for
(
boost
::
container
::
flat_
map
<
ElementObjectData
,
DegreeOfFreedom
>::
iterator
it
=
vertexLocalMap
.
begin
();
it
!=
vertexLocalMap
.
end
();
++
it
)
{
it
->
first
.
serialize
(
out
);
SerUtil
::
serialize
(
out
,
it
->
second
);
...
...
@@ -804,7 +805,7 @@ namespace AMDiS {
nSize
=
edgeLocalMap
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
ElementObjectData
,
DofEdge
>::
iterator
it
=
edgeLocalMap
.
begin
();
for
(
boost
::
container
::
flat_
map
<
ElementObjectData
,
DofEdge
>::
iterator
it
=
edgeLocalMap
.
begin
();
it
!=
edgeLocalMap
.
end
();
++
it
)
{
it
->
first
.
serialize
(
out
);
SerUtil
::
serialize
(
out
,
it
->
second
);
...
...
@@ -812,7 +813,7 @@ namespace AMDiS {
nSize
=
faceLocalMap
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
ElementObjectData
,
DofFace
>::
iterator
it
=
faceLocalMap
.
begin
();
for
(
boost
::
container
::
flat_
map
<
ElementObjectData
,
DofFace
>::
iterator
it
=
faceLocalMap
.
begin
();
it
!=
faceLocalMap
.
end
();
++
it
)
{
it
->
first
.
serialize
(
out
);
SerUtil
::
serialize
(
out
,
it
->
second
);
...
...
@@ -821,7 +822,7 @@ namespace AMDiS {
nSize
=
vertexInRank
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
DegreeOfFreedom
,
map
<
int
,
ElementObjectData
>
>::
iterator
it
=
vertexInRank
.
begin
();
for
(
flat_
map
<
DegreeOfFreedom
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
it
=
vertexInRank
.
begin
();
it
!=
vertexInRank
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
serialize
(
out
,
it
->
second
);
...
...
@@ -829,7 +830,7 @@ namespace AMDiS {
nSize
=
edgeInRank
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
DofEdge
,
map
<
int
,
ElementObjectData
>
>::
iterator
it
=
edgeInRank
.
begin
();
for
(
flat_
map
<
DofEdge
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
it
=
edgeInRank
.
begin
();
it
!=
edgeInRank
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
serialize
(
out
,
it
->
second
);
...
...
@@ -837,7 +838,7 @@ namespace AMDiS {
nSize
=
faceInRank
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
DofFace
,
map
<
int
,
ElementObjectData
>
>::
iterator
it
=
faceInRank
.
begin
();
for
(
flat_
map
<
DofFace
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
it
=
faceInRank
.
begin
();
it
!=
faceInRank
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
serialize
(
out
,
it
->
second
);
...
...
@@ -957,7 +958,7 @@ namespace AMDiS {
vertexInRank
.
clear
();
for
(
int
i
=
0
;
i
<
nSize
;
i
++
)
{
DegreeOfFreedom
dof
;
map
<
int
,
ElementObjectData
>
data
;
flat_
map
<
int
,
ElementObjectData
>
data
;
SerUtil
::
deserialize
(
in
,
dof
);
deserialize
(
in
,
data
);
vertexInRank
[
dof
]
=
data
;
...
...
@@ -967,7 +968,7 @@ namespace AMDiS {
edgeInRank
.
clear
();
for
(
int
i
=
0
;
i
<
nSize
;
i
++
)
{
DofEdge
edge
;
map
<
int
,
ElementObjectData
>
data
;
flat_
map
<
int
,
ElementObjectData
>
data
;
SerUtil
::
deserialize
(
in
,
edge
);
deserialize
(
in
,
data
);
edgeInRank
[
edge
]
=
data
;
...
...
@@ -977,7 +978,7 @@ namespace AMDiS {
faceInRank
.
clear
();
for
(
int
i
=
0
;
i
<
nSize
;
i
++
)
{
DofFace
face
;
map
<
int
,
ElementObjectData
>
data
;
flat_
map
<
int
,
ElementObjectData
>
data
;
SerUtil
::
deserialize
(
in
,
face
);
deserialize
(
in
,
data
);
faceInRank
[
face
]
=
data
;
...
...
@@ -1055,11 +1056,11 @@ namespace AMDiS {
void
ElementObjectDatabase
::
serialize
(
ostream
&
out
,
map
<
int
,
ElementObjectData
>&
data
)
flat_
map
<
int
,
ElementObjectData
>&
data
)
{
int
nSize
=
data
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
int
,
ElementObjectData
>::
iterator
it
=
data
.
begin
();
for
(
flat_
map
<
int
,
ElementObjectData
>::
iterator
it
=
data
.
begin
();
it
!=
data
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
it
->
second
.
serialize
(
out
);
...
...
@@ -1068,7 +1069,7 @@ namespace AMDiS {
void
ElementObjectDatabase
::
deserialize
(
istream
&
in
,
map
<
int
,
ElementObjectData
>&
data
)
flat_
map
<
int
,
ElementObjectData
>&
data
)
{
int
nSize
;
SerUtil
::
deserialize
(
in
,
nSize
);
...
...
@@ -1093,6 +1094,7 @@ namespace AMDiS {
const
unsigned
int
faceSize
=
sizeof
(
DofFace
);
const
unsigned
int
vectorOverhead
=
sizeof
(
vector
<
int
>
);
const
unsigned
int
mapOverhead
=
48
;
//sizeof(_Rb_tree<int, int>);
const
unsigned
int
flatMapOverhead
=
24
;
const
unsigned
int
mapEntryOverhead
=
40
;
// sizeof(_Rb_tree_node_base);
const
unsigned
int
setOverhead
=
48
;
const
unsigned
int
setEntryOverhead
=
40
;
...
...
@@ -1127,41 +1129,38 @@ namespace AMDiS {
tmp
=
0
;
// vertexLocalMap
tmp
+=
m
apOverhead
+
vertexLocalMap
.
size
()
*
(
mapEntryOverhead
+
structElObjDataSize
+
dofSize
);
tmp
+=
flatM
apOverhead
+
vertexLocalMap
.
size
()
*
(
structElObjDataSize
+
dofSize
);
// edgeLocalMap
tmp
+=
m
apOverhead
+
edgeLocalMap
.
size
()
*
(
mapEntryOverhead
+
structElObjDataSize
+
edgeSize
);
tmp
+=
flatM
apOverhead
+
edgeLocalMap
.
size
()
*
(
structElObjDataSize
+
edgeSize
);
// faceLocalMap
tmp
+=
m
apOverhead
+
faceLocalMap
.
size
()
*
(
mapEntryOverhead
+
structElObjDataSize
+
faceSize
);
tmp
+=
flatM
apOverhead
+
faceLocalMap
.
size
()
*
(
structElObjDataSize
+
faceSize
);
MSG
(
"EL-OBJ-DB MEM 04: %d
\n
"
,
tmp
);
value
+=
tmp
;
// vertexInRank
tmp
=
mapOverhead
+
vertexInRank
.
size
()
*
mapEntry
Overhead
;
for
(
map
<
DegreeOfFreedom
,
map
<
int
,
ElementObjectData
>
>::
iterator
mapIt
=
tmp
=
flatMap
Overhead
;
for
(
flat_
map
<
DegreeOfFreedom
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
mapIt
=
vertexInRank
.
begin
();
mapIt
!=
vertexInRank
.
end
();
++
mapIt
)
tmp
+=
dofSize
+
mapOverhead
+
mapIt
->
second
.
size
()
*
(
mapEntryOverhead
+
sizeof
(
int
)
+
structElObjDataSize
);
tmp
+=
dofSize
+
flatMapOverhead
+
mapIt
->
second
.
size
()
*
(
sizeof
(
int
)
+
structElObjDataSize
);
MSG
(
"EL-OBJ-DB MEM 05: %d
\n
"
,
tmp
);
value
+=
tmp
;
// edgeInRank
tmp
+
=
mapOverhead
+
edgeInRank
.
size
()
*
mapEntryOverhead
;
for
(
map
<
DofEdge
,
map
<
int
,
ElementObjectData
>
>::
iterator
mapIt
=
tmp
=
mapOverhead
;
for
(
flat_
map
<
DofEdge
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
mapIt
=
edgeInRank
.
begin
();
mapIt
!=
edgeInRank
.
end
();
++
mapIt
)
tmp
+=
edgeSize
+
mapOverhead
+
mapIt
->
second
.
size
()
*
(
mapEntryOverhead
+
sizeof
(
int
)
+
structElObjDataSize
);
tmp
+=
edgeSize
+
flatMapOverhead
+
mapIt
->
second
.
size
()
*
(
sizeof
(
int
)
+
structElObjDataSize
);
MSG
(
"EL-OBJ-DB MEM 06: %d
\n
"
,
tmp
);
value
+=
tmp
;
// faceInRank
tmp
=
mapOverhead
+
faceInRank
.
size
()
*
mapEntryOverhead
;
for
(
map
<
DofFace
,
map
<
int
,
ElementObjectData
>
>::
iterator
mapIt
=
tmp
=
mapOverhead
;
for
(
flat_
map
<
DofFace
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
mapIt
=
faceInRank
.
begin
();
mapIt
!=
faceInRank
.
end
();
++
mapIt
)
tmp
+=
faceSize
+
mapOverhead
+
mapIt
->
second
.
size
()
*
(
mapEntryOverhead
+
sizeof
(
int
)
+
structElObjDataSize
);
tmp
+=
faceSize
+
flatMapOverhead
+
mapIt
->
second
.
size
()
*
(
sizeof
(
int
)
+
structElObjDataSize
);
MSG
(
"EL-OBJ-DB MEM 07: %d
\n
"
,
tmp
);
value
+=
tmp
;
tmp
=
0
;
...
...
AMDiS/src/parallel/ElementObjectDatabase.h
View file @
2d6d2384
...
...
@@ -27,6 +27,7 @@
#include <vector>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <boost/container/flat_map.hpp>
#include "AMDiS_fwd.h"
#include "Containers.h"
...
...
@@ -39,6 +40,8 @@ namespace AMDiS {
using
namespace
std
;
using
boost
::
container
::
flat_map
;
/// Just to templatize the typedef.
template
<
typename
T
>
struct
PerBoundMap
{
...
...
@@ -210,7 +213,7 @@ namespace AMDiS {
/// Returns the data of the current iterator position.
map
<
int
,
ElementObjectData
>&
getIterateData
()
flat_
map
<
int
,
ElementObjectData
>&
getIterateData
()
{
switch
(
iterGeoPos
)
{
case
VERTEX
:
...
...
@@ -315,7 +318,7 @@ namespace AMDiS {
/// the vertex, the element with the highest element index is given. If the
/// vertex is not contained in a rank's subdomain, it will not be considered
/// in this mapping.
map
<
int
,
ElementObjectData
>&
getElementsInRank
(
DegreeOfFreedom
vertex
)
flat_
map
<
int
,
ElementObjectData
>&
getElementsInRank
(
DegreeOfFreedom
vertex
)
{
return
vertexInRank
[
vertex
];
}
...
...
@@ -326,7 +329,7 @@ namespace AMDiS {
/// the edge, the element with the highest element index is given. If the
/// edge is not contained in a rank's subdomain, it will not be considered
/// in this mapping.
map
<
int
,
ElementObjectData
>&
getElementsInRank
(
DofEdge
edge
)
flat_
map
<
int
,
ElementObjectData
>&
getElementsInRank
(
DofEdge
edge
)
{
return
edgeInRank
[
edge
];
}
...
...
@@ -335,7 +338,7 @@ namespace AMDiS {
/// element data objects, which identify on the rank the element which
/// contains this face. If the face is not contained in a rank's subdomain,
/// it will not be considered in this mapping.
map
<
int
,
ElementObjectData
>&
getElementsInRank
(
DofFace
face
)
flat_
map
<
int
,
ElementObjectData
>&
getElementsInRank
(
DofFace
face
)
{
return
faceInRank
[
face
];
}
...
...
@@ -483,10 +486,10 @@ namespace AMDiS {
void
deserialize
(
istream
&
in
,
vector
<
ElementObjectData
>&
elVec
);
/// Some auxiliary function to write the element object database to disk.
void
serialize
(
ostream
&
out
,
map
<
int
,
ElementObjectData
>&
data
);
void
serialize
(
ostream
&
out
,
flat_
map
<
int
,
ElementObjectData
>&
data
);
/// Some auxiliary function to read the element object database from disk.
void
deserialize
(
istream
&
in
,
map
<
int
,
ElementObjectData
>&
data
);
void
deserialize
(
istream
&
in
,
flat_
map
<
int
,
ElementObjectData
>&
data
);
int
getOwner
(
vector
<
ElementObjectData
>&
objData
,
int
level
);
private:
...
...
@@ -507,36 +510,36 @@ namespace AMDiS {
/// Maps to an element object the corresponding vertex DOF.
map
<
ElementObjectData
,
DegreeOfFreedom
>
vertexLocalMap
;
flat_
map
<
ElementObjectData
,
DegreeOfFreedom
>
vertexLocalMap
;
/// Maps to an element object the corresponding edge.
map
<
ElementObjectData
,
DofEdge
>
edgeLocalMap
;
flat_
map
<
ElementObjectData
,
DofEdge
>
edgeLocalMap
;
/// Maps to an element object the corresponding face.
map
<
ElementObjectData
,
DofFace
>
faceLocalMap
;
flat_
map
<
ElementObjectData
,
DofFace
>
faceLocalMap
;
/// Defines to each vertex DOF a map that maps to each rank number the element
/// objects that have this vertex DOF in common.
map
<
DegreeOfFreedom
,
map
<
int
,
ElementObjectData
>
>
vertexInRank
;
flat_
map
<
DegreeOfFreedom
,
flat_
map
<
int
,
ElementObjectData
>
>
vertexInRank
;
/// Defines to each edge a map that maps to each rank number the element
/// objects that have this edge in common.
map
<
DofEdge
,
map
<
int
,
ElementObjectData
>
>
edgeInRank
;
flat_
map
<
DofEdge
,
flat_
map
<
int
,
ElementObjectData
>
>
edgeInRank
;
/// Defines to each face a map that maps to each rank number the element
/// objects that have this face in common.
map
<
DofFace
,
map
<
int
,
ElementObjectData
>
>
faceInRank
;
flat_
map
<
DofFace
,
flat_
map
<
int
,
ElementObjectData
>
>
faceInRank
;
/// Vertex iterator to iterate over \ref vertexInRank
map
<
DegreeOfFreedom
,
map
<
int
,
ElementObjectData
>
>::
iterator
vertexIter
;
flat_
map
<
DegreeOfFreedom
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
vertexIter
;
/// Edge iterator to iterate over \ref edgeInRank
map
<
DofEdge
,
map
<
int
,
ElementObjectData
>
>::
iterator
edgeIter
;
flat_
map
<
DofEdge
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
edgeIter
;
/// Face iterator to iterate over \ref faceInRank
map
<
DofFace
,
map
<
int
,
ElementObjectData
>
>::
iterator
faceIter
;
flat_
map
<
DofFace
,
flat_
map
<
int
,
ElementObjectData
>
>::
iterator
faceIter
;
/// Defines the geometrical iteration index of the iterators. I.e., the value
...
...
AMDiS/src/parallel/InteriorBoundary.cc
View file @
2d6d2384
...
...
@@ -49,7 +49,7 @@ namespace AMDiS {
GeoIndex
geoIndex
=
INDEX_OF_DIM
(
geoPos
,
mesh
->
getDim
());
while
(
elObjDb
.
iterate
(
geoIndex
))
{
map
<
int
,
ElementObjectData
>&
objData
=
elObjDb
.
getIterateData
();
flat_
map
<
int
,
ElementObjectData
>&
objData
=
elObjDb
.
getIterateData
();
// Test, if this is a boundary object of this rank.
if
(
!
(
objData
.
count
(
globalMpiRank
)
&&
objData
.
size
()
>
1
))
...
...
@@ -61,7 +61,7 @@ namespace AMDiS {
if
(
allRanks
)
{
boundaryWithinMpiGroup
=
true
;
}
else
{
for
(
map
<
int
,
ElementObjectData
>::
iterator
it
=
objData
.
begin
();
for
(
flat_
map
<
int
,
ElementObjectData
>::
iterator
it
=
objData
.
begin
();
it
!=
objData
.
end
();
++
it
)
{
if
(
it
->
first
!=
globalMpiRank
&&
levelRanks
.
count
(
it
->
first
))
{
boundaryWithinMpiGroup
=
true
;
...
...
@@ -95,7 +95,7 @@ namespace AMDiS {
if
(
owner
==
globalMpiRank
)
{
for
(
map
<
int
,
ElementObjectData
>::
iterator
it2
=
objData
.
begin
();
for
(
flat_
map
<
int
,
ElementObjectData
>::
iterator
it2
=
objData
.
begin
();
it2
!=
objData
.
end
();
++
it2
)
{
if
(
it2
->
first
==
globalMpiRank
)
continue
;
...
...
@@ -162,7 +162,7 @@ namespace AMDiS {
ElementObjectData
&
perDofEl0
=
elObjDb
.
getElementsInRank
(
it
->
first
.
first
)[
globalMpiRank
];
for
(
map
<
int
,
ElementObjectData
>::
iterator
elIt
=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
();
for
(
flat_
map
<
int
,
ElementObjectData
>::
iterator
elIt
=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
();
elIt
!=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
end
();
++
elIt
)
{
int
otherElementRank
=
elIt
->
first
;
...
...
@@ -185,7 +185,7 @@ namespace AMDiS {
if
(
removePeriodicBoundary
)
{
bound
.
type
=
INTERIOR
;
map
<
int
,
ElementObjectData
>
objData
=
flat_
map
<
int
,
ElementObjectData
>
objData
=
elObjDb
.
getElementsInRank
(
it
->
first
.
first
);
objData
.
insert
(
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
(),
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
end
());
...
...
@@ -255,7 +255,7 @@ namespace AMDiS {
ElementObjectData
&
perEdgeEl0
=
elObjDb
.
getElementsInRank
(
it
->
first
.
first
)[
globalMpiRank
];
for
(
map
<
int
,
ElementObjectData
>::
iterator
elIt
=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
();
for
(
flat_
map
<
int
,
ElementObjectData
>::
iterator
elIt
=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
();
elIt
!=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
end
();
++
elIt
)
{
int
otherElementRank
=
elIt
->
first
;
...
...
@@ -277,7 +277,7 @@ namespace AMDiS {
if
(
removePeriodicBoundary
)
{
bound
.
type
=
INTERIOR
;
map
<
int
,
ElementObjectData
>
objData
=
flat_
map
<
int
,
ElementObjectData
>
objData
=
elObjDb
.
getElementsInRank
(
it
->
first
.
first
);
objData
.
insert
(
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
(),
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
end
());
...
...
@@ -337,7 +337,7 @@ namespace AMDiS {
ElementObjectData
&
perFaceEl0
=
elObjDb
.
getElementsInRank
(
it
->
first
.
first
)[
globalMpiRank
];
for
(
map
<
int
,
ElementObjectData
>::
iterator
elIt
=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
();
for
(
flat_
map
<
int
,
ElementObjectData
>::
iterator
elIt
=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
();
elIt
!=
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
end
();
++
elIt
)
{
int
otherElementRank
=
elIt
->
first
;
...
...
@@ -359,7 +359,7 @@ namespace AMDiS {
if
(
removePeriodicBoundary
)
{
bound
.
type
=
INTERIOR
;
map
<
int
,
ElementObjectData
>
objData
=
flat_
map
<
int
,
ElementObjectData
>
objData
=
elObjDb
.
getElementsInRank
(
it
->
first
.
first
);
objData
.
insert
(
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
begin
(),
elObjDb
.
getElementsInRank
(
it
->
first
.
second
).
end
());
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment