Newer
Older
/***************************************************************************
tnlTraversal_Grid2D_impl.h - description
-------------------
begin : Jul 29, 2014
copyright : (C) 2014 by Tomas Oberhuber
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef TNLTRAVERSAL_GRID2D_IMPL_H_
#define TNLTRAVERSAL_GRID2D_IMPL_H_
template< typename Real,
typename Index >
template< typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlHost, Index >, 2 >::
Tomáš Oberhuber
committed
processBoundaryEntities( const GridType& grid,
UserData& userData ) const
Tomáš Oberhuber
committed
* Boundary conditions
CoordinatesType coordinates;
const IndexType& xSize = grid.getDimensions().x();
const IndexType& ySize = grid.getDimensions().y();
for( coordinates.x() = 0; coordinates.x() < xSize; coordinates.x() ++ )
{
coordinates.y() = 0;
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( grid, userData, grid.getCellIndex( coordinates ), coordinates );
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( grid, userData, grid.getCellIndex( coordinates ), coordinates );
}
for( coordinates.y() = 1; coordinates.y() < ySize - 1; coordinates.y() ++ )
{
coordinates.x() = 0;
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( grid, userData, grid.getCellIndex( coordinates ), coordinates );
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( grid, userData, grid.getCellIndex( coordinates ), coordinates );
Tomáš Oberhuber
committed
}
Tomáš Oberhuber
committed
template< typename Real,
typename Index >
template< typename UserData,
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlHost, Index >, 2 >::
processInteriorEntities( const GridType& grid,
UserData& userData ) const
{
Tomáš Oberhuber
committed
CoordinatesType coordinates;
const IndexType& xSize = grid.getDimensions().x();
const IndexType& ySize = grid.getDimensions().y();
#ifdef HAVE_OPENMP
//#pragma omp parallel for
#endif
for( coordinates.y() = 1; coordinates.y() < ySize - 1; coordinates.y() ++ )
for( coordinates.x() = 1; coordinates.x() < xSize - 1; coordinates.x() ++ )
{
const IndexType index = grid.getCellIndex( coordinates );
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( grid, userData, index, coordinates );
}
template< typename Real,
typename Index >
template< typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlHost, Index >, 1 >::
processBoundaryEntities( const GridType& grid,
UserData& userData ) const
{
/****
* Traversing boundary faces
*/
}
template< typename Real,
typename Index >
template< typename UserData,
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlHost, Index >, 1 >::
Tomáš Oberhuber
committed
processInteriorEntities( const GridType& grid,
UserData& userData ) const
Tomáš Oberhuber
committed
* Traversing interior faces
Tomáš Oberhuber
committed
template< typename Real,
typename Index >
template< typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlHost, Index >, 0 >::
Tomáš Oberhuber
committed
processBoundaryEntities( const GridType& grid,
UserData& userData ) const
Tomáš Oberhuber
committed
* Traversing boundary vertices
Tomáš Oberhuber
committed
template< typename Real,
typename Index >
template< typename UserData,
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlHost, Index >, 0 >::
processInteriorEntities( const GridType& grid,
UserData& userData ) const
{
/****
* Traversing interior vertices
*/
}
/***
*
* CUDA Specializations
*
*/
#ifdef HAVE_CUDA
template< typename Real,
typename Index,
typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
__global__ void tnlTraversalGrid2DBoundaryCells( const tnlGrid< 2, Real, tnlCuda, Index >* grid,
UserData* userData,
const Index gridXIdx,
const Index gridYIdx )
{
typedef Real RealType;
typedef Index IndexType;
typedef tnlGrid< 2, Real, tnlCuda, Index > GridType;
typedef typename GridType::CoordinatesType CoordinatesType;
const IndexType& xSize = grid->getDimensions().x();
const IndexType& ySize = grid->getDimensions().y();
CoordinatesType cellCoordinates( ( gridXIdx * tnlCuda::getMaxGridSize() + blockIdx.x ) * blockDim.x + threadIdx.x,
( gridYIdx * tnlCuda::getMaxGridSize() + blockIdx.y ) * blockDim.y + threadIdx.y );
if( cellCoordinates.x() < grid->getDimensions().x() &&
cellCoordinates.y() < grid->getDimensions().y() )
{
if( grid->isBoundaryCell( cellCoordinates ) )
{
//printf( "Processing boundary conditions at %d %d \n", cellCoordinates.x(), cellCoordinates.y() );
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( *grid,
*userData,
grid->getCellIndex( cellCoordinates ),
cellCoordinates );
}
}
}
template< typename Real,
typename Index,
typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
__global__ void tnlTraversalGrid2DInteriorCells( const tnlGrid< 2, Real, tnlCuda, Index >* grid,
UserData* userData,
const Index gridXIdx,
const Index gridYIdx )
{
typedef Real RealType;
typedef Index IndexType;
typedef tnlGrid< 2, Real, tnlCuda, Index > GridType;
typedef typename GridType::CoordinatesType CoordinatesType;
const IndexType& xSize = grid->getDimensions().x();
const IndexType& ySize = grid->getDimensions().y();
CoordinatesType cellCoordinates( ( gridXIdx * tnlCuda::getMaxGridSize() + blockIdx.x ) * blockDim.x + threadIdx.x,
( gridYIdx * tnlCuda::getMaxGridSize() + blockIdx.y ) * blockDim.y + threadIdx.y );
if( cellCoordinates.x() < grid->getDimensions().x() &&
cellCoordinates.y() < grid->getDimensions().y() )
{
if( ! grid->isBoundaryCell( cellCoordinates ) )
{
//printf( "Processing interior conditions at %d %d \n", cellCoordinates.x(), cellCoordinates.y() );
Tomáš Oberhuber
committed
EntitiesProcessor::processCell( *grid,
*userData,
grid->getCellIndex( cellCoordinates ),
cellCoordinates );
}
}
}
#endif
template< typename Real,
typename Index >
template< typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlCuda, Index >, 2 >::
Tomáš Oberhuber
committed
processBoundaryEntities( const GridType& grid,
UserData& userData ) const
Tomáš Oberhuber
committed
#ifdef HAVE_CUDA
Tomáš Oberhuber
committed
* Boundary conditions
GridType* kernelGrid = tnlCuda::passToDevice( grid );
UserData* kernelUserData = tnlCuda::passToDevice( userData );
dim3 cudaBlockSize( 16, 16 );
dim3 cudaBlocks;
cudaBlocks.x = tnlCuda::getNumberOfBlocks( grid.getDimensions().x(), cudaBlockSize.x );
cudaBlocks.y = tnlCuda::getNumberOfBlocks( grid.getDimensions().y(), cudaBlockSize.y );
const IndexType cudaXGrids = tnlCuda::getNumberOfGrids( cudaBlocks.x );
const IndexType cudaYGrids = tnlCuda::getNumberOfGrids( cudaBlocks.y );
for( IndexType gridXIdx = 0; gridXIdx < cudaXGrids; gridXIdx ++ )
for( IndexType gridYIdx = 0; gridYIdx < cudaYGrids; gridYIdx ++ )
{
Tomáš Oberhuber
committed
tnlTraversalGrid2DBoundaryCells< Real, Index, UserData, EntitiesProcessor >
<<< cudaBlocks, cudaBlockSize >>>
( kernelGrid,
kernelUserData,
gridXIdx,
gridYIdx );
}
cudaThreadSynchronize();
checkCudaDevice;
Tomáš Oberhuber
committed
#endif
}
Tomáš Oberhuber
committed
template< typename Real,
typename Index >
template< typename UserData,
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlCuda, Index >, 2 >::
processInteriorEntities( const GridType& grid,
UserData& userData ) const
{
#ifdef HAVE_CUDA
/****
* Interior cells
*/
Tomáš Oberhuber
committed
GridType* kernelGrid = tnlCuda::passToDevice( grid );
UserData* kernelUserData = tnlCuda::passToDevice( userData );
dim3 cudaBlockSize( 16, 16 );
dim3 cudaBlocks;
cudaBlocks.x = tnlCuda::getNumberOfBlocks( grid.getDimensions().x(), cudaBlockSize.x );
cudaBlocks.y = tnlCuda::getNumberOfBlocks( grid.getDimensions().y(), cudaBlockSize.y );
const IndexType cudaXGrids = tnlCuda::getNumberOfGrids( cudaBlocks.x );
const IndexType cudaYGrids = tnlCuda::getNumberOfGrids( cudaBlocks.y );
for( IndexType gridXIdx = 0; gridXIdx < cudaXGrids; gridXIdx ++ )
for( IndexType gridYIdx = 0; gridYIdx < cudaYGrids; gridYIdx ++ )
{
Tomáš Oberhuber
committed
tnlTraversalGrid2DInteriorCells< Real, Index, UserData, EntitiesProcessor >
<<< cudaBlocks, cudaBlockSize >>>
( kernelGrid,
kernelUserData,
gridXIdx,
gridYIdx );
}
checkCudaDevice;
tnlCuda::freeFromDevice( kernelGrid );
tnlCuda::freeFromDevice( kernelUserData );
#endif
}
template< typename Real,
typename Index >
template< typename UserData,
Tomáš Oberhuber
committed
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlCuda, Index >, 1 >::
Tomáš Oberhuber
committed
processBoundaryEntities( const GridType& grid,
UserData& userData ) const
Tomáš Oberhuber
committed
* Traversing boundary faces
*/
}
template< typename Real,
typename Index >
template< typename UserData,
Tomáš Oberhuber
committed
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlCuda, Index >, 1 >::
processInteriorEntities( const GridType& grid,
UserData& userData ) const
{
/****
* Traversing interior faces
*/
}
template< typename Real,
typename Index >
template< typename UserData,
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlCuda, Index >, 0 >::
processBoundaryEntities( const GridType& grid,
UserData& userData ) const
{
/****
* Boundary interior vertices
*/
}
template< typename Real,
typename Index >
template< typename UserData,
typename EntitiesProcessor >
void
tnlTraversal< tnlGrid< 2, Real, tnlCuda, Index >, 0 >::
Tomáš Oberhuber
committed
processInteriorEntities( const GridType& grid,
UserData& userData ) const
Tomáš Oberhuber
committed
* Traversing interior vertices
*/
}
#endif /* TNLTRAVERSAL_GRID2D_IMPL_H_ */