结构:caffe命名空间中包含两个inline函数和类SyncedMemory的声明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #ifndef CAFFE_SYNCEDMEM_HPP_ #define CAFFE_SYNCEDMEM_HPP_
#include <cstdlib>
#ifdef USE_MKL #include "mkl.h" #endif
#include "caffe/common.hpp"
namespace caffe {
inline void CaffeMallocHost(void** ptr, size_t size, bool* use_cuda) { #ifndef CPU_ONLY if (Caffe::mode() == Caffe::GPU) { CUDA_CHECK(cudaMallocHost(ptr, size)); *use_cuda = true; return; } #endif #ifdef USE_MKL *ptr = mkl_malloc(size ? size:1, 64); #else *ptr = malloc(size); #endif *use_cuda = false; CHECK(*ptr) << "host allocation of size " << size << " failed"; }
inline void CaffeFreeHost(void* ptr, bool use_cuda) { #ifndef CPU_ONLY if (use_cuda) { CUDA_CHECK(cudaFreeHost(ptr)); return; } #endif #ifdef USE_MKL mkl_free(ptr); #else free(ptr); #endif }
class SyncedMemory { public: SyncedMemory(); explicit SyncedMemory(size_t size); ~SyncedMemory(); const void* cpu_data(); const void* gpu_data(); void set_cpu_data(void* data); void set_gpu_data(void* data); void* mutable_cpu_data(); void* mutable_gpu_data(); enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED }; SyncedHead head() const { return head_; } size_t size() const { return size_; }
#ifndef CPU_ONLY void async_gpu_push(const cudaStream_t& stream); #endif
private: void check_device();
void to_cpu(); void to_gpu(); void* cpu_ptr_; void* gpu_ptr_; size_t size_; SyncedHead head_; bool own_cpu_data_; bool cpu_malloc_use_cuda_; bool own_gpu_data_; int device_;
DISABLE_COPY_AND_ASSIGN(SyncedMemory); };
}
#endif
|
补充,条件编译预编译指令
#define
#undef
#if
#ifdef
#ifndef
#elif
#else
#endif
defined
:与#if, #elif配合使用,判断某个宏是否被定义
宏USE_MKL
的定义在文件include/caffe/util/mkl_alternate.hpp
中。
宏CPU_ONLY
的定义在文件``?????