Skip to content
Snippets Groups Projects
Cuda.cpp 2.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • /***************************************************************************
    
                              Cuda.cpp  -  description
    
                                 -------------------
        begin                : Jul 11, 2013
        copyright            : (C) 2013 by Tomas Oberhuber
        email                : tomas.oberhuber@fjfi.cvut.cz
     ***************************************************************************/
    
    
    /* See Copyright Notice in tnl/Copyright */
    
    #include <TNL/Devices/Cuda.h>
    
    #include <TNL/tnlConfig.h>
    
    #include <TNL/Config/ConfigDescription.h>
    #include <TNL/Config/ParameterContainer.h>
    
    #include <TNL/Devices/CudaDeviceInfo.h>
    
    namespace TNL {
    
    namespace Devices {
    
    
    SmartPointersRegister Cuda::smartPointersRegister;
    
    Timer Cuda::smartPointersSynchronizationTimer;
    
    String Cuda::getDeviceType()
    
       return String( "Devices::Cuda" );
    
    int Cuda::getNumberOfBlocks( const int threads,
    
    {
       return roundUpDivision( threads, blockSize );
    }
    
    
    int Cuda::getNumberOfGrids( const int blocks,
    
    {
       return roundUpDivision( blocks, gridSize );
    }
    
    
    void Cuda::configSetup( Config::ConfigDescription& config,
                            const String& prefix )
    
    // FIXME: HAVE_CUDA is never defined in .cpp files
    
    #ifdef HAVE_CUDA
    
       config.addEntry< int >( prefix + "cuda-device", "Choose CUDA device to run the computation.", 0 );
    
    #else
    
       config.addEntry< int >( prefix + "cuda-device", "Choose CUDA device to run the computation (not supported on this system).", 0 );
    
    bool Cuda::setup( const Config::ParameterContainer& parameters,
    
    // FIXME: HAVE_CUDA is never defined in .cpp files
    
    #ifdef HAVE_CUDA
    
       int cudaDevice = parameters.getParameter< int >( prefix + "cuda-device" );
    
       if( cudaSetDevice( cudaDevice ) != cudaSuccess )
       {
          std::cerr << "I cannot activate CUDA device number " << cudaDevice << "." << std::endl;
          return false;
       }
    
       smartPointersSynchronizationTimer.reset();
       smartPointersSynchronizationTimer.stop();
    
       return true;
    }
    
    
    void Cuda::insertSmartPointer( SmartPointer* pointer )
    
       smartPointersRegister.insert( pointer, Devices::CudaDeviceInfo::getActiveDevice() );
    
    void Cuda::removeSmartPointer( SmartPointer* pointer )
    
       smartPointersRegister.remove( pointer, Devices::CudaDeviceInfo::getActiveDevice() );
    
    bool Cuda::synchronizeDevice( int deviceId )
    {
    
    #ifdef HAVE_CUDA_UNIFIED_MEMORY
       return true;
    #else
    
       if( deviceId < 0 )
          deviceId = Devices::CudaDeviceInfo::getActiveDevice();
    
       smartPointersSynchronizationTimer.start();
       bool b = smartPointersRegister.synchronizeDevice( deviceId );
       smartPointersSynchronizationTimer.stop();
       return b;
    
    } // namespace Devices
    
    } // namespace TNL