Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
dune-alugrid
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ag-ohlberger
dune-community
dune-alugrid
Commits
66d268f3
Commit
66d268f3
authored
11 years ago
by
Robert Kloefkorn
Browse files
Options
Downloads
Patches
Plain Diff
added some safety checks for multi-thread mode.
parent
442bd0fd
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
dune/alugrid/common/memory.hh
+70
-31
70 additions, 31 deletions
dune/alugrid/common/memory.hh
with
70 additions
and
31 deletions
dune/alugrid/common/memory.hh
+
70
−
31
View file @
66d268f3
...
@@ -30,17 +30,54 @@ namespace Dune
...
@@ -30,17 +30,54 @@ namespace Dune
enum
{
maxStackObjects
=
256
};
enum
{
maxStackObjects
=
256
};
typedef
::
ALUGrid
::
ALUGridFiniteStack
<
Object
*
,
maxStackObjects
>
StackType
;
typedef
::
ALUGrid
::
ALUGridFiniteStack
<
Object
*
,
maxStackObjects
>
StackType
;
// stack to store object pointers
StackType
objStack_
;
StackType
objStack_
;
// thread number
int
thread_
;
// return reference to object stack
StackType
&
objStack
()
{
return
objStack_
;
}
StackType
&
objStack
()
{
return
objStack_
;
}
public
:
public
:
// type of object to be stored
typedef
Object
ObjectType
;
typedef
Object
ObjectType
;
//! default constructor
// return thread number
ALUMemoryProviderSingleThread
()
{}
static
inline
int
thread
()
{
#ifdef _OPENMP
return
omp_get_thread_num
();
#elif HAVE_DUNE_FEM
return
Fem
::
ThreadManager
::
thread
()
;
#else
return
0
;
#endif
}
// return maximal possible number of threads
static
inline
int
maxThreads
()
{
#ifdef _OPENMP
return
omp_get_max_threads
();
#elif HAVE_DUNE_FEM
return
Fem
::
ThreadManager
::
maxThreads
()
;
#else
return
1
;
#endif
}
//! default constructor
ALUMemoryProviderSingleThread
()
:
objStack_
(),
thread_
(
-
1
)
{}
//! copy constructor
//! copy constructor
ALUMemoryProviderSingleThread
(
const
ALUMemoryProviderSingleThread
&
org
)
:
objStack_
()
{}
ALUMemoryProviderSingleThread
(
const
ALUMemoryProviderSingleThread
&
org
)
:
objStack_
(),
thread_
(
org
.
thread_
)
{}
//! set thread number this memory provider works for
void
setThreadNumber
(
const
int
thread
)
{
thread_
=
thread
;
}
//! call deleteEntity
//! call deleteEntity
~
ALUMemoryProviderSingleThread
();
~
ALUMemoryProviderSingleThread
();
...
@@ -51,7 +88,7 @@ namespace Dune
...
@@ -51,7 +88,7 @@ namespace Dune
//! i.e. return pointer to Entity
//! i.e. return pointer to Entity
template
<
class
FactoryType
,
class
EntityImp
>
template
<
class
FactoryType
,
class
EntityImp
>
inline
ObjectType
*
getEntityObject
(
const
FactoryType
&
factory
,
int
level
,
EntityImp
*
fakePtr
)
inline
ObjectType
*
getEntityObject
(
const
FactoryType
&
factory
,
int
level
,
EntityImp
*
)
{
{
if
(
objStack
().
empty
()
)
if
(
objStack
().
empty
()
)
{
{
...
@@ -64,7 +101,7 @@ namespace Dune
...
@@ -64,7 +101,7 @@ namespace Dune
}
}
//! return object, if created default constructor is used
//! return object, if created default constructor is used
ObjectType
*
getEmptyObject
();
ObjectType
*
getEmptyObject
();
//! free, move element to stack, returns NULL
//! free, move element to stack, returns NULL
void
freeObject
(
ObjectType
*
obj
);
void
freeObject
(
ObjectType
*
obj
);
...
@@ -72,6 +109,9 @@ namespace Dune
...
@@ -72,6 +109,9 @@ namespace Dune
protected
:
protected
:
inline
ObjectType
*
stackObject
()
inline
ObjectType
*
stackObject
()
{
{
// make sure we operate on the correct thread
alugrid_assert
(
thread_
==
thread
()
);
// make sure stack is not empty
alugrid_assert
(
!
objStack
().
empty
()
);
alugrid_assert
(
!
objStack
().
empty
()
);
// finite stack does also return object on pop
// finite stack does also return object on pop
return
objStack
().
pop
();
return
objStack
().
pop
();
...
@@ -85,9 +125,9 @@ namespace Dune
...
@@ -85,9 +125,9 @@ namespace Dune
//
//
//************************************************************************
//************************************************************************
template
<
class
Object
>
template
<
class
FactoryType
>
template
<
class
Object
>
template
<
class
FactoryType
>
inline
typename
ALUMemoryProviderSingleThread
<
Object
>::
ObjectType
*
inline
typename
ALUMemoryProviderSingleThread
<
Object
>::
ObjectType
*
ALUMemoryProviderSingleThread
<
Object
>::
getObject
ALUMemoryProviderSingleThread
<
Object
>::
(
const
FactoryType
&
factory
,
int
level
)
getObject
(
const
FactoryType
&
factory
,
int
level
)
{
{
if
(
objStack
().
empty
()
)
if
(
objStack
().
empty
()
)
{
{
...
@@ -126,7 +166,9 @@ namespace Dune
...
@@ -126,7 +166,9 @@ namespace Dune
template
<
class
Object
>
template
<
class
Object
>
inline
void
ALUMemoryProviderSingleThread
<
Object
>::
freeObject
(
Object
*
obj
)
inline
void
ALUMemoryProviderSingleThread
<
Object
>::
freeObject
(
Object
*
obj
)
{
{
// make sure we operate on the correct thread
alugrid_assert
(
thread_
==
thread
()
);
StackType
&
stk
=
objStack
();
StackType
&
stk
=
objStack
();
if
(
stk
.
full
()
)
if
(
stk
.
full
()
)
delete
obj
;
delete
obj
;
...
@@ -148,39 +190,36 @@ namespace Dune
...
@@ -148,39 +190,36 @@ namespace Dune
return
memProviders_
[
thread
];
return
memProviders_
[
thread
];
}
}
public
:
void
init
()
// return thread number
static
inline
int
thread
()
{
{
#ifdef _OPENMP
const
int
threads
=
maxThreads
();
return
omp_get_thread_num
();
for
(
int
thread
=
0
;
thread
<
threads
;
++
thread
)
#elif HAVE_DUNE_FEM
{
return
Fem
::
ThreadManager
::
thread
()
;
memProviders_
[
thread
].
setThreadNumber
(
thread
);
#else
}
return
0
;
#endif
}
}
public
:
// return thread number
static
inline
int
thread
()
{
return
MemoryProvider
::
thread
();
}
// return maximal possible number of threads
// return maximal possible number of threads
static
inline
int
maxThreads
()
static
inline
int
maxThreads
()
{
return
MemoryProvider
::
maxThreads
();
}
{
#ifdef _OPENMP
return
omp_get_max_threads
();
#elif HAVE_DUNE_FEM
return
Fem
::
ThreadManager
::
maxThreads
()
;
#else
return
1
;
#endif
}
// type of stored object
// type of stored object
typedef
Object
ObjectType
;
typedef
Object
ObjectType
;
//! default constructor
//! default constructor
ALUMemoryProvider
()
:
memProviders_
(
maxThreads
()
)
{}
ALUMemoryProvider
()
:
memProviders_
(
maxThreads
()
)
{
init
();
}
//! copy constructor (don't copy memory providers)
//! copy constructor (don't copy memory providers)
ALUMemoryProvider
(
const
ALUMemoryProvider
&
org
)
:
memProviders_
(
maxThreads
()
)
{}
ALUMemoryProvider
(
const
ALUMemoryProvider
&
org
)
:
memProviders_
(
maxThreads
()
)
{
init
();
}
//! i.e. return pointer to Entity
//! i.e. return pointer to Entity
template
<
class
FactoryType
>
template
<
class
FactoryType
>
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment