Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F88428633
loop_omp.hh
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Oct 18, 18:17
Size
2 KB
Mime Type
text/x-c++
Expires
Sun, Oct 20, 18:17 (1 d, 21 h)
Engine
blob
Format
Raw Data
Handle
21766777
Attached To
rTAMAAS tamaas
loop_omp.hh
View Options
/**
*
* @author Lucas Frérot <lucas.frerot@epfl.ch>
*
* @section LICENSE
*
* Copyright (©) 2017 EPFL (Ecole Polytechnique Fédérale de
* Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des
* Solides)
*
* Tamaas is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* Tamaas is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Tamaas. If not, see <http://www.gnu.org/licenses/>.
*
*/
/* -------------------------------------------------------------------------- */
#ifndef __LOOP_OMP_HH__
#define __LOOP_OMP_HH__
/* -------------------------------------------------------------------------- */
#include "loop.hh"
#include "loop_utils.hh"
/* -------------------------------------------------------------------------- */
__BEGIN_TAMAAS__
namespace
detail
{
template
<
typename
Functor
,
typename
...
Grids
>
void
exec_loop_omp
(
Functor
&&
func
,
Grids
&&
...
grids
)
{
#pragma omp parallel for
for
(
UInt
index
=
0
;
index
<
loopSize
(
grids
...)
;
++
index
)
{
func
(
grids
(
index
)...);
}
}
template
<
operation
op
,
typename
Functor
,
typename
...
Grids
>
auto
reduce_loop_omp
(
Functor
&&
func
,
Grids
&&
...
grids
)
->
decltype
(
func
(
grids
(
0
)...))
{
using
ret_type
=
decltype
(
func
(
grids
(
0
)...));
ret_type
res
=
reduction_helper
<
op
>::
template
init
<
ret_type
>
();
#pragma omp parallel
{
ret_type
res_local
=
res
;
#pragma omp for
for
(
UInt
index
=
0
;
index
<
loopSize
(
grids
...)
;
++
index
)
{
reduction_helper
<
op
>::
reduce
(
res_local
,
func
(
grids
(
index
)...));
}
#pragma omp critical
reduction_helper
<
op
>::
reduce
(
res
,
res_local
);
}
return
res
;
}
}
__END_TAMAAS__
#endif
// __LOOP_PROXY_HH__
Event Timeline
Log In to Comment