stub out GPU layer methods to crash loudly in CPU-only mode
authorEvan Shelhamer <shelhamer@imaginarynumber.net>
Mon, 30 Jun 2014 03:47:40 +0000 (20:47 -0700)
committerEvan Shelhamer <shelhamer@imaginarynumber.net>
Thu, 17 Jul 2014 09:57:09 +0000 (11:57 +0200)
28 files changed:
include/caffe/layer.hpp
include/caffe/util/cpu_only.hpp [new file with mode: 0644]
src/caffe/layers/bnll_layer.cpp
src/caffe/layers/concat_layer.cpp
src/caffe/layers/conv_layer.cpp
src/caffe/layers/data_layer.cpp
src/caffe/layers/dropout_layer.cpp
src/caffe/layers/eltwise_layer.cpp
src/caffe/layers/euclidean_loss_layer.cpp
src/caffe/layers/flatten_layer.cpp
src/caffe/layers/hdf5_data_layer.cpp
src/caffe/layers/hdf5_output_layer.cpp
src/caffe/layers/im2col_layer.cpp
src/caffe/layers/image_data_layer.cpp
src/caffe/layers/inner_product_layer.cpp
src/caffe/layers/lrn_layer.cpp
src/caffe/layers/pooling_layer.cpp
src/caffe/layers/power_layer.cpp
src/caffe/layers/relu_layer.cpp
src/caffe/layers/relu_layer.cu
src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp
src/caffe/layers/sigmoid_layer.cpp
src/caffe/layers/softmax_layer.cpp
src/caffe/layers/softmax_loss_layer.cpp
src/caffe/layers/split_layer.cpp
src/caffe/layers/tanh_layer.cpp
src/caffe/layers/threshold_layer.cpp
src/caffe/layers/window_data_layer.cpp

index d4d10aa..31689a4 100644 (file)
@@ -9,6 +9,7 @@
 #include "caffe/blob.hpp"
 #include "caffe/common.hpp"
 #include "caffe/proto/caffe.pb.h"
+#include "caffe/util/cpu_only.hpp"
 
 using std::string;
 using std::vector;
diff --git a/include/caffe/util/cpu_only.hpp b/include/caffe/util/cpu_only.hpp
new file mode 100644 (file)
index 0000000..1ae6ec9
--- /dev/null
@@ -0,0 +1,37 @@
+// Copyright 2014 BVLC and contributors.
+
+#ifndef CAFFE_UTIL_CPU_ONLY_H_
+#define CAFFE_UTIL_CPU_ONLY_H_
+
+#include <vector>
+
+#include "caffe/blob.hpp"
+#include "caffe/common.hpp"
+
+// For CPU-only Caffe, stub out GPU calls as unavailable.
+#ifdef CPU_ONLY
+
+#define NO_GPU LOG(FATAL) << "CPU-only Mode"
+
+#define STUB_GPU(classname) \
+template <typename Dtype> \
+Dtype classname<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, \
+    vector<Blob<Dtype>*>* top) { NO_GPU; } \
+template <typename Dtype> \
+void classname<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, \
+    const vector<bool>& propagate_down, \
+    vector<Blob<Dtype>*>* bottom) { NO_GPU; } \
+
+#define STUB_GPU_FORWARD(classname, funcname) \
+template <typename Dtype> \
+Dtype classname<Dtype>::funcname##_##gpu(const vector<Blob<Dtype>*>& bottom, \
+    vector<Blob<Dtype>*>* top) { NO_GPU; } \
+
+#define STUB_GPU_BACKWARD(classname, funcname) \
+template <typename Dtype> \
+void classname<Dtype>::funcname##_##gpu(const vector<Blob<Dtype>*>& top, \
+    const vector<bool>& propagate_down, \
+    vector<Blob<Dtype>*>* bottom) { NO_GPU; } \
+
+#endif  // CPU_ONLY
+#endif  // CAFFE_UTIL_CPU_ONLY_H_
index 95e6bd8..0e30b8a 100644 (file)
@@ -43,6 +43,9 @@ void BNLLLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(BNLLLayer);
+#endif
 
 INSTANTIATE_CLASS(BNLLLayer);
 
index 4c894dd..dd899a5 100644 (file)
@@ -100,6 +100,10 @@ void ConcatLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }  // concat_dim_ is guaranteed to be 0 or 1 by SetUp.
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(ConcatLayer);
+#endif
+
 INSTANTIATE_CLASS(ConcatLayer);
 
 }  // namespace caffe
index d7099e5..e8f08c7 100644 (file)
@@ -187,6 +187,10 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(ConvolutionLayer);
+#endif
+
 INSTANTIATE_CLASS(ConvolutionLayer);
 
 }  // namespace caffe
index 29c4fec..e9ec15c 100644 (file)
@@ -362,6 +362,10 @@ Dtype DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
   return Dtype(0.);
 }
 
+#ifdef CPU_ONLY
+STUB_GPU_FORWARD(DataLayer, Forward);
+#endif
+
 INSTANTIATE_CLASS(DataLayer);
 
 }  // namespace caffe
index a3501bf..a937297 100644 (file)
@@ -65,6 +65,10 @@ void DropoutLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
 }
 
 
+#ifdef CPU_ONLY
+STUB_GPU(DropoutLayer);
+#endif
+
 INSTANTIATE_CLASS(DropoutLayer);
 
 
index 2c265f6..44bad93 100644 (file)
@@ -94,6 +94,10 @@ void EltwiseLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(EltwiseLayer);
+#endif
+
 INSTANTIATE_CLASS(EltwiseLayer);
 
 
index 2478a51..43e9989 100644 (file)
@@ -52,6 +52,10 @@ void EuclideanLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(EuclideanLossLayer);
+#endif
+
 INSTANTIATE_CLASS(EuclideanLossLayer);
 
 }  // namespace caffe
index 9494da9..7e106d2 100644 (file)
@@ -33,6 +33,10 @@ void FlattenLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   (*bottom)[0]->ShareDiff(*top[0]);
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(FlattenLayer);
+#endif
+
 INSTANTIATE_CLASS(FlattenLayer);
 
 }  // namespace caffe
index 2ba7fa7..81cfdc0 100644 (file)
@@ -114,6 +114,10 @@ Dtype HDF5DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
   return Dtype(0.);
 }
 
+#ifdef CPU_ONLY
+STUB_GPU_FORWARD(HDF5DataLayer, Forward);
+#endif
+
 INSTANTIATE_CLASS(HDF5DataLayer);
 
 }  // namespace caffe
index 8307ad7..ffa240f 100644 (file)
@@ -69,6 +69,10 @@ void HDF5OutputLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   return;
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(HDF5OutputLayer);
+#endif
+
 INSTANTIATE_CLASS(HDF5OutputLayer);
 
 }  // namespace caffe
index e047dfb..2c86412 100644 (file)
@@ -47,6 +47,10 @@ void Im2colLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(Im2colLayer);
+#endif
+
 INSTANTIATE_CLASS(Im2colLayer);
 
 }  // namespace caffe
index 1f7368e..9d09d3c 100644 (file)
@@ -287,6 +287,10 @@ Dtype ImageDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
   return Dtype(0.);
 }
 
+#ifdef CPU_ONLY
+STUB_GPU_FORWARD(ImageDataLayer, Forward);
+#endif
+
 INSTANTIATE_CLASS(ImageDataLayer);
 
 }  // namespace caffe
index a92b56a..4da8578 100644 (file)
@@ -96,6 +96,10 @@ void InnerProductLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(InnerProductLayer);
+#endif
+
 INSTANTIATE_CLASS(InnerProductLayer);
 
 }  // namespace caffe
