1 // Copyright 2013 Yangqing Jia
3 #include "caffe/common.hpp"
5 namespace caffe {
7 shared_ptr<Caffe> Caffe::singleton_;
9 Caffe::Caffe()
10 : mode_(Caffe::CPU), phase_(Caffe::TRAIN) {
11 CUBLAS_CHECK(cublasCreate(&cublas_handle_));
12 CURAND_CHECK(curandCreateGenerator(&curand_generator_,
13 CURAND_RNG_PSEUDO_DEFAULT));
14 CURAND_CHECK(curandSetPseudoRandomGeneratorSeed(curand_generator_,
15 1701ULL));
16 VSL_CHECK(vslNewStream(&vsl_stream_, VSL_BRNG_MT19937, 1701));
17 }
19 Caffe::~Caffe() {
20 if (!cublas_handle_) CUBLAS_CHECK(cublasDestroy(cublas_handle_));
21 if (!curand_generator_) {
22 CURAND_CHECK(curandDestroyGenerator(curand_generator_));
23 }
24 if (!vsl_stream_) VSL_CHECK(vslDeleteStream(&vsl_stream_));
25 };
27 Caffe& Caffe::Get() {
28 if (!singleton_) {
29 singleton_.reset(new Caffe());
30 }
31 return *singleton_;
32 };
34 VSLStreamStatePtr Caffe::vsl_stream() {
35 return Get().vsl_stream_;
36 }
38 cublasHandle_t Caffe::cublas_handle() {
39 return Get().cublas_handle_;
40 };
42 curandGenerator_t Caffe::curand_generator() {
43 return Get().curand_generator_;
44 };
46 Caffe::Brew Caffe::mode() {
47 return Get().mode_;
48 }
50 void Caffe::set_mode(Caffe::Brew mode) {
51 Get().mode_ = mode;
52 }
54 Caffe::Phase Caffe::phase() {
55 return Get().phase_;
56 }
58 void Caffe::set_phase(Caffe::Phase phase) {
59 Get().phase_ = phase;
60 }
62 void Caffe::set_random_seed(const unsigned int seed) {
63 // Curand seed
64 // Yangqing's note: simply setting the generator seed does not seem to
65 // work on the tesla K20s, so I wrote the ugly reset thing below. It is not
66 // tested yet and I'll wait til Jeff finishes training.
67 CURAND_CHECK(curandDestroyGenerator(curand_generator()));
68 CURAND_CHECK(curandCreateGenerator(&Get().curand_generator_,
69 CURAND_RNG_PSEUDO_DEFAULT));
70 CURAND_CHECK(curandSetPseudoRandomGeneratorSeed(curand_generator(),
71 seed));
72 // VSL seed
73 VSL_CHECK(vslDeleteStream(&(Get().vsl_stream_)));
74 VSL_CHECK(vslNewStream(&(Get().vsl_stream_), VSL_BRNG_MT19937, seed));
75 }
77 } // namespace caffe