Newer
Older
/***************************************************************************
tnlCuda.h - description
-------------------
begin : Nov 7, 2012
copyright : (C) 2012 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 TNLCUDA_H_
#define TNLCUDA_H_
#include <core/tnlDevice.h>
#include <core/tnlString.h>
#include <core/tnlAssert.h>
class tnlConfigDescription;
class tnlParameterContainer;
#ifdef HAVE_CUDA
#define __cuda_callable__ __device__ __host__
#else
#define __cuda_callable__
#endif
class tnlCuda
{
public:
enum { DeviceType = tnlCudaDevice };
static tnlString getDeviceType();
__cuda_callable__ static inline tnlDeviceEnum getDevice();
__cuda_callable__ static inline int getMaxGridSize();
__cuda_callable__ static inline int getMaxBlockSize();
__cuda_callable__ static inline int getWarpSize();
template< typename Index >
__device__ static Index getGlobalThreadIdx( const Index gridIdx = 0 );
#endif
__cuda_callable__ static inline int getNumberOfSharedMemoryBanks();
static int getGPUTransferBufferSize();
static int getNumberOfBlocks( const int threads,
const int blockSize );
static int getNumberOfGrids( const int blocks,
const int gridSize = getMaxGridSize() );
template< typename ObjectType >
static ObjectType* passToDevice( const ObjectType& object );
template< typename ObjectType >
static ObjectType passFromDevice( const ObjectType* object );
template< typename ObjectType >
static void passFromDevice( const ObjectType* deviceObject,
template< typename ObjectType >
static void freeFromDevice( ObjectType* object );
template< typename ObjectType >
static void print( const ObjectType* object, ostream& str = std::cout );
#ifdef HAVE_CUDA
template< typename Index >
static __device__ Index getInterleaving( const Index index );
#endif
static bool checkDevice( const char* file_name, int line );
#else
static bool checkDevice( const char* file_name, int line ) { return false;};
#endif
static void configSetup( tnlConfigDescription& config, const tnlString& prefix = "" );
static bool setup( const tnlParameterContainer& parameters,
const tnlString& prefix = "" );
#define checkCudaDevice tnlCuda::checkDevice( __FILE__, __LINE__ )
#define tnlCudaSupportMissingMessage \
std::cerr << "The CUDA support is missing in the source file " << __FILE__ << " at line " << __LINE__ << ". Please set WITH_CUDA=yes in the install script. " << std::endl;
// TODO: This would be nice in tnlCuda but C++ standard does not allow it.
#ifdef HAVE_CUDA
template< typename Element >
struct getSharedMemory
{
__device__ operator Element*();
};
template<>
struct getSharedMemory< double >
{
inline __device__ operator double*();
};
template<>
struct getSharedMemory< long int >
{
inline __device__ operator long int*();
};
#endif
#include <core/tnlCuda_impl.h>
#endif /* TNLCUDA_H_ */