index 2bda043..0e2df2f 100644 (file)
@@ -256,6 +256,12 @@ void LRNLayer<Dtype>::WithinChannelBackward(
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(LRNLayer);
+STUB_GPU_FORWARD(LRNLayer, CrossChannelForward);
+STUB_GPU_BACKWARD(LRNLayer, CrossChannelBackward);
+#endif
+
 INSTANTIATE_CLASS(LRNLayer);
 
 
index 9151ff2..d6fef07 100644 (file)
@@ -296,6 +296,10 @@ void PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
 }
 
 
+#ifdef CPU_ONLY
+STUB_GPU(PoolingLayer);
+#endif
+
 INSTANTIATE_CLASS(PoolingLayer);
 
 
index 5ff3392..4607457 100644 (file)
@@ -99,6 +99,10 @@ void PowerLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(PowerLayer);
+#endif
+
 INSTANTIATE_CLASS(PowerLayer);
 
 
index d7a8509..6d60174 100644 (file)
@@ -38,6 +38,10 @@ void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
 }
 
 
+#ifdef CPU_ONLY
+STUB_GPU(ReLULayer);
+#endif
+
 INSTANTIATE_CLASS(ReLULayer);
 
 
index a5b24af..2ad6891 100644 (file)
@@ -59,6 +59,7 @@ void ReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+
 INSTANTIATE_CLASS(ReLULayer);
 
 
index 8cb830f..074fa6c 100644 (file)
@@ -68,6 +68,10 @@ void SigmoidCrossEntropyLossLayer<Dtype>::Backward_cpu(
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(SigmoidCrossEntropyLossLayer);
+#endif
+
 INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer);
 
 
index 50139d8..e25db04 100644 (file)
@@ -42,6 +42,10 @@ void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(SigmoidLayer);
+#endif
+
 INSTANTIATE_CLASS(SigmoidLayer);
 
 
index 5d60d9d..665cfae 100644 (file)
@@ -82,6 +82,10 @@ void SoftmaxLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
 }
 
 
+#ifdef CPU_ONLY
+STUB_GPU(SoftmaxLayer);
+#endif
+
 INSTANTIATE_CLASS(SoftmaxLayer);
 
 
index 37c5ebc..c87270e 100644 (file)
@@ -79,6 +79,10 @@ void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
 }
 
 
+#ifdef CPU_ONLY
+STUB_GPU(SoftmaxWithLossLayer);
+#endif
+
 INSTANTIATE_CLASS(SoftmaxWithLossLayer);
 
 
index 28abd95..6bae4ef 100644 (file)
@@ -50,6 +50,10 @@ void SplitLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
 }
 
 
+#ifdef CPU_ONLY
+STUB_GPU(SplitLayer);
+#endif
+
 INSTANTIATE_CLASS(SplitLayer);
 
 }  // namespace caffe
index 6b5166d..0a6ec68 100644 (file)
@@ -41,6 +41,10 @@ void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
   }
 }
 
+#ifdef CPU_ONLY
+STUB_GPU(TanHLayer);
+#endif
+
 INSTANTIATE_CLASS(TanHLayer);
 
 }  // namespace caffe
index e6ed8a6..2c8546c 100644 (file)
@@ -27,6 +27,10 @@ Dtype ThresholdLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
   return Dtype(0);
 }
 
+#ifdef CPU_ONLY
+STUB_GPU_FORWARD(ThresholdLayer, Forward);
+#endif
+
 INSTANTIATE_CLASS(ThresholdLayer);
 
 }  // namespace caffe
index 5dbdff3..51e0dc0 100644 (file)
@@ -453,6 +453,10 @@ Dtype WindowDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
   return Dtype(0.);
 }
 
+#ifdef CPU_ONLY
+STUB_GPU_FORWARD(WindowDataLayer, Forward);
+#endif
+
 INSTANTIATE_CLASS(WindowDataLayer);
 
 }  // namespace caffe