Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
iwr
amdis
Commits
2620c115
Commit
2620c115
authored
Nov 02, 2012
by
Thomas Witkowski
Browse files
Some performance issues, part III. ElementObjectDatabase requires now onl 10% of the memory.
parent
2d6d2384
Changes
2
Show whitespace changes
Inline
Side-by-side
AMDiS/src/parallel/ElementObjectDatabase.cc
View file @
2620c115
...
...
@@ -23,6 +23,14 @@ namespace AMDiS {
macroElementRankMap
=
&
rankMap
;
levelData
=
&
ld
;
// === Reset temporary data ===
tmpVertexElements
.
clear
();
tmpEdgeElements
.
clear
();
tmpFaceElements
.
clear
();
// === Fills macro element data structures. ===
TraverseStack
stack
;
...
...
@@ -43,6 +51,26 @@ namespace AMDiS {
elInfo
=
stack
.
traverseNext
(
elInfo
);
}
// === Move temporary data to original one ===
for
(
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
it
=
tmpVertexElements
.
begin
();
it
!=
tmpVertexElements
.
end
();
++
it
)
vertexElements
[
it
->
first
]
=
it
->
second
;
tmpVertexElements
.
clear
();
for
(
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
it
=
tmpEdgeElements
.
begin
();
it
!=
tmpEdgeElements
.
end
();
++
it
)
edgeElements
[
it
->
first
]
=
it
->
second
;
tmpEdgeElements
.
clear
();
for
(
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
it
=
tmpFaceElements
.
begin
();
it
!=
tmpFaceElements
.
end
();
++
it
)
faceElements
[
it
->
first
]
=
it
->
second
;
tmpFaceElements
.
clear
();
// Handle periodic boudaries
createPeriodicData
();
...
...
@@ -186,7 +214,7 @@ namespace AMDiS {
int
elIndex
=
el
->
getIndex
();
ElementObjectData
elObj
(
elIndex
,
ith
);
v
ertexElements
[
vertex
].
push_back
(
elObj
);
tmpV
ertexElements
[
vertex
].
push_back
(
elObj
);
vertexLocalMap
[
elObj
]
=
vertex
;
}
...
...
@@ -199,7 +227,7 @@ namespace AMDiS {
int
elIndex
=
el
->
getIndex
();
ElementObjectData
elObj
(
elIndex
,
ith
);
e
dgeElements
[
edge
].
push_back
(
elObj
);
tmpE
dgeElements
[
edge
].
push_back
(
elObj
);
edgeLocalMap
[
elObj
]
=
edge
;
}
...
...
@@ -210,7 +238,7 @@ namespace AMDiS {
int
elIndex
=
el
->
getIndex
();
ElementObjectData
elObj
(
elIndex
,
ith
);
f
aceElements
[
face
].
push_back
(
elObj
);
tmpF
aceElements
[
face
].
push_back
(
elObj
);
faceLocalMap
[
elObj
]
=
face
;
}
...
...
@@ -469,7 +497,7 @@ namespace AMDiS {
TEST_EXIT
(
macroElementRankMap
)(
"Should not happen!
\n
"
);
vertexInRank
.
clear
();
for
(
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
it
=
vertexElements
.
begin
();
for
(
flat_
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
it
=
vertexElements
.
begin
();
it
!=
vertexElements
.
end
();
++
it
)
{
for
(
vector
<
ElementObjectData
>::
iterator
it2
=
it
->
second
.
begin
();
it2
!=
it
->
second
.
end
();
++
it2
)
{
...
...
@@ -480,7 +508,7 @@ namespace AMDiS {
}
edgeInRank
.
clear
();
for
(
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
it
=
edgeElements
.
begin
();
for
(
flat_
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
it
=
edgeElements
.
begin
();
it
!=
edgeElements
.
end
();
++
it
)
{
for
(
vector
<
ElementObjectData
>::
iterator
it2
=
it
->
second
.
begin
();
it2
!=
it
->
second
.
end
();
++
it2
)
{
...
...
@@ -491,7 +519,7 @@ namespace AMDiS {
}
faceInRank
.
clear
();
for
(
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
it
=
faceElements
.
begin
();
for
(
flat_
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
it
=
faceElements
.
begin
();
it
!=
faceElements
.
end
();
++
it
)
{
for
(
vector
<
ElementObjectData
>::
iterator
it2
=
it
->
second
.
begin
();
it2
!=
it
->
second
.
end
();
++
it2
)
{
...
...
@@ -547,7 +575,7 @@ namespace AMDiS {
// === First, create reverse modes for all "directly" neighbouring elements. ===
for
(
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
edgeIt
=
edgeElements
.
begin
();
for
(
flat_
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
edgeIt
=
edgeElements
.
begin
();
edgeIt
!=
edgeElements
.
end
();
++
edgeIt
)
{
vector
<
ElementObjectData
>&
els
=
edgeIt
->
second
;
...
...
@@ -572,7 +600,7 @@ namespace AMDiS {
}
}
for
(
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
faceIt
=
faceElements
.
begin
();
for
(
flat_
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
faceIt
=
faceElements
.
begin
();
faceIt
!=
faceElements
.
end
();
++
faceIt
)
{
vector
<
ElementObjectData
>&
els
=
faceIt
->
second
;
...
...
@@ -771,7 +799,7 @@ namespace AMDiS {
int
nSize
=
vertexElements
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
it
=
vertexElements
.
begin
();
for
(
flat_
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
it
=
vertexElements
.
begin
();
it
!=
vertexElements
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
serialize
(
out
,
it
->
second
);
...
...
@@ -779,7 +807,7 @@ namespace AMDiS {
nSize
=
edgeElements
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
it
=
edgeElements
.
begin
();
for
(
flat_
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
it
=
edgeElements
.
begin
();
it
!=
edgeElements
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
serialize
(
out
,
it
->
second
);
...
...
@@ -787,7 +815,7 @@ namespace AMDiS {
nSize
=
faceElements
.
size
();
SerUtil
::
serialize
(
out
,
nSize
);
for
(
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
it
=
faceElements
.
begin
();
for
(
flat_
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
it
=
faceElements
.
begin
();
it
!=
faceElements
.
end
();
++
it
)
{
SerUtil
::
serialize
(
out
,
it
->
first
);
serialize
(
out
,
it
->
second
);
...
...
@@ -1104,24 +1132,24 @@ namespace AMDiS {
unsigned
long
tmp
=
0
;
// vertexElements
tmp
=
mapOverhead
+
vertexElements
.
size
()
*
mapEntry
Overhead
;
for
(
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
mapIt
=
tmp
=
flatMap
Overhead
;
for
(
flat_
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>::
iterator
mapIt
=
vertexElements
.
begin
();
mapIt
!=
vertexElements
.
end
();
++
mapIt
)
tmp
+=
dofSize
+
vectorOverhead
+
mapIt
->
second
.
size
()
*
structElObjDataSize
;
MSG
(
"EL-OBJ-DB MEM 01: %d
\n
"
,
tmp
);
value
+=
tmp
;
// edgeElements
tmp
=
mapOverhead
+
edgeElements
.
size
()
*
mapEntry
Overhead
;
for
(
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
mapIt
=
tmp
=
flatMap
Overhead
;
for
(
flat_
map
<
DofEdge
,
vector
<
ElementObjectData
>
>::
iterator
mapIt
=
edgeElements
.
begin
();
mapIt
!=
edgeElements
.
end
();
++
mapIt
)
tmp
+=
dofSize
+
vectorOverhead
+
mapIt
->
second
.
size
()
*
structElObjDataSize
;
MSG
(
"EL-OBJ-DB MEM 02: %d
\n
"
,
tmp
);
value
+=
tmp
;
// faceElements
tmp
+
=
mapOverhead
+
faceElements
.
size
()
*
mapEntry
Overhead
;
for
(
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
mapIt
=
tmp
=
flatMap
Overhead
;
for
(
flat_
map
<
DofFace
,
vector
<
ElementObjectData
>
>::
iterator
mapIt
=
faceElements
.
begin
();
mapIt
!=
faceElements
.
end
();
++
mapIt
)
tmp
+=
dofSize
+
vectorOverhead
+
mapIt
->
second
.
size
()
*
structElObjDataSize
;
MSG
(
"EL-OBJ-DB MEM 03: %d
\n
"
,
tmp
);
...
...
@@ -1176,10 +1204,10 @@ namespace AMDiS {
tmp
+=
setOverhead
+
faceReverseMode
.
size
()
*
(
setEntryOverhead
+
2
*
structElObjDataSize
);
// macroElIndexMap
tmp
+=
m
apOverhead
+
macroElIndexMap
.
size
()
*
(
mapEntryOverhead
+
sizeof
(
int
)
+
sizeof
(
int
*
));
tmp
+=
flatM
apOverhead
+
macroElIndexMap
.
size
()
*
(
sizeof
(
int
)
+
sizeof
(
int
*
));
// macroElIndexTypeMap
tmp
+=
m
apOverhead
+
macroElIndexTypeMap
.
size
()
*
(
mapEntryOverhead
+
sizeof
(
int
)
+
sizeof
(
int
*
));
tmp
+=
flatM
apOverhead
+
macroElIndexTypeMap
.
size
()
*
(
sizeof
(
int
)
+
sizeof
(
int
));
MSG
(
"EL-OBJ-DB MEM 08: %d
\n
"
,
tmp
);
value
+=
tmp
;
...
...
AMDiS/src/parallel/ElementObjectDatabase.h
View file @
2620c115
...
...
@@ -50,6 +50,8 @@ namespace AMDiS {
};
#pragma pack(push)
#pragma pack(1)
/// Defines one element object. This may be either a vertex, edge or face.
struct
ElementObjectData
{
ElementObjectData
(
int
a
=
-
1
,
int
b
=
0
)
...
...
@@ -61,7 +63,7 @@ namespace AMDiS {
int
elIndex
;
/// Index of the object within the element.
int
ithObject
;
char
ithObject
;
/// Write this element object to disk.
void
serialize
(
ostream
&
out
)
const
...
...
@@ -90,7 +92,7 @@ namespace AMDiS {
(
elIndex
==
rhs
.
elIndex
&&
ithObject
<
rhs
.
ithObject
));
}
};
#pragma pack(pop)
/** \brief
...
...
@@ -499,14 +501,26 @@ namespace AMDiS {
/// the database.
Mesh
*
mesh
;
/// Maps to each vertex DOF all element objects that represent this vertex.
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>
vertexElements
;
flat_
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>
vertexElements
;
/// Maps to each edge all element objects that represent this edge.
map
<
DofEdge
,
vector
<
ElementObjectData
>
>
edgeElements
;
flat_
map
<
DofEdge
,
vector
<
ElementObjectData
>
>
edgeElements
;
/// Maps to each face all element objects that represent this edge.
map
<
DofFace
,
vector
<
ElementObjectData
>
>
faceElements
;
flat_map
<
DofFace
,
vector
<
ElementObjectData
>
>
faceElements
;
/// Temporary object to speed up creation of \ref vertexElements
map
<
DegreeOfFreedom
,
vector
<
ElementObjectData
>
>
tmpVertexElements
;
/// Temporary object to speed up creation of \ref edgeElements
map
<
DofEdge
,
vector
<
ElementObjectData
>
>
tmpEdgeElements
;
/// Temporary object to speed up creation of \ref faceElements
map
<
DofFace
,
vector
<
ElementObjectData
>
>
tmpFaceElements
;
/// Maps to an element object the corresponding vertex DOF.
...
...
@@ -576,10 +590,10 @@ namespace AMDiS {
map
<
int
,
int
>
*
macroElementRankMap
;
/// Maps to each macro element index a pointer to the corresponding element.
map
<
int
,
Element
*>
macroElIndexMap
;
flat_
map
<
int
,
Element
*>
macroElIndexMap
;
/// Maps to each macro element index the type of this element.
map
<
int
,
int
>
macroElIndexTypeMap
;
flat_
map
<
int
,
int
>
macroElIndexTypeMap
;
MeshLevelData
*
levelData
;
};
...
...
Write
Preview
Supports
Markdown
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