Skip to content
Snippets Groups Projects
Commit daebbce1 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Fixed StaticFor for loops with a large iterations count

parent 55ded6ad
No related branches found
No related tags found
1 merge request!18NDArray
......@@ -14,25 +14,47 @@
namespace TNL {
// Manual unrolling does not make sense for loops with a large iterations
// count. For a very large iterations count it would trigger the compiler's
// limit on recursive template instantiation. Also note that the compiler
// will (at least partially) unroll loops with static bounds anyway.
template< int Begin, int End, bool unrolled = (End - Begin <= 8) >
struct StaticFor;
template< int Begin, int End >
struct StaticFor
struct StaticFor< Begin, End, true >
{
template< typename Function, typename... Args >
__cuda_callable__
static void exec( const Function& f, Args... args )
{
static_assert( Begin < End, "Wrong index interval for StaticFor. Being must be lower than end." );
f( Begin, args... );
StaticFor< Begin + 1, End >::exec( f, args... );
};
static_assert( Begin < End, "Wrong index interval for StaticFor. Begin must be less than end." );
template< typename Function, typename... Args >
__cuda_callable__
static void exec( const Function& f, Args... args )
{
f( Begin, args... );
StaticFor< Begin + 1, End >::exec( f, args... );
}
};
template< int End >
struct StaticFor< End, End >
struct StaticFor< End, End, true >
{
template< typename Function, typename... Args >
__cuda_callable__
static void exec( const Function& f, Args... args ){};
template< typename Function, typename... Args >
__cuda_callable__
static void exec( const Function& f, Args... args ) {}
};
template< int Begin, int End >
struct StaticFor< Begin, End, false >
{
static_assert( Begin <= End, "Wrong index interval for StaticFor. Begin must be less than or equal to end." );
template< typename Function, typename... Args >
__cuda_callable__
static void exec( const Function& f, Args... args )
{
for( int i = Begin; i < End; i++ )
f( i, args... );
}
};
} //namespace TNL
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment