有一种使用 cblas 函数的方法,虽然有点尴尬。
你需要做的是定义一个“全1”的向量,然后在这个向量和你的矩阵之间做一个点积,结果就是总和。
让myBlob 成为你想要对其元素求和的caffe Blob:
vector<Dtype> mult_data( myBlob.count(), Dtype(1) );
Dtype sum = caffe_cpu_dot( myBlob.count(), &mult_data[0], myBlob.cpu_data() );
这个技巧用在implementation of "Reduction" layer中。
要使这个答案同时符合 GPU,需要为mult_data 而不是std::vector 分配一个Blob(因为您需要它是pgu_data()):
vector<int> sum_mult_shape(1, diff_.count());
Blob<Dtype> sum_multiplier_(sum_mult_shape);
const Dtype* mult_data = sum_multiplier_.cpu_data();
Dtype sum = caffe_cpu_dot( myBlob.count(), &mult_data[0], myBlob.cpu_data() );
对于 GPU,(在 '.cu' 源文件中):
vector<int> sum_mult_shape(1, diff_.count());
Blob<Dtype> sum_multiplier_(sum_mult_shape);
const Dtype* mult_data = sum_multiplier_.gpu_data();
Dtype sum;
caffe_gpu_dot( myBlob.count(), &mult_data[0], myBlob.gpu_data(), &sum );