Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

emdata_cuda.h

Go to the documentation of this file.
00001 /*
00002  * Author: Steven Ludtke, 04/10/2003 (sludtke@bcm.edu)
00003  * Copyright (c) 2000-2006 Baylor College of Medicine
00004  *
00005  * This software is issued under a joint BSD/GNU license. You may use the
00006  * source code in this file under either license. However, note that the
00007  * complete EMAN2 and SPARX software packages have some GPL dependencies,
00008  * so you are responsible for compliance with the licenses of these packages
00009  * if you opt to use BSD licensing. The warranty disclaimer below holds
00010  * in either instance.
00011  *
00012  * This complete copyright notice must be included in any revised version of the
00013  * source code. Additional authorship citations may be added, but existing
00014  * author citations must be preserved.
00015  *
00016  * This program is free software; you can redistribute it and/or modify
00017  * it under the terms of the GNU General Public License as published by
00018  * the Free Software Foundation; either version 2 of the License, or
00019  * (at your option) any later version.
00020  *
00021  * This program is distributed in the hope that it will be useful,
00022  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00023  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00024  * GNU General Public License for more details.
00025  *
00026  * You should have received a copy of the GNU General Public License
00027  * along with this program; if not, write to the Free Software
00028  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
00029  *
00030  * */
00031 
00032 #ifndef eman__emdatacuda_h__
00033 #define eman__emdatacuda_h__ 1
00034 
00035 #ifdef EMAN2_USING_CUDA
00036 
00037 #define MEMPOOL_SIZE 10
00038 public:
00039         
00042         bool copy_to_cuda() const;
00043         
00046         bool copy_to_cudaro() const;
00047         
00050         bool copy_from_device(const bool rocpy = false);
00051         
00054         bool copy_rw_to_ro() const; //we are not changing any of the CPU data!!!
00055         
00058         void elementaccessed() const;
00059         
00062         void bindcudaarrayA(const bool intp_mode) const;
00063         
00066         void unbindcudaarryA() const;
00067         
00070         void bindcudaarrayB(const bool intp_mode) const;
00071         
00074         void unbindcudaarryB() const;
00075         
00078         void runcuda(float * results) const;
00079         
00083         bool isrodataongpu() const;
00084         
00085         inline  void roneedsanupdate()
00086         {
00087                 roneedsupdate = true;
00088         }
00089 
00090         inline float* getcudarwdata() const
00091         {
00092                 if(cudarwdata != 0) elementaccessed();
00093                 return cudarwdata;
00094         }
00095         
00096         inline cudaArray* getcudarodata() const
00097         {
00098                 if(cudarodata != 0) elementaccessed();
00099                 return cudarodata;
00100         }
00101         
00104         bool rw_alloc() const;
00105         
00108         bool ro_alloc() const;
00109         
00112         void rw_free() const;
00113         
00116         void ro_free() const;
00117         
00120         void addtolist() const;
00121         
00124         void removefromlist() const;
00125         
00128         bool freeup_devicemem(const int& num_bytes) const;
00129         
00130         void setdirtybit() const;
00131         
00132         static void switchoncuda();
00133         
00134         static void switchoffcuda();
00135         
00136         static void cuda_cleanup();
00137         
00138         static bool cuda_initialize();
00139         
00140         static bool usecuda;
00141         
00142         static const char* getcudalock();
00143 
00144 private:
00145         //pointers to cuda data
00146         mutable float* cudarwdata;      //we can still change GPU data on a cost object
00147         mutable cudaArray* cudarodata;  //we can still change GPU data on a cost object
00148         
00149         mutable size_t num_bytes;
00150         
00151         //pointers used in doubly limked list
00152         const mutable EMData* nextlistitem;
00153         const mutable EMData* prevlistitem;
00154         
00155         mutable bool roneedsupdate;
00156         mutable bool cudadirtybit;
00157         
00158         static int cudadevicenum;
00159         static int memused;
00160         static int fudgemem;
00161         const static EMData* firstinlist;
00162         const static EMData* lastinlist;
00163         static bool nocudainit;
00164         
00165 #endif // EMAN2_USING_CUDA      
00166 
00167 #endif //eman__emdatacuda_h__ 1
00168 

Generated on Tue Jun 11 13:40:37 2013 for EMAN2 by  doxygen 1.3.9.1