00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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_cuda();
00047
00050 bool copy_to_cudaro() const;
00051
00054 bool copy_from_device(const bool rocpy = false);
00055
00058 bool copy_rw_to_ro() const;
00059
00062 void elementaccessed() const;
00063
00066 void bindcudaarrayA(const bool intp_mode) const;
00067
00070 void unbindcudaarryA() const;
00071
00074 void bindcudaarrayB(const bool intp_mode) const;
00075
00078 void unbindcudaarryB() const;
00079
00082 void runcuda(float * results) const;
00083
00087 bool isrodataongpu() const;
00088
00089 inline void roneedsanupdate()
00090 {
00091
00092 roneedsupdate = true;
00093 }
00094
00096 static void usemempool(int size);
00097
00099 static void freemempool();
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 static void switchoncuda();
00131
00132 static void switchoffcuda();
00133
00134 static void cuda_cleanup();
00135
00136 static void cuda_initialize();
00137
00138
00139 mutable float* cudarwdata;
00140 mutable cudaArray* cudarodata;
00141
00142 mutable size_t num_bytes;
00143
00144
00145 const mutable EMData* nextlistitem;
00146 const mutable EMData* prevlistitem;
00147
00148 mutable bool roneedsupdate;
00149
00150 static int memused;
00151 static int fudgemem;
00152 const static EMData* firstinlist;
00153 const static EMData* lastinlist;
00154 static bool usecuda;
00155
00156
00157 static float* mempool[MEMPOOL_SIZE];
00158 static int mempoolused;
00159 static int mempoolarraysize;
00160 static bool usemempoolswitch;
00161
00162 #endif // EMAN2_USING_CUDA
00163
00164 #endif //eman__emdatacuda_h__ 1
00165